gpt4 book ai didi

reactjs - 在 useEffect 中处理 forEach 后调用 setstate

转载 作者:行者123 更新时间:2023-12-04 07:23:18 26 4
gpt4 key购买 nike

我正在尝试在 useEffect 上处理一些 api 数据,在处理数据时我需要将其设置为各种状态,在处理数据时,由于某些原因 useEffect 被无限触发。尽管从类组件中我知道 setState 是一个异步操作,它不等待 forEach 的完成。我们是否有功能组件的解决方法。

  useEffect(() => {
const apiResponse = fetchAppName();
apiResponse.then(
(response) => {
// if (response.statusCode === '200' && response.status.statusType === 'SUCCESS' && response.data) {
const dataFields = {};
const appNameValues = [];
dummyData.data.forEach((ele) => {
const workFlowIds = [];
ele.workflowConfigs.forEach((wc) => {
workFlowIds.push(wc.workflowId);
})
dataFields[ele.name] = workFlowIds;
});
Object.keys(dataFields).forEach((k) => {
appNameValues.push(k);
});
setAppData(dataFields);
setDropDownOptions({
...dropDownOptions,
appName: appNameValues,
});
// }
}).catch((e)=>{
console.log('Failed to fetchAppNames due to: ', e);
});
},[setDropDownOptions, dropDownOptions]);

最佳答案

问题
不要使用由效果更新的依赖项。换句话说,dropDownOptions是一个依赖项,效果会更新它,从而创建一个渲染循环。
解决方案
状态更新器功能稳定,所以没必要,使用功能状态更新去除其他dropDownOptions依赖性。
useState

Note

React guarantees that setState function identity is stable and won’tchange on re-renders. This is why it’s safe to omit from the useEffector useCallback dependency list.

useEffect(() => {
const apiResponse = fetchAppName();
apiResponse.then(
(response) => {
// if (response.statusCode === '200' && response.status.statusType === 'SUCCESS' && response.data) {
const dataFields = {};
const appNameValues = [];
dummyData.data.forEach((ele) => {
const workFlowIds = [];
ele.workflowConfigs.forEach((wc) => {
workFlowIds.push(wc.workflowId);
})
dataFields[ele.name] = workFlowIds;
});
Object.keys(dataFields).forEach((k) => {
appNameValues.push(k);
});
setAppData(dataFields);
setDropDownOptions(dropDownOptions => ({
...dropDownOptions,
appName: appNameValues,
}));
// }
}).catch((e)=>{
console.log('Failed to fetchAppNames due to: ', e);
});
},[]); // will run on mount, add other dependency triggers if needed.

关于reactjs - 在 useEffect 中处理 forEach 后调用 setstate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68368818/

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