React无限循环使用效果,当一个参数有一个数组作为默认值



我以前从来没有遇到过这种情况,我不知道为什么会发生这种情况。

我有两个组件在子组件的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的父级只向listprop发送数组或空数组值。如果是这样,我认为这是一个更好的方法来导致一个错误,当数组不支持空数组,这是list的默认值。

这很可能是因为list数组在内存中不是同一个对象,并且每次渲染都会创建新的数组。

如果你在setDict中有一个默认的{},你不需要在useEffect中重新分配它。

这也可能是由于您没有通过Description组件在Container函数中将list作为prop传递。如果你传递那个prop,你也应该这样来缓解无限循环。

最新更新