คำตอบล่าสุดพร้อมตัวอย่างซึ่งใช้ React.useState
การรักษาสถานะในองค์ประกอบหลักเป็นวิธีที่แนะนำ พาเรนต์จำเป็นต้องมีสิทธิ์เข้าถึงในขณะที่จัดการผ่านคอมโพเนนต์ลูกสองรายการ ไม่แนะนำให้ย้ายไปอยู่ในระดับโลกเหมือนกับที่จัดการโดย Redux ด้วยเหตุผลเดียวกันกับที่ทำไมตัวแปรทั่วโลกจึงแย่กว่าท้องถิ่นทั่วไปในสาขาวิศวกรรมซอฟต์แวร์
เมื่อรัฐอยู่ในองค์ประกอบผู้ปกครองเด็กสามารถกลายพันธุ์ได้ถ้าผู้ปกครองให้เด็กvalue
และonChange
ผู้จัดการในอุปกรณ์ประกอบฉาก (บางครั้งมันเรียกว่าการเชื่อมโยงค่าหรือรูปแบบการเชื่อมโยงรัฐ ) นี่คือวิธีที่คุณจะทำกับ hooks:
function Parent() {
var [state, setState] = React.useState('initial input value');
return <>
<Child1 value={state} onChange={(v) => setState(v)} />
<Child2 value={state}>
</>
}
function Child1(props) {
return <input
value={props.value}
onChange={e => props.onChange(e.target.value)}
/>
}
function Child2(props) {
return <p>Content of the state {props.value}</p>
}
องค์ประกอบหลักทั้งหมดจะแสดงผลอีกครั้งเมื่อมีการเปลี่ยนแปลงอินพุตในเด็กซึ่งอาจไม่ใช่ปัญหาหากองค์ประกอบหลักมีขนาดเล็ก / เร็วในการแสดงผลใหม่ ประสิทธิภาพการแสดงผลซ้ำขององค์ประกอบหลักยังคงเป็นปัญหาในกรณีทั่วไป (ตัวอย่างเช่นแบบฟอร์มขนาดใหญ่) นี่คือการแก้ไขปัญหาในกรณีของคุณ (ดูด้านล่าง)
รูปแบบลิงก์รัฐและไม่มีการเรนเดอร์พาเรนต์ง่ายกว่าในการนำไปใช้โดยใช้ไลบรารี่ของบุคคลที่สามเช่นHookstate ที่อัดแน่นReact.useState
จนครอบคลุมกรณีการใช้งานที่หลากหลายรวมถึงเคสของคุณ (ข้อจำกัดความรับผิดชอบ: ฉันเป็นผู้เขียนโครงการ)
นี่คือลักษณะของ Hookstate Child1
จะเปลี่ยนอินพุตChild2
จะตอบสนองต่อมัน Parent
จะถือสถานะ แต่จะไม่แสดงผลอีกครั้งเมื่อมีการเปลี่ยนแปลงสถานะเท่านั้นChild1
และChild2
จะ
import { useStateLink } from '@hookstate/core';
function Parent() {
var state = useStateLink('initial input value');
return <>
<Child1 state={state} />
<Child2 state={state}>
</>
}
function Child1(props) {
// to avoid parent re-render use local state,
// could use `props.state` instead of `state` below instead
var state = useStateLink(props.state)
return <input
value={state.get()}
onChange={e => state.set(e.target.value)}
/>
}
function Child2(props) {
// to avoid parent re-render use local state,
// could use `props.state` instead of `state` below instead
var state = useStateLink(props.state)
return <p>Content of the state {state.get()}</p>
}
PS: มีตัวอย่างอีกมากมายที่นี่ซึ่งครอบคลุมสถานการณ์ที่คล้ายกันและมีความซับซ้อนมากขึ้นรวมถึงข้อมูลที่ซ้อนกันอย่างลึกล้ำการตรวจสอบสถานะรัฐทั่วโลกพร้อมsetState
เบ็ดเป็นต้นนอกจากนี้ยังมีตัวอย่างแอปพลิเคชันออนไลน์แบบสมบูรณ์ซึ่งใช้ Hookstate และเทคนิคที่อธิบายไว้ข้างต้น