当前位置: 首页 > 知识库问答 >
问题:

在React.js中正确修改状态数组

东方高洁
2023-03-14

我想在状态数组的末尾添加一个元素,这是正确的方法吗?

this.state.arrayvar.push(newelement);
this.setState({ arrayvar:this.state.arrayvar });

我担心使用push修改阵列可能会导致问题-安全吗?

另一种方法是复制数组,然后setStateing这似乎是浪费。

共有3个答案

穆城
2023-03-14

使用ES6的最简单方法:

this.setState(prevState => ({
    array: [...prevState.array, newElement]
}))
澹台逸明
2023-03-14

如果您使用的是ES6,则最简单。

initialArray = [1, 2, 3];

newArray = [ ...initialArray, 4 ]; // --> [1,2,3,4]

新阵列将是[1,2,3,4]

要在React中更新您的状态

this.setState({
  arrayvar:[...this.state.arrayvar, newelement]
});

了解有关阵列分解的详细信息

赵嘉悦
2023-03-14

反应文档说:

对待this.state就好像它是不可改变的。

您的push将直接改变状态,这可能导致容易出错的代码,即使您在之后再次“重置”状态。例如,它可能导致一些生命周期方法,如componentdiddupdate不会触发。

在以后的React版本中,建议在修改状态以防止竞争条件时使用更新程序函数:

this.setState(prevState => ({
  arrayvar: [...prevState.arrayvar, newelement]
}))

与使用非标准状态修改可能面临的错误相比,内存“浪费”不是问题。

早期版本的替代语法

您可以使用conat获得一个干净的语法,因为它返回一个新数组:

this.setState({ 
  arrayvar: this.state.arrayvar.concat([newelement])
})

在ES6中,您可以使用扩展运算符:

this.setState({
  arrayvar: [...this.state.arrayvar, newelement]
})
 类似资料:
  • 问题内容: 我想在数组的末尾添加一个元素,这是正确的方法吗? 我担心如果就地修改阵列可能会造成麻烦-是否安全? 制作数组副本的另一种选择似乎是浪费的。 问题答案: 该阵营的文档说: 将此this.state视为不可变的。 您将直接更改状态,即使您此后再次“重置”状态,也有可能导致易于出错的代码。F.ex,它可能导致某些生命周期方法(如不会触发)。 在更高版本的React中,建议的方法是在修改状态以

  • 问题内容: 我想在数组的末尾添加一个元素,这是正确的方法吗? 我担心如果就地修改阵列可能会造成麻烦-是否安全? 制作数组副本的另一种选择似乎是浪费的。 问题答案: 该阵营的文档说: 将此this.state视为不可变的。 您将直接更改状态,即使您此后再次“重置”状态,也有可能导致易于出错的代码。F.ex,这可能会导致某些生命周期方法(如不会触发)。 在更高版本的React中,建议的方法是在修改状态

  • react set函数修改二维数组状态问题 一直到arr都是符合预期的,但是setRangIds执行后,每次打印rangIds都没有变化

  • 我有一个通过数组工作的代码,实际上我希望传入ArrayList。 下面是示例: 这是我现在的改编... 我不明白我的错误??我不知道正确的语法... 有关信息,这里的代码 大体上 非常感谢你的帮助。

  • 在这个项目中,我使用了反应钩,这个片段用来改变项目的颜色主题,但有一个问题,我无法解决。常量lightTheme={...} Lorem ipsum dolor sit amet,consectetur adipiscing elit,sed do eusmod tempor incidunt ut labore et dolore magna aliqua. 我的减速器:

  • 问题内容: 我本质上是在尝试做出回应,但是有一些问题。 这是档案 当你点击按钮A,在RadioGroup中组件需要去选择按钮B 。 “选定”仅表示来自状态或属性的className 这里是: 的来源并不重要,它具有触发原始DOM 事件的常规HTML单选按钮 预期流量为: 点击按钮“ A” 按钮“ A”触发本地DOM事件onChange,该事件一直持续到RadioGroup 调用RadioGroup