Reactjs 反应:为什么从useRef更改ref的当前值不';t在这里触发useffect

Reactjs 反应:为什么从useRef更改ref的当前值不';t在这里触发useffect,reactjs,Reactjs,我有一个关于useRef的问题:如果我将ref.current添加到useffect的依赖项列表中,并且当我更改ref.current的值时,useffect内部的回调不会被触发 例如: 导出默认函数App(){ const myRef=useRef(1); useffect(()=>{ console.log(“myRef current changed”);//这仅在组件装载时触发 },[myRef.当前]; 返回( { myRef.current=myRef.current+1; 日志(“

我有一个关于
useRef
的问题:如果我将
ref.current
添加到
useffect
的依赖项列表中,并且当我更改
ref.current
的值时,
useffect
内部的回调不会被触发

例如:

导出默认函数App(){
const myRef=useRef(1);
useffect(()=>{
console.log(“myRef current changed”);//这仅在组件装载时触发
},[myRef.当前];
返回(
{
myRef.current=myRef.current+1;
日志(“myRef.current”,myRef.current);
}}
>
更改参考
);
}
useRef.current
更改时,
useffect
中的内容运行时,不应该这样吗

另外,我知道我可以在这里使用
useState
。这不是我要问的。我还知道,在重新渲染期间,
ref
在引用上保持不变,所以它不会改变。但我不是在做类似的事情

constmyref=useRef(1);
useffect(()=>{
//...
},[myRef]);

我将
当前值
放在dep列表中,这样应该会更改。

好的,所以我认为您缺少的是更改ref的值不会导致重新渲染。因此,如果它不会导致重新渲染,则该函数不会再次运行。这意味着不再运行
useffect
。这意味着它永远没有机会比较这些值。如果使用状态更改触发重新渲染,您将看到效果现在将运行。因此,请尝试以下方法:

export default function App() {
  const [x, setX] = useState();
  const myRef = useRef(1);
  useEffect(() => {
    console.log("myRef current changed"); // this only gets triggered when the component mounts
  }, [myRef.current]);
  return (
    <button
        onClick={() => {
          myRef.current = myRef.current + 1;
          // Update state too, to trigger a re-render
          setX(Math.random());
          console.log("myRef.current", myRef.current);
        }}
      >
        change ref
      </button>
  );
}
导出默认函数App(){
const[x,setX]=useState();
const myRef=useRef(1);
useffect(()=>{
console.log(“myRef current changed”);//这仅在组件装载时触发
},[myRef.当前];
返回(
{
myRef.current=myRef.current+1;
//也更新状态,以触发重新渲染
setX(Math.random());
日志(“myRef.current”,myRef.current);
}}
>
更改参考
);
}
现在您可以看到它将触发效果。

请记住,useRef的内容更改时不会通知您。更改.current属性不会导致重新渲染。如果您想在React将ref附加或分离到DOM节点时运行一些代码,则可能需要使用回调ref


将useRef更改为useState。@T04435这不是我要问的问题的答案here@Joji查看Github React页面上的相关讨论。我知道ref就像指向内存中某个值的指针,在重新呈现时指针保持不变。但我用的是这里的值。而这个值是一个基元类型,也就是数字,它应该是变化的。我也知道如何使用
useState
,这个问题与此无关。@Joji好的,我明白你的意思,我改变了我的答案,我想这就是你想要弄明白的