Reactjs 即使未调用本机useState更新,也要作出反应
所以我用react native做了一些相当简单的事情。我有一个函数,它创建状态的副本,最初是一个数组,然后更新副本,最后调用setState来更新原始数组。然而,当我改变副本时,出于某种奇怪的原因,它也会改变数组的状态,即使我不调用setState。我尝试了所有我认为可能修复它的方法,使用切片,[…复制],拼接它,什么都没有,它仍然会变异,为什么,我只是不明白为什么它会变异?如果有人能帮助我,我将不胜感激 下面是函数Reactjs 即使未调用本机useState更新,也要作出反应,reactjs,react-native,react-redux,Reactjs,React Native,React Redux,所以我用react native做了一些相当简单的事情。我有一个函数,它创建状态的副本,最初是一个数组,然后更新副本,最后调用setState来更新原始数组。然而,当我改变副本时,出于某种奇怪的原因,它也会改变数组的状态,即使我不调用setState。我尝试了所有我认为可能修复它的方法,使用切片,[…复制],拼接它,什么都没有,它仍然会变异,为什么,我只是不明白为什么它会变异?如果有人能帮助我,我将不胜感激 下面是函数 函数completeTaskHandler(目标名称、任务ID、任务索引、
函数completeTaskHandler(目标名称、任务ID、任务索引、更新操作){
const tasksnashot=tasks.slice();
console.log(tasksnashot);//记录副本
console.log(tasks);//记录原始数组
taskSnapShot[taskIndex].isComplete=“true”;
console.log(taskSnapShot);//导致数组发生变异
console.log(tasks);//还会导致数组发生变异为什么??
};代码>这有点棘手。当您这样做时:
const taskSnapShot = tasks.slice();
您创建了一个新数组,但在该数组中,您不会从任务中复制对象,而只会引用这些对象。因此,基本上,taskSnapShot
是一个引用数组。因此,当您在任务快照
中修改对象时,您也可以在任务
中修改它
要解决此问题,必须复制要修改的对象:
const taskSnapShot = [...tasks];
taskSnapShot[taskIndex] = {...taskSnapShot[taskIndex], isComplete: true};
这有点棘手。当您这样做时:
const taskSnapShot = tasks.slice();
您创建了一个新数组,但在该数组中,您不会从任务中复制对象,而只会引用这些对象。因此,基本上,taskSnapShot
是一个引用数组。因此,当您在任务快照
中修改对象时,您也可以在任务
中修改它
要解决此问题,必须复制要修改的对象:
const taskSnapShot = [...tasks];
taskSnapShot[taskIndex] = {...taskSnapShot[taskIndex], isComplete: true};
切片创建浅层副本,因此进行嵌套更改也将更改基础状态数组对象。改为使用map或reduce之类的东西。好吧,所以我复制了它,就像so const copy=tasks.map(val=>val)一样,它仍然会改变原始状态。我的意思是在任务上使用map
并使用更新的值创建新对象。仅仅这样做地图仍然会导致同样的问题<代码>常量结果=tasks.map(task=>{return{…task,whatever})代码>@Alexander Staroselsky yes这也解决了问题Slice创建浅拷贝,因此进行嵌套更改也将更改底层状态数组对象。改为使用map或reduce之类的东西。好吧,所以我复制了它,就像so const copy=tasks.map(val=>val)一样,它仍然会改变原始状态。我的意思是在任务上使用map
并使用更新的值创建新对象。仅仅这样做地图仍然会导致同样的问题<代码>常量结果=tasks.map(task=>{return{…task,whatever})代码>@Alexander Staroselsky是的,这也解决了问题