useCallbackRef
是use-callback-ref
包提供的钩子
为什么useEffect
触发两次时,有在依赖数组的useCallbackRef
结果的.current
?
import { useCallback, useEffect, useRef, useState } from "react";
import { useCallbackRef } from "use-callback-ref";
function App() {
const [useCbRefCounter, setUseCbRefCounter] = useState(0);
const [useCbRefEffectCounter, setUseCbRefEffectCounter] = useState(0);
const divCbRef = useCallbackRef(null, () =>
// This is called once
setUseCbRefCounter((counter) => counter + 1)
);
useEffect(() => {
if(!divCbRef.current) {
return;
}
// This is called twice
setUseCbRefEffectCounter((counter) => counter + 1);
}, [divCbRef.current]);
// ...
}
(useEffect
不是被null
触发的)
沙盒演示,比较ref改变时调用的次数
这很可能是由于useCallbackRef
的实现,divCbRef.current
是一个可变对象,因此在useEffect
内部,两个调用是相同的。
但是对useEffect
的调用发生了两次,因为第一次divCbRef.current
是null
,第二次是HTMLDivElement
。
如果你稍微改变useEffect
的代码,那么你就会明白为什么这个效果被称为:
const currentREF = divCbRef.current;
useEffect(() => {
if (!divCbRef.current) {
return;
}
console.log(currentREF);
// This is called twice
setUseCbRefEffectCounter((counter) => counter + 1);
}, [currentREF]);
控制台输出将是
null
<div> </div>