我以前从来没有遇到过这种情况,我不知道为什么会发生这种情况。
我有两个组件在子组件的useEffect中创建了一个无限循环:
function Container(){
return <div> <Description /> </div>
}
// If I remove "= []" part no infinite loop is created
function Description({list = []}){
const [dict, setDict] = useState({})
useEffect(() => {
console.log('this is for the inifinite loop log')
setDict({}) // also, If a remove this line no infinite loop is created
}, [list])
return <div>something...</div>
}
**编辑:这段代码只是我的问题的简化**
我知道默认数组是用不同的内存指针创建的,每次组件重新渲染,但没有办法把列表作为默认道具,同时使用它作为一个useEffect参数?
当React的函数组件的状态发生变化时,会再次调用该函数。当函数组件的状态发生变化时,如果useEffect
的依赖数组也发生变化,则调用useEffect
中的回调。
在上面的代码中调用setDict
时,每次都会创建一个新的数组实例,这是list
中的默认值,因此useEffect
更新回调继续被调用。
所以你可以通过使用相同的实例数组来使用空数组作为默认值。
const emptyArray = [];
// If I remove "= []" part no infinite loop is created
function Description({list = emptyArray}){
const [dict, setDict] = useState({})
useEffect(() => {
console.log('this is for the inifinite loop log')
setDict({}) // also, If a remove this line no infinite loop is created
}, [list])
return <div>something...</div>
}
通过上面的示例代码,我不知道您想要的最终目的是什么。我认为您的代码通过处理来自父组件的list
来创建setDict
的参数。一般来说,我认为Description
的父级只向list
prop发送数组或空数组值。如果是这样,我认为这是一个更好的方法来导致一个错误,当数组不支持空数组,这是list
的默认值。
这很可能是因为list
数组在内存中不是同一个对象,并且每次渲染都会创建新的数组。
如果你在setDict
中有一个默认的{},你不需要在useEffect
中重新分配它。
这也可能是由于您没有通过Description
组件在Container
函数中将list
作为prop传递。如果你传递那个prop,你也应该这样来缓解无限循环。