2 回答

TA贡献2036条经验 获得超8个赞
我不确定添加和删除事件侦听器是否比设置和删除映射键更昂贵的操作,但也许以下内容会对其进行优化:
const changeTracker = (debounceTime => {
const listeners = new Map();
const add = fn => {
listeners.set(fn, fn);
return () => listeners.delete(fn);
};
let debounceTimeout;
window.addEventListener('resize', () => {
clearTimeout(debounceTimeout);
debounceTimeout = setTimeout(
() => {
const width=window.innerWidth;
listeners.forEach(l => l(width))
},
debounceTime
);
});
return add;
})(200);
function useWindowWidth() {
const [windowWidth, setWindowWidth] = useState(
() => window.innerWidth
);
useEffect(
() =>//changeTracker returns a remove function
changeTracker((width) =>
setWindowWidth(width)
),
[]
);
return windowWidth;
}

TA贡献1893条经验 获得超10个赞
如果您的窗口 with 被您提到的这么多组件使用,则您必须更喜欢使用context
. 如下所示:
上下文适用于全球范围的应用。
所以,#2
这里是每个反应的完美选择。
第一种方法#1
可能适用于相同层次结构但最多 2-3 级的组件。
添加回答
举报