【发布时间】:2020-02-13 20:47:41
【问题描述】:
我正在努力将第 3 方库整合到 React 应用程序中,而 hooks 使这一切变得非常容易。 但是,我遇到了一些问题,我希望能够弄清楚“幕后”发生的事情。
为简单起见,假设这是我直接改变 DOM 的第 3 方代码:
const renderStuff = (div, txt) => {
if(div) div.innerHTML = txt;
}
而我的组件是这样的:
export const EffectRender = () => {
const divRef = useRef();
useRenderer(divRef, "Hello, world");
return <div ref={divRef}></div>;
}
这是建议的自定义挂钩:
const useRenderer = (ref, txt) => {
const div = ref.current;
useEffect(() => {
renderStuff(div, txt);
},[div, txt])
};
如果其中一个参数(在本例中为 txt)更新较晚,例如由于异步加载,则此方法有效。
但是useEffect 永远不会识别ref.current 值何时发生变化。
因此,如果在设置 ref.current 之前设置了 txt(在这种情况下),则组件永远不会呈现。
我知道我可以通过在自定义挂钩中使用 setState 来解决这个问题,就像在 this example 中一样。
但这开始感觉很麻烦。
我也明白我可以将renderStuff 调用放在主要组件上的useEffect 挂钩中,这样可以保证设置了 ref.current。
所以:useEffect(() => { renderStuff(divRef.current, txt); },[txt]); 很好。
我的问题确实是在自定义钩子中使用 ref 的整个方法是否是一个好主意。 是否有一种更简单的方法可以让钩子识别 ref 何时更改? 或者这是自定义钩子不适合该任务的情况?
【问题讨论】:
标签: reactjs react-hooks