如何使用 React.useRef 获取实际的 Dom 节点?Element.getBoundingClientRect() 不适用于 useRef 变量

byy*_*ung 5 javascript dom reactjs react-hooks

我正在尝试使用 Element.getBoundingClientRect() 来获取 dom 元素的 x、y、顶部、左侧值。

const editorRef = useRef() 
... // attatched editor ref on the dom element that I'm interested
... 
editorRef.current.focus() // works well 
const editorNodeRect = editorRef.current.getBoundingClientRect() // got error saying getBoundingClientRect() is not a function 
Run Code Online (Sandbox Code Playgroud)

所以我尝试通过查询选择节点来尝试这种方法

const editorNodebyQuery =document.querySelectorAll(".DraftEditor-root")[0];
const editorNodebyQueryRect = editorNodebyQuery.getBoundingClientRect() // work well!! 
Run Code Online (Sandbox Code Playgroud)

但我不喜欢通过查询访问dom节点..我认为它很重..我想使用useRef。

第一个 rootEditorNode 是我通过 querySelector 得到的,它有 getBoundingClientRect() 函数;第二个 editorRef.current 是我通过 useRef 得到的,它没有 getBoundingClientRect() 函数。

在此输入图像描述

我只想知道如何将 getBoundingClientRect() 函数与 useRef() 一起使用

44k*_*rma 5

您的 editorRef 很可能指向 React 组件而不是 DOM 元素。你可以得到这样的元素

var element=ReactDOM.findDOMNode(editorRef.current);
var rect =element.getBoundingClientRect();
Run Code Online (Sandbox Code Playgroud)

但 ReactDOM.findDOMNode 在严格模式下已被弃用(推荐使用)

<React.StrictMode></React.StrictMode>
Run Code Online (Sandbox Code Playgroud)

因此,如果您有权访问子组件,更好的方法是使用forwardRef,另一个选择是使用包装器div来包装子组件并像这样使用useRef

<div ref={editorRef} >
<ChildComp/>
</div> 
Run Code Online (Sandbox Code Playgroud)

这将允许您访问 getBoundingClientRect() 可能会返回错误的大小(rect.top 0、rect.height 0 等),在这种情况下您需要延迟调用它

useEffect(() => {

setTimeout(() => {
   var rect = editorRef.current.getBoundingClientRect();
}, 300);

  }, [ ]);
Run Code Online (Sandbox Code Playgroud)