У меня есть следующие useEffect
useEffect(() => {
Draggable.create(sliderRef.current, {
type: "x",
bounds: {
minX: 0,
maxX: -document.getElementById('slider').offsetWidth + window.innerWidth
}
});
}, [document.getElementById('slider')])
Я хочу активировать его при изменении размера экрана. Я пытался передать параметр в массиве зависимостей.
window.innerWidth
или document.getElementById('root')
Однако безуспешно ... Я ценю помощь
2 ответа
У useEffect
должна быть зависимость, которая изменяется, если вы хотите, чтобы она повторно вызывала ваш обратный вызов, поэтому простой document.getElementById
не поможет.
Лично я рекомендую использовать [ResizeObserver][1]
, который уже оптимизирован для такого типа событий,
const resizeObserver = new ResizeObserver(entries => {
for (let entry of entries) {
// ... entry has the full info about your element dimensions
}
});
resizeObserver.observe(document.getElementById('slider'));
В приложении React я бы использовал useEffect
для запуска и остановки наблюдения за размером элемента.
function App(){
useEffect(() => {
// start listening on app start
resizeObserver.observe(document.getElementById('slider'));
return () => {
// clean
resizeObserver.unobserve(document.getElementById('slider'));
}
}, []);
}
Вы пытаетесь использовать императивный код DOM внутри жизненного цикла React - вы не можете (по крайней мере, не так).
Зависимости useEffect
могут зависеть только от переменных, которые отслеживает React: состояние и свойства. React не может знать, когда изменится document.getElementById('slider')
. Он не знает, что это такое и как это проверить. Код проверки изменений зависимостей не запускается в цикле, постоянно проверяя переменные. Он запускается только при изменении state
или props
этого компонента. Если они не изменятся, React не будет проверять зависимости и не узнает, что они изменились.
Вы должны управлять любым кодом, который должен отслеживать изменения окна, необходим для запуска старого ванильного JS-способа.
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.