gpt4 book ai didi

javascript - useEffect中存在多个useState,如何避免重新渲染?

转载 作者:行者123 更新时间:2023-11-28 17:02:21 24 4
gpt4 key购买 nike

当 useEffect 中有多个 setState 时,如何避免重新渲染?

我想进行 2 个 API 调用并在 useEffect 中设置 3 个不同的状态(当组件挂载时),并且只需要一次重新渲染

类似这样的事情

useEffect(()=>{
axios.get('http://localhost:81/api/myapi/')
.then(res=>{
setName(res.data['name']);
setPrice(res.data['price']);
})

axios.get('http://localhost:81/api/mysecondapi/')
.then(res=>{
setColors(res.data['colors']);
})
},[]);

在所有设置之后我只想要一个渲染。我知道在每次 setStates 之后重新渲染是正确的,但是我怎样才能让它只执行一次呢?将所有状态放入一个对象中好吗?像类状态?

最佳答案

如果您不想使用 useReducer,可以在提取中使用 Promise.all

useEffect(()=>{
const stateData = {}
const fetch1 = axios.get('http://localhost:81/api/myapi/')
const fetch2 = axios.get('http://localhost:81/api/mysecondapi/')
Promise.all([fetch1, fetch2]).then(([res1,res2])=>{
setName(res1.data['name']);
setPrice(res1.data['price']);
setColors(res2.data['colors']);
})
},[]);

这将导致 3 次重新渲染,但这与 3 次 DOM 更新不同。

如果您只想一次重新渲染,请将所有更新合并到一个对象中:

Promise.all([fetch1, fetch2]).then(([res1, res2]) => {
setNamePriceColor({ name: res1.data['name'],
price: res1.data['price'],
colors: res2.data['colors'] })
})

关于javascript - useEffect中存在多个useState,如何避免重新渲染?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56990035/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com