开发者问题收集

React ref.current.clientHeight 报告来自同一对象的两个不同值

2021-10-11
976

我需要 React 的 ref clientHeight 报告组件的高度,但我遇到了这种奇怪的行为,即同一 ref 会根据访问方式报告不同的 clientHeight 值。如果我在 div 内输出文本,ref 会始终输出正确的高度。

  const test = useRef(null)


  useEffect(() => {
        console.log(test)
        console.log(test.current.clientHeight)
    },[])

     return <div ref={test}>
            <Input value={state.multiLineString} multiline/>
        </div>

这些图像输出我从 test.current 对象访问 clientHeight 以及直接通过 test.current.clientHeight 访问 clientHeight。观察它们是否一致。

在此处输入图像描述

这些图像输出我以相同的方式访问 clientHeight,但将状态中的文本传递给多行输入。观察发现,尽管第一个对象输出具有正确的值,但它们并不一致。

在此处输入图像描述

在此处输入图像描述

为什么会发生这种情况,因为我非常困惑并且已经用尽了我能找到的所有资源。谢谢。

编辑

repo 这里

https://codesandbox.io/s/optimistic-hermann-q6mnv?file=/src/App.js

2个回答

如果您有一个区域需要稍后再调整大小,例如图片区域,在第一种情况下,clientHeight 会显示,而无需计算该大小。在这种情况下,如果图片区域的容器被赋予静态高度,则会显示正确的结果。

aliselcuk
2022-08-19

在类似您的情况中,您可能应该使用 callback ref 以及类似 ResizeObserver 的库。为方便使用,请查看 use-resize-observer 库。

使用此库的代码摘录,取自其文档:

const App = () => {
  const {
    ref,
    width = 1,
    height = 1,
  } = useResizeObserver();

  return (
    <div ref={ref}>
      Size: {width}x{height}
    </div>
  );
};
nascente_diskreta
2023-06-21