useRef 有时不会更新,只打印对象

Posted

技术标签:

【中文标题】useRef 有时不会更新,只打印对象【英文标题】:useRef is not updating sometime and print just object 【发布时间】:2021-08-30 18:00:56 【问题描述】:

我正在尝试同时使用 useRef 和 useCallback,但似乎我的 useRef 有时不会更新。这实际上很奇怪,而且只是偶尔发生。即使我使用正常的 ref 操作,它的行为也是一样的。

function useRefCallback() 
  const ref = useRef(null);
  const setRef = useCallback(node => 
    ref.current = node;
  , []);
  return [ref, setRef];


function MapWidget( options ) 
  const [mapWidgetRef, setMapWidgetRef] = useRefCallback();
// I try to pass to another hook to get width and height of that mapWidgetRef.
  const [mapWidgetWidth, mapWidgetHeight] = useResizeObserver(mapWidgetRef); 

  return (
    <div ref=setMapWidgetRef>
    ...
    </div>


如果我尝试打印出mapWidgetRef,有时我会得到object,这并不好,它会使mapWidgetWidth, mapWidgetHeight 未定义。大部分时间都很好,并且按预期工作。

不好

不错

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

为 useCallback 提供所需的所有依赖项很重要

const setRef = useCallback(node => 
    ref.current = node;
, [ref]);

但是这会使其无效,您可以像往常一样使用 ref,如果需要一些需要记忆的操作,请使用 useCallback 代码的那部分

【讨论】:

我尝试使用正常的 useRef 但它不起作用并给了我相同的结果。这就是为什么我尝试与回调一起使用。但仍然没有运气。【参考方案2】:

我很难理解

function useRefCallback() 
  const ref = useRef(null);
  const setRef = useCallback(node => 
    ref.current = node;
  , []);
  return [ref, setRef];

一个简单的useRef 应该已经适合你了。使用前请务必查看ref.current

  const ref = useRef()
  return <div ref=ref>

你有点和新旧裁判一起工作。老实说,新的 ref 涵盖了这两种情况,仅在某些极端情况下,ref 必须使用旧的 ref 语法才能使其正常工作。但总的来说,以上几行应该可以工作。

注意:ref 不会在每次渲染中更新。只有当 DOM 发生变化时,例如。安装,卸载,然后更新。所以不需要使用useCallback 等。它不应该与那些一起工作。

【讨论】:

是的,最初我尝试使用正常的 useRef,但它不起作用并给了我相同的结果。这就是为什么我尝试与回调一起使用。但仍然没有运气。

以上是关于useRef 有时不会更新,只打印对象的主要内容,如果未能解决你的问题,请参考以下文章

createRef和useRef区别——useRef的使用——forwardRef完成类组件的绑定—— useImperativeHandle——映射ref对象——更新同步

React useState 由于 useRef 而没有更新

我可以在 React js 中使用 useRef 挂钩而不是 onChange 事件来更新状态吗?

为啥 useRef 值在它是整数时会动态更新,但在它是字符串时会存储先前的值?

多个反应过滤器和更新选择输入的问题 - 奇怪的行为

使用 pymongo 运行多个更新语句时,有时 MongoDB 不会更新