ค่าของการใช้ React.forwardRef กับ prop ref แบบกำหนดเอง


13

ฉันเห็นว่า React.forwardRef น่าจะเป็นวิธีที่ถูกทำนองคลองธรรมในการผ่านการอ้างอิงไปยังองค์ประกอบการทำงานของเด็กจากเอกสารตอบสนอง:

const FancyButton = React.forwardRef((props, ref) => (
  <button ref={ref} className="FancyButton">
    {props.children}
  </button>
));

// You can now get a ref directly to the DOM button:
const ref = React.createRef();
<FancyButton ref={ref}>Click me!</FancyButton>;

อย่างไรก็ตามข้อดีของการทำเช่นนี้คือเพียงแค่ผ่านเสาที่กำหนดเอง:

const FancyButton = ({ innerRef }) => (
  <button ref={innerRef} className="FancyButton">
    {props.children}
  </button>
));

const ref = React.createRef();
<FancyButton innerRef={ref}>Click me!</FancyButton>;

ข้อได้เปรียบอย่างเดียวที่ฉันคิดได้ก็คืออาจมี API ที่สอดคล้องกันสำหรับการอ้างอิง แต่มีข้อได้เปรียบอื่นอีกหรือไม่? การส่งเสาที่กำหนดเองมีผลต่อการกระจายและทำให้เกิดการแสดงผลเพิ่มขึ้นหรือไม่แน่นอนว่าการอ้างอิงนั้นถูกเก็บไว้เป็นสถานะที่ไม่แน่นอนในcurrentสนาม

พูดเช่นคุณต้องการส่งการอ้างอิงหลายรายการ (ซึ่ง tbh ซึ่งอาจบ่งบอกถึงกลิ่นรหัส แต่ยังคง) จากนั้นทางออกเดียวที่ฉันเห็นคือการใช้อุปกรณ์ประกอบฉาก customRef

ฉันเดาคำถามของฉันคือมูลค่าการใช้forwardRefมากกว่าเสาที่กำหนดเองคืออะไร?

คำตอบ:


3

แม้แต่React docs ยังกล่าวถึง prop ref ที่กำหนดเองว่าเป็นวิธีที่ยืดหยุ่นกว่าในการforwardRef:

ถ้าคุณใช้ React 16.2 หรือลดหรือถ้าคุณต้องการความยืดหยุ่นมากขึ้นกว่าการให้บริการโดยการส่งต่อโทษคุณสามารถใช้วิธีทางเลือกนี้และอย่างชัดเจนผ่านการเตะเป็น prop

นอกจากนี้ยังมีส่วนสำคัญที่ Dan Abramov เขียนเกี่ยวกับข้อดี:

  • เข้ากันได้กับทุกรุ่น React
  • ใช้ได้กับส่วนประกอบของคลาสและฟังก์ชัน
  • ลดความซับซ้อนของการส่งการอ้างอิงไปยังองค์ประกอบที่ซ้อนกันหลายชั้นลึก

ฉันจะเพิ่มการอ้างอิงที่ผ่านมาเนื่องจากอุปกรณ์ประกอบฉากตามปกติไม่ก่อให้เกิดการเปลี่ยนแปลงที่รุนแรงและเป็นวิธีการที่จะอ้างอิงหลาย ๆ ครั้ง ข้อดีเพียงอย่างเดียวของการforwardRefมาถึงใจของฉันคือ:

  • API การเข้าถึงที่สม่ำเสมอสำหรับโหนด DOM องค์ประกอบของการใช้งานและคลาส
  • ref แอตทริบิวต์จะไม่ขยาย API อุปกรณ์ประกอบฉากของคุณเช่นหากคุณระบุ TypeScript ด้วย

การส่งเสาที่กำหนดเองจะมีผลต่อการแสดงและทำให้เกิดการแสดงผลเพิ่มเติมหรือไม่

การอ้างอิงอาจทำให้เกิดการเรนเดอร์ซ้ำได้หากคุณผ่านฟังก์ชั่นการติดต่อกลับแบบโทรกลับแบบอินไลน์เป็นเสา แต่มันก็เป็นความคิดที่ดีต่อไปเพื่อกำหนดเป็นวิธีการเช่นชั้นเรียนหรือผ่านทาง memoization useCallbackบางอย่างเช่น


1
ขอบคุณฟอร์ดที่ยอดเยี่ยมฉันคิดว่าอาจเป็นกรณีที่เพิ่งกระตือรือร้นที่จะส่องแสงบางอย่างกับมัน
Lesbaa

0

Refเป็นคุณสมบัติมาตรฐานในReactส่วนประกอบ

ส่วนประกอบบางอย่างที่ห่อส่วนประกอบอื่น ๆ เพื่อให้ฟังก์ชั่นเพิ่มเติมใช้refเพื่ออ้างถึงส่วนประกอบที่ถูกห่อและคาดว่าส่วนประกอบนั้นมีrefคุณสมบัติ

เป็นการดีกว่าสำหรับส่วนประกอบที่จะมีrefคุณสมบัติเพื่อให้เข้ากันได้กับส่วนประกอบและไลบรารีอื่น ๆ

องค์ประกอบฟังก์ชั่นไม่สามารถมีคุณสมบัติ "อ้างอิง" และต้องใช้forwardRefแทนเพื่อให้refคุณสมบัติ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.