Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 即使未调用本机useState更新,也要作出反应_Reactjs_React Native_React Redux - Fatal编程技术网

Reactjs 即使未调用本机useState更新,也要作出反应

Reactjs 即使未调用本机useState更新,也要作出反应,reactjs,react-native,react-redux,Reactjs,React Native,React Redux,所以我用react native做了一些相当简单的事情。我有一个函数,它创建状态的副本,最初是一个数组,然后更新副本,最后调用setState来更新原始数组。然而,当我改变副本时,出于某种奇怪的原因,它也会改变数组的状态,即使我不调用setState。我尝试了所有我认为可能修复它的方法,使用切片,[…复制],拼接它,什么都没有,它仍然会变异,为什么,我只是不明白为什么它会变异?如果有人能帮助我,我将不胜感激 下面是函数 函数completeTaskHandler(目标名称、任务ID、任务索引、

所以我用react native做了一些相当简单的事情。我有一个函数,它创建状态的副本,最初是一个数组,然后更新副本,最后调用setState来更新原始数组。然而,当我改变副本时,出于某种奇怪的原因,它也会改变数组的状态,即使我不调用setState。我尝试了所有我认为可能修复它的方法,使用切片,[…复制],拼接它,什么都没有,它仍然会变异,为什么,我只是不明白为什么它会变异?如果有人能帮助我,我将不胜感激

下面是函数

函数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是的,这也解决了问题