【发布时间】:2020-05-18 07:29:32
【问题描述】:
我想使用反应钩子在反应功能组件中获取图像的高度。
我使用了以下代码:
import React, { useRef, useEffect } from 'react'
const DepthChartContent = props => {
const ref = useRef()
useEffect(() => {
if (ref && ref.current && ref.current.clientHeight) {
console.log('called')
}
console.log('useEffect', {
ref,
current: ref.current,
clientHeight: ref.current.clientHeight,
})
}, [])
return (
<img
ref={ref}
className="depth-reference-bar"
src={DepthRuler}
alt="no ruler found"
/>
)
}
这样做的问题是它返回 clientHeight 为 0,但 useEffect 中的 console.log 具有正确的 clientHeight,如下图所示。
这意味着 ref && ref.current && ref.current.clientHeight 在调用时未定义,但在同一 useEffect 中的控制台显示 ref、current: ref.current 的值正确,但 clientHeight: ref.current.clientHeight 为零。
同样,我不能在useEffect 中使用....}, [ref && ref.current && ref.current.clientHeight],因为useEffect 不接受复杂的表达式。如果我将useEffect 外部或内部的变量定义为const clientHeight = (ref && ref.current && ref.current.clientHeight) || 0,那就不走运了!
任何人都可以在这方面提供帮助。谢谢!
【问题讨论】:
-
你可以尝试将 ref 传递为使用效果的依赖项,而不是仅在 mount 时执行副作用吗?
-
附言。如果你想挂钩到事件循环的 Dom 渲染端,你也有 useLayoutEffect
-
@quirimmo - 来自the description of
useLayoutEffect,我认为与useEffect相比,在获取此信息方面不会更好,甚至可能更糟。它发生得更快,而且是同步的。 -
这就是为什么如你所见我告诉你的第一件事就是将 ref 放在依赖项中:)
标签: javascript reactjs react-redux