#javascript #reactjs #resize
Вопрос:
пример: изменение размера с помощью react js
это мой код:
import React, { useState, useEffect } from 'react';
const getWidthWindow = () => {
const [widthWindow, setWidthWindow] = useState(null)
const updateDimensions = () => {
setWidthWindow(window.screen.width)
}
useEffect(() => {
console.log(widthWindow)
setWidthWindow(window.screen.width)
updateDimensions()
window.addEventListener('resize', updateDimensions)
return () => window.removeEventListener('resize', updateDimensions)
}, [widthWindow])
}
export default getWidthWindow;
Я хочу получить значение ширины окна, но результат как будто не соответствует размеру окна, так как это исправить?
Ответ №1:
Ваш код верен, но ведение журнала-нет.
Добавьте крючок для регистрации измерений при их обновлении:
useEffect(() => {
console.log(windowDimensions)
}, [windowDimensions])
Комментарии:
1. Я попытался сделать это так и попытался добавить к этому ваше предложение: codesandbox.io/s/broken-darkness-6iyoi? файл=/src/… но все равно не так
2. Ой, я забыл раскошелиться на Песочницу. Я обновил ссылку.
Ответ №2:
Я согласен с приведенным выше ответом о добавлении размеров окон в массив зависимостей useEffect, но мне нравится добавлять немного сахара поверх него..
При изменении размера событие запускается непрерывно и немного влияет на производительность.. Итак, я внедрил регулирование для повышения производительности..
Ответ на ваш обновленный вопрос: Ссылка на Stackblitz
const GetWidthWindow = () => {
const [widthWindow, setWidthWindow] = useState(window.innerWidth);
useEffect(() => {
let throttleResizeTimer = null;
function handleResize() {
clearTimeout(throttleResizeTimer);
throttleResizeTimer = setTimeout(
() => setWidthWindow(window.innerWidth),
500
);
}
window.addEventListener('resize', handleResize);
return () => window.removeEventListener('resize', handleResize);
}, [widthWindow]);
return <p>{JSON.stringify(widthWindow)}</p>;
};
export default GetWidthWindow;
Ответ на твой старый вопрос:
useEffect(() => {
// implement throttle for little performance gain
let throttleResizeTimer = null;
function handleResize() {
clearTimeout(throttleResizeTimer);
throttleResizeTimer = setTimeout(
() => setWindowDimensions(getWindowDimensions()),
500
);
}
window.addEventListener('resize', handleResize);
return () => window.removeEventListener('resize', handleResize); }, [windowDimensions]);