在我的应用程序代码中,我最近遇到了使用useRef钩子的奇怪错误,我需要在其中有条件地渲染组件,并在其上具有useImperativeHandle来调用某些子方法。在各种渲染中,如果我使用myRef.current.<function>可以正常工作,但是如果我使用const c = myRef.current然后再使用c.<function>则不能正常工作,因为c是未定义的。看一下我想复制此示例的示例:

https://codesandbox.io/s/jolly-thunder-y1ft0?file=/src/index.js:115-313(由于SO不支持JSX,因此无法在此处添加代码段)

编辑:一个更好的例子-https://codesandbox.io/s/focused-stonebraker-gd7gq?file=/src/App.js

安装了WorksFine组件后,运行代码并查看控制台。
现在注释掉WorksFine并取消注释DoesNotWorkFine,看看会发生什么。我希望这可以弄清楚我的要求。

我的印象是useRef返回一个对象,该对象的current属性可以更改,并且可以在所有“过去”或将来的渲染中使用。我在这里想念什么?

最佳答案

我的印象是useRef返回一个对象,该对象的当前属性可以更改,并且可以在所有“过去”或将来的渲染中访问。


是的,DoesNotWorkFine组件的问题是它引用了容器的内容,而不是容器本身。

如果需要重申,则可以将来自useRef的对象视为容器,并且.current属性是该容器的内容。

// myRef is the container
const myRef = useRef(null);

// the "ref" variable below is not actually a ref as defined by React, it's the content
// inside the ref because it's pulling the `.current` property off the actual ref
const ref = myRef.current;


您可以随时进入容器,从容器中抓取的内容将是最新的。但是,如果您取出内容,那么当您仍然保留旧内容时,容器中的内容可能会发生变化。

关于javascript - useRef Hook 的行为不一致,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61124529/

10-12 12:25