当我有多个 setState in useEffect 时如何避免重新渲染?
我想进行 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']);
})
},[]);
我想要在所有设置之后只进行一次渲染。 我知道在每次设置后重新渲染是正确的,但是我怎么能让它只做一个呢?将所有状态放在一个对象中好吗?喜欢类状态?
如果您不想使用 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'] })
})
你应该尝试链接承诺
useEffect(()=> {
axios.get('http://localhost:81/api/myapi/')
.then(res => {
setName(res.data['name']);
setPrice(res.data['price']);
})
.then(() => axios.get('http://localhost:81/api/mysecondapi/'))
.then(res => {
setColors(res.data['colors']);
})
},[]);
如果你必须分离axios
调用,react 将无法批量更新状态。