当两个组件需要共享同一个 state 时,你将那个 state "提升"到它们最近的公共 ancestor,并通过 props 将其向下传递,这样就有了单一的事实来源。
jsx
function Parent() {
const [query, setQuery] = useState("");
(
);
}
如果每个 child 都保持自己的 query,它们会失去同步。提升 state 意味着输入和结果始终保持一致。
将 state 提升得过高可能会迫使你通过许多中间组件传递 props,而这些组件并不使用它们:
<App user={user}>
<Layout user={user}> {/* just forwarding */}
<Sidebar user={user}> {/* just forwarding */}
<Avatar user={user} /> {/* finally used here */}
children 传递,这样数据就留在使用它的地方,而不是被强行穿过去。指导原则:只将 state 提升到需要的高度——不要过高。 过度提升会导致大范围重新渲染和 prop drilling;提升不足则会导致不同步的重复。