2 回答

TA貢獻(xiàn)2036條經(jīng)驗(yàn) 獲得超8個(gè)贊
我不確定添加和刪除事件偵聽器是否比設(shè)置和刪除映射鍵更昂貴的操作,但也許以下內(nèi)容會(huì)對(duì)其進(jìn)行優(yōu)化:
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貢獻(xiàn)1893條經(jīng)驗(yàn) 獲得超10個(gè)贊
如果您的窗口 with 被您提到的這么多組件使用,則您必須更喜歡使用context
. 如下所示:
上下文適用于全球范圍的應(yīng)用。
所以,#2
這里是每個(gè)反應(yīng)的完美選擇。
第一種方法#1
可能適用于相同層次結(jié)構(gòu)但最多 2-3 級(jí)的組件。
添加回答
舉報(bào)