我知道 ref 是一个可变容器,因此它不应该列在 useEffect
的依赖项中,但是 ref.current
可能是一个变化的值。
当 ref 用于存储 <div ref={ref}>
类的 DOM 元素时,并且当我开发一个依赖于该元素的自定义钩子时,假设 ref.current
如果组件有条件返回,则会随时间变化喜欢:
const Foo = ({inline}) => {
const ref = useRef(null);
return inline ? <span ref={ref} /> : <div ref={ref} />;
};
我的自定义效果接收 ref
对象并使用 ref.current
作为依赖项是否安全?
const useFoo = ref => {
useEffect(
() => {
const element = ref.current;
// Maybe observe the resize of element
},
[ref.current]
);
};
我读过 这条评论 说 ref 应该在 useEffect
中使用,但我无法弄清楚 ref.current
改变但不会触发效果的任何情况。
正如那个问题所建议的,我应该使用回调引用,但是作为参数的引用对于集成多个钩子非常友好:
const ref = useRef(null);
useFoo(ref);
useBar(ref);
虽然回调 ref 更难使用,因为用户被强制编写它们:
const fooRef = useFoo();
const barRef = useBar();
const ref = element => {
fooRef(element);
barRef(element);
};
<div ref={ref} />
这就是为什么我要问在 useEffect
ref.current
是否安全。
原文由 otakustay 发布,翻译遵循 CC BY-SA 4.0 许可协议
这是不安全的,因为改变引用 不会触发 render ,因此 不会触发
useEffect
。反模式示例:
与此模式相关的一个 现实生活用例 是当我们想要有一个持久引用时, 即使元素卸载了。
检查下一个示例,其中卸载时我们无法坚持元素大小调整。我们将尝试使用
useRef
和useEffect
上面的组合, 但它不起作用。令人惊讶的是,要修复它,我们需要直接处理
node
,同时使用useCallback
函数:useEffect
的用途