反应:为什么从useRef更改ref的当前值不会在这里触发useEffect

九次

我有一个问题useRef:如果添加ref.current到的依赖项列表中useEffect,并且更改的值时ref.currentuseEffect不会触发其中的回调

例如:

export default function App() {
  const myRef = useRef(1);
  useEffect(() => {
    console.log("myRef current changed"); // this only gets triggered when the component mounts
  }, [myRef.current]);
  return (
    <div className="App">
      <button
        onClick={() => {
          myRef.current = myRef.current + 1;
          console.log("myRef.current", myRef.current);
        }}
      >
        change ref
      </button>
    </div>
  );
}

是不是应该在useRef.current更改useEffect时运行其中的东西

另外,我知道我可以用useState在这里。这不是我要的。我也知道ref在重新渲染期间保持相同的参考,因此它不会改变。但是我没有做类似的事情

 const myRef = useRef(1);
  useEffect(() => {
    //...
  }, [myRef]);

我将current值放在dep列表中,因此应该进行更改。

杰伊斯444

好的,所以我认为您在这里缺少的是更改引用的值不会导致重新渲染。因此,如果不引起重新渲染,则该函数不会再次运行。这意味着useEffect不再运行。这意味着永远没有机会比较这些值。如果使用状态更改触发重新渲染,您将看到效果将立即运行。所以尝试这样的事情:

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>
  );
}

现在您可以看到它将触发效果。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么星火据帧缓存不会在这里工作

来自分类Dev

为什么Python的unittest.assertRaises()不会在这里引发错误?

来自分类Dev

为什么不会 for ... 在这里循环?

来自分类Dev

为什么useEffect不会在每个渲染上触发?

来自分类Dev

为什么Python在这里打印出多个值?

来自分类Dev

为什么模糊事件不会在对 textarea 做出反应时触发?

来自分类Dev

为什么更改输入不会在更改事件上触发?

来自分类Dev

为什么在这里不确定?

来自分类Dev

为什么在这里的盒子?

来自分类Dev

为什么WlanOpenHandle()在这里失败?

来自分类Dev

为什么在这里发生僵局

来自分类Dev

为什么在这里使用锁?

来自分类Dev

为什么$ .isEmptyObject在这里无效

来自分类Dev

为什么python在这里运行?

来自分类Dev

为什么使用原子在这里?

来自分类Dev

为什么在这里需要'break;'?

来自分类Dev

为什么WlanOpenHandle()在这里失败?

来自分类Dev

为什么在这里抛出异常?

来自分类Dev

为什么$ .isEmptyObject在这里无效

来自分类Dev

为什么在这里得到NullPointerException?

来自分类Dev

为什么python在这里运行?

来自分类Dev

值0.5在这里代表什么?

来自分类Dev

为什么代码分析会在这里告诉我“不要多次处置对象”:

来自分类Dev

为什么代码分析会在这里告诉我“不要多次处置对象”:

来自分类Dev

为什么 Method.Invoke 会在这里抛出 IllegalArgumentException?

来自分类Dev

为什么ng-src不会在AngularJS中触发某些属性更改?

来自分类Dev

为什么onQueryTextChange不会在双击时触发?

来自分类Dev

为什么|| 运算符不是在这里触发的吗?

来自分类Dev

为什么Task.WaitAll()在这里不会阻止或导致死锁?

Related 相关文章

热门标签

归档