设置状态而不使用 useEffect 重新渲染不起作用
Setting state without re-rendering with useEffect not working
我只需要我的状态值根据屏幕调整实时时间进行更改。即使我的屏幕尺寸发生变化,我的计数值也保持不变,除非我重新加载页面。这需要实时更新以获得更好的响应式设计。这是我的代码。谢谢!
import React, { useState, useEffect } from 'react';
import Carousel from '@brainhubeu/react-carousel';
import '@brainhubeu/react-carousel/lib/style.css';
import { useMediaQuery } from 'react-responsive'
const MyCarousel = () => {
useEffect(() => {
loadMediaQuery();
}, []);
const [count, setCount] = useState(0);
const loadMediaQuery = () =>{
if (tablet)
setCount(1)
if (phone)
setCount(2)
if (desktop)
setCount(3)
}
const tablet = useMediaQuery({
query: '(max-width: 876px)'
})
const phone = useMediaQuery({
query: '(max-width: 576px)'
})
const desktop = useMediaQuery({
query: '(min-width: 876px)'
})
return (
<div>
<Carousel slidesPerPage={count} >
<img className="image-one"/>
<img className="image-two"/>
<img className="image-three"/>
</Carousel>
</div>
);
}
那是因为你的useEffect
没有依赖关系,所以它只在组件安装后加载一次。
要解决这个问题,您应该使用以下代码:
import React, { useState, useEffect } from 'react';
import Carousel from '@brainhubeu/react-carousel';
import '@brainhubeu/react-carousel/lib/style.css';
import { useMediaQuery } from 'react-responsive';
const MyCarousel = () => {
const tablet = useMediaQuery({
query: '(max-width: 876px)'
});
const phone = useMediaQuery({
query: '(max-width: 576px)'
});
const desktop = useMediaQuery({
query: '(min-width: 876px)'
});
useEffect(() => {
loadMediaQuery();
}, [tablet, phone, desktop]);
const [count, setCount] = useState(0);
const loadMediaQuery = () =>{
if (tablet)
setCount(1)
else if (phone)
setCount(2)
else if (desktop)
setCount(3)
}
return (
<div>
<Carousel slidesPerPage={count} >
<img className="image-one"/>
<img className="image-two"/>
<img className="image-three"/>
</Carousel>
</div>
);
}
useEffect
表示:在呈现此组件后运行传递给 useEffect
的回调函数,并且由于您传递了一个空数组作为第二个参数,这意味着 useEffect
是执行一次,仅在该组件第一次呈现时执行(而不是在状态更改时执行),因为您的函数调用在 useEffect 内部,它仅在您重新加载页面时起作用,您可以将变量添加到空数组中Mohamed Magdy 做了,或者只是在 useEffect
之外再次调用 loadMediaQuery
扩展 this answer 中提供的自定义挂钩,您可以执行类似
的操作
const [width, height] = useWindowSize();
useEffect(() => {
loadMediaQuery();
}, [width]);
那个useEffect
函数说:每次width
的值改变时执行loadMediaQuery()
。
我只需要我的状态值根据屏幕调整实时时间进行更改。即使我的屏幕尺寸发生变化,我的计数值也保持不变,除非我重新加载页面。这需要实时更新以获得更好的响应式设计。这是我的代码。谢谢!
import React, { useState, useEffect } from 'react';
import Carousel from '@brainhubeu/react-carousel';
import '@brainhubeu/react-carousel/lib/style.css';
import { useMediaQuery } from 'react-responsive'
const MyCarousel = () => {
useEffect(() => {
loadMediaQuery();
}, []);
const [count, setCount] = useState(0);
const loadMediaQuery = () =>{
if (tablet)
setCount(1)
if (phone)
setCount(2)
if (desktop)
setCount(3)
}
const tablet = useMediaQuery({
query: '(max-width: 876px)'
})
const phone = useMediaQuery({
query: '(max-width: 576px)'
})
const desktop = useMediaQuery({
query: '(min-width: 876px)'
})
return (
<div>
<Carousel slidesPerPage={count} >
<img className="image-one"/>
<img className="image-two"/>
<img className="image-three"/>
</Carousel>
</div>
);
}
那是因为你的useEffect
没有依赖关系,所以它只在组件安装后加载一次。
要解决这个问题,您应该使用以下代码:
import React, { useState, useEffect } from 'react';
import Carousel from '@brainhubeu/react-carousel';
import '@brainhubeu/react-carousel/lib/style.css';
import { useMediaQuery } from 'react-responsive';
const MyCarousel = () => {
const tablet = useMediaQuery({
query: '(max-width: 876px)'
});
const phone = useMediaQuery({
query: '(max-width: 576px)'
});
const desktop = useMediaQuery({
query: '(min-width: 876px)'
});
useEffect(() => {
loadMediaQuery();
}, [tablet, phone, desktop]);
const [count, setCount] = useState(0);
const loadMediaQuery = () =>{
if (tablet)
setCount(1)
else if (phone)
setCount(2)
else if (desktop)
setCount(3)
}
return (
<div>
<Carousel slidesPerPage={count} >
<img className="image-one"/>
<img className="image-two"/>
<img className="image-three"/>
</Carousel>
</div>
);
}
useEffect
表示:在呈现此组件后运行传递给 useEffect
的回调函数,并且由于您传递了一个空数组作为第二个参数,这意味着 useEffect
是执行一次,仅在该组件第一次呈现时执行(而不是在状态更改时执行),因为您的函数调用在 useEffect 内部,它仅在您重新加载页面时起作用,您可以将变量添加到空数组中Mohamed Magdy 做了,或者只是在 useEffect
loadMediaQuery
扩展 this answer 中提供的自定义挂钩,您可以执行类似
的操作const [width, height] = useWindowSize();
useEffect(() => {
loadMediaQuery();
}, [width]);
那个useEffect
函数说:每次width
的值改变时执行loadMediaQuery()
。