考虑一个跟踪窗口宽度并返回1
或0
基于给定点的组件:
export function useWindowResize() {
const [width, setWidth] = useState(window.innerWidth < 650 ? 1 : 0)
useEffect(() => {
const handleResize = () => setWidth((window.innerWidth < 650 ? 1 : 0))
window.addEventListener('resize', handleResize)
return () => {
window.removeEventListener('resize', handleResize)
}
}, )
return width
}
如果我们将条件放在上面示例中所示的位置,则仅在给定的断点处才会发生重新渲染。但是,如果我们将条件放在返回中,则每次调整大小时都会发生重新渲染:
export function useWindowResize() {
const [width, setWidth] = useState(window.innerWidth)
useEffect(() => {
const handleResize = () => setWidth((window.innerWidth))
window.addEventListener('resize', handleResize)
return () => {
window.removeEventListener('resize', handleResize)
}
}, )
return width < 650 ? 1 : 0
}
如果我在第一个示例中理解正确,则每个窗口大小调整都会触发条件检查并设置状态,然后钩子会比较状态,因为真/假在断点之前不会改变,因此组件不会重新渲染。
我的问题是: A. 哪种方式资源效率更高?B. 我还应该在第一个示例中限制事件侦听器吗?