我知道 ref 是一个可变容器,因此不应在useEffect
的依赖项中列出它,但它ref.current
可能是一个不断变化的值。
当 ref 用于存储像 DOM 元素时<div ref={ref}>
,并且当我开发依赖于该元素的自定义钩子时,假设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);
虽然回调引用更难使用,因为强制用户组合它们:
const fooRef = useFoo();
const barRef = useBar();
const ref = element => {
fooRef(element);
barRef(element);
};
<div ref={ref} />
这就是为什么我要问ref.current
在useEffect
.