【发布时间】:2019-10-05 12:32:37
【问题描述】:
我有一个钩子,可以捕获 ref DOM 元素的 getBoundingClientRect 对象。问题是,在第一次渲染时,它返回null,我只需要在组件的第一次渲染时获取值。
我在功能组件中使用它:
const App = () => {
// create ref
const rootRef = useRef(null);
// get Client Rect of rootRef
const refRect = useBoundingClientRect(rootRef);
useEffect(()=> {
// return "null" the first time
// return "DOMRect" when refRect is update
console.log(refRect)
}, [refRect])
return <div ref={rootRef} >App</div>
}
这里是useBoundingClientRect钩子,我调用了App Component。
export function useBoundingClientRect(pRef) {
const getBoundingClientRect = useCallback(() => {
return pRef && pRef.current && pRef.current.getBoundingClientRect();
}, [pRef]);
const [rect, setRect] = useState(null);
useEffect(() => {
setRect(getBoundingClientRect());
},[]);
return rect;
}
问题是我想在初始化时缓存 boundingClientRect 对象,而不是第二次重新渲染组件:
// App Component
useEffect(()=> {
// I would like to get boundingClientRect the 1st time useEffect is call.
console.log(refRect)
// empty array allow to not re-execute the code in this useEffect
}, [])
我检查了一些教程和文档,发现有些人使用useRef 而不是useState 挂钩来保持价值。所以我尝试在我的 useboundingClientRect 钩子中使用它来捕获并返回我的 App 组件第一次渲染时的 boundingClientRect 值。它可以工作......部分:
export function useBoundingClientRect(pRef) {
const getBoundingClientRect = useCallback(() => {
return pRef && pRef.current && pRef.current.getBoundingClientRect();
}, [pRef]);
const [rect, setRect] = useState(null);
// create a new ref
const rectRef = useRef(null)
useEffect(() => {
setRect(getBoundingClientRect());
// set value in ref
const rectRef = getBoundingClientRect()
},[]);
// return rectRef for the first time
return rect === null ? rectRef : rect;
}
现在 App 组件中的 console.log(rectRef) 允许在第一次渲染时访问该值:
// App Component
useEffect(()=> {
console.log(refRect.current)
}, [])
但如果我尝试从useBoundingClientRect 返回refRect.current,则挂钩返回null。 (什么?!)
如果有人可以向我解释这些错误。提前致谢!
【问题讨论】:
-
const rectRef =没有设置任何东西。它创建另一个局部变量。rectRef.value =就是你要找的...
标签: javascript reactjs react-hooks