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() 一起使用
您的 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)
| 归档时间: |
|
| 查看次数: |
10559 次 |
| 最近记录: |