我有以下代码:
const [ ddFilterData, setddFilterData ] = useState('');
useEffect(() => {
getDropdownData();
}, [ddFilterData]);
const getDropdownData = async () => {
if(optionDetails) {
let filteredData = Promise.all(
optionDetails.map(async (item, i) => {
const fltData = await filterData(item, props.items);
return fltData
})
)
filteredData.then(returnedData => {
setddFilterData(returnedData);
})
}
}
我需要用useEffect执行ddFilerData与新数据或不同数据的时间更改。 据我了解,它应该仅在ddFilterData不同时更新或运行否?
当前,它在每次更改时运行。即使您的filteredData没有不同,上面的代码也会进入无限循环。有什么想法我做错了吗?
答案 0 :(得分:3)
您的service-worker.js
是一个数组。因此,当您执行workbox-runtime-23a7fd67.js
时,将为returnedData
设置一个新值。因为React使用Object.is进行比较,所以即使数组元素与以前相同,它仍然是一个不同的对象,并且将再次触发setddFilterData(returnedData)
,从而导致无限循环。
答案 1 :(得分:0)
您的getDropdownData
方法正在更新ddFilterData
,这会导致重新渲染。在重新渲染时,您会被称为getDropdownData
,由于这种循环行为,您将ddFilterData
更新为 const [ ddFilterData, setddFilterData ] = useState('');
useEffect(() => {
getDropdownData();
}, []);
useEffect(() => {
// put your code here if you want to do something on change of ddFilterData
}, [getDropdownData]);
const getDropdownData = async () => {
if(optionDetails) {
let filteredData = Promise.all(
optionDetails.map(async (item, i) => {
const fltData = await filterData(item, props.items);
return fltData
})
)
filteredData.then(returnedData => {
setddFilterData(returnedData);
})
}
}
。
像这样修改您的代码:
<Stack.Screen
name="FuncName"
component={FuncName}
options={{
headerTitle:''
}}/>