更新状态数组中的一个值反应原生

Posted

技术标签:

【中文标题】更新状态数组中的一个值反应原生【英文标题】:updating one value in State array react native 【发布时间】:2018-11-09 05:33:05 【问题描述】:

尝试更新 this.state 中数组的一个元素时出现(预期的)错误,但看不到哪里出错了。我是否需要创建一个临时数组更新,然后将整个数组分配回状态

这基本上就是我所拥有的

this.state =  array: ['a', 'b', 'c'] ;

onBack() 
  this.setState(
      array[2]: 'something' 
  );

【问题讨论】:

Do I need to create a temporary array update that, then assign the whole array back to the state @DragoşPaulMarinescu 是正确的,这种方法是最好的方法! 【参考方案1】:

你不能这样更新状态。

永远不要直接改变 this.state,因为之后调用 setState() 可能会替换你所做的改变。将 this.state 视为不可变的。

阅读React docs。

你可以这样做:

let newArray = [...this.state.array];
newArray[2] = 'somethingElse';
this.setState(array: newArray);

上面的例子是使用Spread Syntax。

有多种方式可以修改状态,但所有方式都应确保数据被视为不可变。你可以在 React here 中阅读更多关于处理状态的内容@

【讨论】:

赞成传播运算符方法,也只是为了获得额外的知识,这对于状态的直接突变或使用传播运算符会更好? 直接变异会更快,因为您不必创建副本,但这会导致状态不一致,并且永远不应该这样做。扩展运算符基本上创建了原始数组的副本。【参考方案2】:

Manoj 的回答会起作用,还有另一种方法使用更新程序函数 (funtinal setState)setState(您可以阅读有关 here 的信息)

onBack() 
  this.setState(prevState => 
    let newArray = prevState.array
    newArray[2] = "something"
    return  array: newArray 
  );

【讨论】:

【参考方案3】:

使用Object.assign();

let array= Object.assign(, this.state.array); //creating copy of object

array[2]="something"

this.setState(array);

【讨论】:

【参考方案4】:

如果您不想使用扩展函数在currentArray 上设置新的更新数组,您可以使用Array.from(duplicateArray)

let duplicateArray = [...currentArray] //duplicate the array into new array
duplicateArray[index].value = 'x'; // update the field you want to update
setCurrentArray(Array.from(duplicateArray )) //set the new updated array into currentArray

我为这个问题烦恼,我只是搜索了一下,我看到了这个想法,它有效! https://github.com/facebook/react-native/issues/21734#issuecomment-433885436

【讨论】:

【参考方案5】:

使用钩子

const [totalSet, setTotalSet] = useState(null);

console.log(totalSet); // sets: Array(3), subscribed: false

setTotalSet(datas => (
    ...datas,
    sets: updatedSet,
  ));

【讨论】:

【参考方案6】:

创建一个临时数组更新,然后将整个数组分配回状态

var arr = [];
arr = this.state.array;
arr[2] = "something";
this.setState(
    array : arr
);

【讨论】:

这是错误的,因为它直接改变了状态。 arr = this.state.array 的行为与您的预期不同。 我已经尝试过使用我自己的演示项目,并且它可以按照 OP 的要求正常工作。 因为这是根本错误的,不应该是公认的答案。 arr = this.state.array 不会创建新数组,而是创建对 state.array 的引用。在您执行arr[2] = "something" 之后尝试控制台记录this.state.array,看看会发生什么。 您显然不了解不变性以及我要解释的内容,所以我要停下来。 对此感到抱歉,感谢您澄清了不可变状态的概念,我google了它并试图理解。

以上是关于更新状态数组中的一个值反应原生的主要内容,如果未能解决你的问题,请参考以下文章

每半秒反应一次原生 SetState 数组 使 App 挂起大数据

如何在反应原生中过滤多个选择下拉字段中的数组值

使用上下文和钩子更新未安装组件的状态 - 反应原生

如何将新的键:值对添加到已经存在的数组状态变量反应原生

反应原生初始区域不随状态更新

更新来自其他组件的道具反应原生