reactjs - 仅当状态与当前值不同时如何在反应挂钩中设置状态
问题描述
我有以下代码
setInterval(() => {
fetch(`/clusters?type=${type}`)
.then((response) => response.json()
.then((responseBody) => {
if(clusters !== responseBody.members)
setClusters(responseBody.members);
}))
.catch();
}, 5000);
由于clusters
在检查if(clusters !== responseBody.members)
clusters
始终为空时异步设置,所以哪种方法是正确的?我试图这样做是为了减少渲染,因为该请求每 5 秒发生一次
解决方案
那是因为你得到的状态已经过时了。您可以做的是使用创建一个 ref useRef
,然后在另一个内部使用useEffect
您的状态的当前值更新 ref。然后在获取数据后使用 ref 将其与状态进行比较,如下所示:
function App() {
const [clusters, setClusters] = useState([]);
const clustersRef = useRef(clusters);
useEffect(() => {
clustersRef.current = clusters;
});
useEffect(() => {
setInterval(() => {
fetch(`/clusters?type=${type}`)
.then((response) => response.json()
.then((responseBody) => {
if(clustersRef.current !== responseBody.members)
setClusters(responseBody.members);
}))
.catch();
}, 5000);
}, []);
}
希望这可以帮助 :)
推荐阅读
- java - 如何在 chrome 80 中允许跨域 cookie
- excel - 根据员工出勤率添加列值
- ios - 如何下载 Firebase 存储文件
- reactjs - 如何更改 React 中文件夹的默认导出名称?
- spring - 如何使用mybatis直接查询?
- java - java - 如何忽略在java中从lombok生成一个字段
- javascript - 使用 Chart.js 在直方图中放大功能
- amazon-web-services - 使用 openvpn 与 Amazon RDS 的 VPN 连接突然失败
- android - android中的数据绑定导致找不到符号ActivityMainBindingImpl时出错
- image-processing - 透明基板上光学涂层镜面反射的可视化