我知道 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]
);
};
我已经阅读了 此评论说裁判应该在 useEffect
中使用,但我不能找出任何情况下 ref.current
被改变,但效果不会触发。
正如这个问题所建议的,我应该使用一个回调 ref,但是将 ref 作为参数对于集成多个钩子是非常友好的:
const ref = useRef(null);
useFoo(ref);
useBar(ref);
而回调参考则更难使用,因为用户被迫撰写它们:
const fooRef = useFoo();
const barRef = useBar();
const ref = element => {
fooRef(element);
barRef(element);
};
<div ref={ref} />
这就是为什么我要问在 useEffect
中使用 ref.current
是否安全。