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,
}));