[英]Is there any other easy way to get the height and width of a container using React Hooks?
我正在使用 React 钩子useEffect
来获取container
的宽度和高度。 我要解决的问题是:
window.innerHeight
并且这本身会使我在初始渲染上的输出崩溃,因为我首先使用dimension
状态来完成某些事情。我是这个 React Hooks 的新手,对很多事情一无所知。我想要完美地完成工作的简单代码。
我的代码如下:
function debounce(fn, ms) {
let timer;
return (_) => {
clearTimeout(timer);
timer = setTimeout((_) => {
timer = null;
fn.apply(this, arguments);
}, ms);
};
}
export default function App() {
const [dimensions, setDimensions] = useState({
height: window.innerHeight,
width: window.innerWidth,
});
useEffect(() => {
const debouncedHandleResize = debounce(function handleResize() {
setDimensions({
height: window.innerHeight,
width: window.innerWidth,
});
}, 1000);
document
.getElementById('SldBox')
.addEventListener('resize', debouncedHandleResize);
return (_) => {
document
.getElementById('SldBox')
.removeEventListener('resize', debouncedHandleResize);
};
});
return (
<div className='container' id='SldBox'>
My Container
</div>
);
}
很酷的问题,这里有很多钩子要学习。
这是我们如何使用的示例:
https://codesandbox.io/s/keen-poincare-c8mcz?file=/src/App.js
useState :你很好地利用了这个。 无需多做解释。
useRef :创建一个 ref 然后将其传递给您的元素。
export default function App() {
const ref = useRef(null);
return (
<div ref={ref}>stuff</div>
);
}
现在在第一次渲染之后,我们可以很容易地引用元素。
useMemo :要为元素设置观察者,我们可以使用ResizeObserver
。 如果我们不将其包装在useMemo
中,我们将在每次渲染时重新创建此函数,这是一种浪费。 useMemo
解决了这个问题。 我们还为ref.current
useMemo
第二个参数。 这样,任何时候 ref 更改(例如在第一次渲染时),都会重新计算elementObserver
函数。
const elementObserver = useMemo(() => {
return new ResizeObserver(() => {
debounce(() => {
if (!ref.current) return;
setDimensions({
height: ref.current.clientHeight,
width: ref.current.clientWidth
});
}, 1000)();
});
}, [ref.current]);
useEffect :现在我们可以在组件挂载时使用useEffect
设置观察者。 我们再次包含一个依赖数组,它告诉效果在任何这些值发生更改时触发提供的回调函数。 它也会在组件挂载时始终运行,因此我们需要检查 ref 是否存在。 此外,将元素分配给“清理”功能效果中的变量。
useEffect(() => {
if (!ref) return;
const element = ref.current;
elementObserver.observe(element);
return () => {
elementObserver.unobserve(element);
};
}, [ref.current, elementObserver]);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.