Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.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
React native 无法使用useState更改函数组件上的数组数据_React Native_React Hooks - Fatal编程技术网

React native 无法使用useState更改函数组件上的数组数据

React native 无法使用useState更改函数组件上的数组数据,react-native,react-hooks,React Native,React Hooks,我有一个列表,当用户单击每个项目时,将更改我的数组数据 我的性别数组的第一个数据是: [ {optionName: "Man", sex: 1, selected: true}, {optionName: "Woman", sex: 1, selected: false} ] 当单击index==0时 当单击index==1时 当我使用setTimeout 这是因为您试图直接在newGender.map迭代中更新原始数据项 newGender.map((value, index)

我有一个列表,当用户单击每个项目时,将更改我的数组数据

我的性别数组的第一个数据是:

[
  {optionName: "Man", sex: 1, selected: true},
  {optionName: "Woman", sex: 1, selected: false}
]

当单击index==0时

当单击index==1时

当我使用
setTimeout


这是因为您试图直接在
newGender.map
迭代中更新原始数据项

newGender.map((value, index) => {
  console.log('before', genderOption[index].selected);
  genderOption[index].selected = false; <------ this line is wrong
  console.log('after', genderOption[index].selected);
} );

这是因为您试图直接在
newGender.map
iteration中更新原始数据项

newGender.map((value, index) => {
  console.log('before', genderOption[index].selected);
  genderOption[index].selected = false; <------ this line is wrong
  console.log('after', genderOption[index].selected);
} );

通过映射上一个状态并通过比较索引设置
selected
,可以轻松解决此问题

const-onItemPress=(项目,i)=>{
setGenderOption(prevState=>prevState.map((性别,索引)=>({
…性别,
所选:i==索引,
}));
};

您可以通过映射上一个状态,并通过比较索引设置
选定的
来轻松解决此问题

const-onItemPress=(项目,i)=>{
setGenderOption(prevState=>prevState.map((性别,索引)=>({
…性别,
所选:i==索引,
}));
};

谢谢你的帮助,我一定很累了。我将我的代码更正为
newGender
,选择的结果两者仍然
true
。我评论
setGenderOption([…newGender]);
结果将是
[{optionName:“Man”,sex:1,selected:false},{optionName:“Woman”,sex:1,selected:true}]
太奇怪了,你能检查一下当按下其中一项时时间
是如何被调用的吗?使用
控制台。记录
并打印每次调用中索引
i
的值。那么可能是因为你直接更新了原始数据,我已经更新了我的答案,你可以检查它是否有效。据我所知,在react(和react native)中,使用浅比较(==)比较对象为了重新渲染,所以当您尝试直接更改数组中的项目时,实际上数组引用本身不会更改,换句话说,必须通过
setState
方法更新对象,以确保它们的引用会更改。我不熟悉React新版本中的挂钩机制,但可能它具有sam导致您在代码中看到的强度行为的机制。如果我发现任何其他有关该行为的精确信息,我将更新我的帖子。感谢您的帮助,我一定很累了。我将代码更正为
newGender
,所选结果仍然
true
。我评论
setGenderOption([…newGender])
结果将是
[{optionName:“男性”,性别:1,所选:假},{optionName:“女性”,性别:1,所选:真}]
太奇怪了,你能检查一下当按下其中一项时时间
是如何被调用的吗?使用
控制台。记录
并打印每次调用中索引
i
的值。那么可能是因为你直接更新了原始数据,我已经更新了我的答案,你可以检查它是否有效。据我所知,在react(和react native)中,使用浅比较(==)比较对象为了重新渲染,所以当您尝试直接更改数组中的项目时,实际上数组引用本身不会更改,换句话说,必须通过
setState
方法更新对象,以确保它们的引用会更改。我不熟悉React新版本中的挂钩机制,但可能它具有sam这是一种机制,它会导致你在代码中看到的强度行为。如果我发现任何其他有关这方面的精确信息,我会更新我的帖子。它是有效的!非常感谢你的帮助。但是为什么我会遇到问题?我想我为我的状态设置了一个不同的数组。你能告诉我为什么吗?谢谢。它是有效的!非常感谢你的帮助。但是为什么会有一个I挡我的路了吗?我想我给我的状态设置了一个不同的数组。你能告诉我为什么吗?谢谢。
const newGender = genderOption.map((value, index) => ({
  ...value,
  selected = false,
}));