[英]Multiple refs in react
我有一个容器,它应该引用它的一些子组件:
const Container = () => {
const blocks: HTMLDivElement[] = [];
return (
<div>
<Navigation currentBlock={currentBlock} blocks={blocks} />
<div ref={(ref) => ref && blocks.push(ref)}>
// ...
</div>
<div ref={(ref) => ref && blocks.push(ref)}>
// ...
</div>
<div ref={(ref) => ref && blocks.push(ref)}>
// ...
</div>
<div ref={(ref) => ref && blocks.push(ref)}>
// ...
</div>
</div>
);
};
但是,当我尝试渲染Navigation
组件时, blocks
变量是一个空数组。
我尝试使用useRef
钩子将blocks
变量转换为引用:
const Container = () => {
const blocks = useRef<HTMLDivElement[]>([]);
return (
<div>
<Navigation currentBlock={currentBlock} blocks={blocks.current} />
<div ref={(ref) => ref && blocks.current.push(ref)}>
// ...
</div>
<div ref={(ref) => ref && blocks.current.push(ref)}>
// ...
</div>
<div ref={(ref) => ref && blocks.current.push(ref)}>
// ...
</div>
<div ref={(ref) => ref && blocks.current.push(ref)}>
// ...
</div>
</div>
);
};
blocks
在渲染时仍然是一个空数组,但之后它变成了我想要的有效引用数组。
有没有办法在不重新渲染Container
的情况下更新Navigation
组件?
编辑:这是我的Navigation
组件:
const Navigation = ({ currentBlock, blocks }: { currentBlock: number, blocks: MutableRefObject<HTMLDivElement[]>}) => {
console.log(blocks.current);
return (
<nav>
{blocks.current.map((_, idx) => (
<NavigationLink key={idx} active={currentBlock === idx} />
))}
</nav>
);
}
在我的控制台中,我有这个 output:
Navigation
组件不呈现任何NavigationLink
,就好像数组为空一样。
要存储参考,您应该使用useRef
挂钩。 但是,您必须将 refs 传递给另一个组件,而不是使用 blocks.current,而只是使用块。 这样可以确保导航组件使用的道具可以访问变异的属性,因为在分配参考时不会触发重新渲染
const Container = () => {
const blocks = useRef<HTMLDivElement[]>([]);
return (
<div>
<Navigation currentBlock={currentBlock} blocks={blocks} />
<div ref={(ref) => ref && blocks.current.push(ref)}>
// ...
</div>
<div ref={(ref) => ref && blocks.current.push(ref)}>
// ...
</div>
<div ref={(ref) => ref && blocks.current.push(ref)}>
// ...
</div>
<div ref={(ref) => ref && blocks.current.push(ref)}>
// ...
</div>
</div>
);
};
现在在 Navigation 组件中,您可以使用props.blocks.current
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.