Итак, у меня есть этот хук для возврата windowWidth
для моих компонентов приложения. Я назову это Option # 1 .
import {useEffect, useState} from 'react';
function useWindowWidth() {
const [windowWidth,setWindowWidth] = useState(window.innerWidth);
useEffect(() => {
function handleResize() {
setWindowWidth(window.innerWidth);
}
window.addEventListener('resize', handleResize);
return () => window.removeEventListener('resize', handleResize);
}, []);
return windowWidth;
}
export default useWindowWidth;
И сейчас я в основном использую его для каждого компонента, который зависит от ширины окна для рендеринга, например:
function Component(props) {
const windowWidth = useWindowWidth();
return(
// RETURN SOMETHING BASED ON WINDOW WIDTH
);
}
И поскольку у ловушки есть прослушиватель событий для событий resize
, компонент остается отзывчивым даже после изменения размера окна.
Но я боюсь, что присоединяю нового слушателя длякаждый компонент, который использует этот хук, и это может в какой-то момент замедлить работу. И у меня есть другой подход:
Опция # 2
Я использую хук useWindowWidth()
только один раз, внутри компонента верхнего уровня, такого как <App/>
и я предоставлю значение windowWidth
по цепочке через контекст.
Например:
function App() {
const windowWidth = useWindowWidth();
return(
<WindowWidthContext.Provider value={windowWidth}>
<Rest_of_the_app/>
</WindowWidthContext.Provider>
);
}
И затем каждый компонент, который нуждается в нем, может получить его через:
function Component() {
const windowWidth = useContext(WindowWidthContext);
return(
// SOMETHING BASED ON WINDOW WIDTH
);
}
ВОПРОС
Правильно ли меня беспокоит тот факт, что я настраиваю несколько resize
слушателей с Option # 1 ? Option # 2 - это хороший способ оптимизировать этот поток?