วิธีตรวจจับการคลิกภายนอกส่วนประกอบการทำงานของ React

ฉันต้องการตรวจจับการคลิกภายนอกส่วนประกอบ การทำงาน ของ React

จากนั้นฉันก็พบบทความต่อไปนี้และนำโค้ดไปใช้ตามนั้น

ตรวจจับการคลิกภายนอกส่วนประกอบ React

แต่รหัสของฉันใช้งานไม่ได้ ฉันเข้าใจสาเหตุแต่ไม่รู้วิธีแก้ไข

import React from 'react';
import Foo from 'foo'; // <- Functional component in the node_modules

export default class extends React.PureComponent {
  private readonly refRoot = React.createRef();
  public componentDidMount() {
    document.addEventListener('click', this.clickOutside);
  }
  public componentWillUnmount() {
    document.removeEventListener('click', this.clickOutside);
  }
  private clickOutside(ev: MouseEvent) {
    if (refRoot.current.contains(ev.target)) {
      console.log('clicked outside.');
    }
  }
  public render(){
    return (
      <Foo ref={this.refRoot}> // <- Doubt.
        ...
      </Foo>
    );
  }
}

เนื่องจาก ไม่สามารถใช้แอตทริบิวต์ ref ในส่วนประกอบของฟังก์ชันได้< /ก>.

อาจสามารถแก้ไขได้ด้วยการใส่องค์ประกอบ div แต่ฉันต้องการหลีกเลี่ยงไม่ให้ชั้นของ DOM ซับซ้อนอีกต่อไปเมื่อแสดงผลเป็น HTML

คุณมีความคิดอะไรบ้าง?


person kurone-kito    schedule 25.01.2019    source แหล่งที่มา
comment
หากฉันเข้าใจคำถามอย่างถูกต้อง ให้พิจารณาการอ้างอิงการส่งต่อ... reactjs.org/docs/forwarding-refs .html   -  person SakoBu    schedule 25.01.2019
comment
คุณต้องการส่งต่อการอ้างอิงไปยังองค์ประกอบ Foo - ในกรณีนี้ให้ใช้ชื่ออื่นสำหรับเสา ตัวอย่างเช่น <Foo refParam={this.refRoot}> จากนั้นภายใน Foo แนบ refParam เข้ากับองค์ประกอบ dom <div ref={props.refParam}>   -  person Ben Carp    schedule 18.06.2019


คำตอบ (2)


หากคุณต้องการใช้การอ้างอิงภายในองค์ประกอบการทำงาน แทนที่จะส่งผ่านจากพาเรนต์ คุณสามารถใช้ React hooks API ได้ https://reactjs.org/docs/hooks-reference.html#useref

กรุณาตรวจสอบด้านบนครับ ^^

person TJcobra    schedule 25.01.2019
comment
สุดยอด! ขอบคุณสำหรับคำตอบ. ฉันสนใจ React Hooks มาก ดังนั้นฉันจึงลองอัปเกรดจาก v16.7.0 เป็น v16.8.0-alpha.1 แต่ useRef คือ undefined อืม:/ - person kurone-kito; 28.01.2019

แนวคิดในการสร้างการอ้างอิงองค์ประกอบ DOM ที่แสดงผลภายใน Foo ซึ่งคุณสามารถทำได้โดยส่งผ่านเป็นอุปกรณ์ประกอบฉากซึ่งสามารถใช้ใน Foo

  <Foo innerRef={this.refRoot}> 
    ...
  </Foo>

ภายในฟู:

const Foo = (props) => {
   return <div ref={props.innerRef}>{/* data here */}</div>
}

หรือคุณสามารถใช้ React.forwardRef เพื่อส่งต่อ Foos ref ไปยังลูก ๆ ของมัน

const Foo = React.forwardRef(props, ref) => {
   return <div ref={ref}>{/* data here */}</div>
}

พ่อแม่

public render(){
    return (
      <Foo ref={this.refRoot}> // <- Doubt.
        ...
      </Foo>
    );
  }
person Shubham Khatri    schedule 25.01.2019
comment
ขอบคุณสำหรับคำตอบ. องค์ประกอบ Foo อยู่ใน node_modules และไม่สามารถแก้ไขได้ หลีกเลี่ยงไม่ได้ที่การเพิ่มองค์ประกอบจำลอง div และล้อมมันเพื่อรับ ref - person kurone-kito; 28.01.2019
comment
หาก Foo อยู่ใน node_modules คุณสามารถค้นหาในเอกสารไลบรารีว่าพวกเขาอนุญาตให้อ้างอิงแบบกำหนดเองไปยังส่วนประกอบโดยใช้ prop ใด ๆ หรือไม่ หากไม่ใช่คุณจะต้องเพิ่ม div - person Shubham Khatri; 28.01.2019
comment
ดูเหมือนว่าส่วนประกอบไม่อนุญาตแบบกำหนดเอง ref อืม ฉันยอมแพ้แล้วปิดท้ายภายใน div ดูเหมือนว่าจะใช้งานง่ายโดยใช้ airbnb/react-outside-click-handler ขอบคุณที่คิดวิธีแก้ปัญหาดีๆ - person kurone-kito; 28.01.2019