useResize

1/8/2022 #reactjs #hooks

自定义hook,可以监视window或者给定元素的宽高变化。 在用d3+react的时候写的一个hook,解决svg在窗口大小变化时同步刷新内容。

function useResize(ref = null) {
//ref不能是svg
const [size, setSize] = useState({
width: undefined,
height: undefined,
});
useEffect(() => {
//监视元素大小
//在有ref,并支持ResizeObserver的情况下
if (ref && ref.current && ResizeObserver) {
const resizeObserver = new ResizeObserver(entries => {
entries.forEach(({ contentRect: { width, height } }) => setSize({ width, height }))
})
resizeObserver.observe(ref.current)
return () => resizeObserver.disconnect();
}
//监视窗口大小
//在不提供ref的情况
function handleResize() {
setSize({
width: window.innerWidth,
height: window.innerHeight,
});
}
window.addEventListener("resize", handleResize);
handleResize();
return () => window.removeEventListener("resize", handleResize);
}, ref ? [ref] : []);
return size;
}

需要注意ref不能是svg本身,需要把svg放到一个container。再把svg的宽或者高设置为100%

const containerRef = useRef()
const dimension = useResize(containerRef)
useEffect(() => {
//更新svg内容
}, [dimension])
return (<div ref={containerRef}>
<svg width="100%"></svg>
</div>)