javascript - 从数组中删除元素和突变的问题

标签 javascript reactjs

要从数组中删除元素而不改变状态,我在下面编写了这段代码,效果很好

const tmp = [ ...array ]
tmp.splice(i, 1)
setArray(tmp)

我稍微研究了一下代码,然后尝试了这个

array.splice(i, 1)
setArray([ ...array ])

但是我在用户界面中遇到了奇怪的行为。

那么这段代码有什么问题,因为我认为我没有改变状态,不是吗?

最佳答案

拼接 mutates the existing array :

The splice() method changes the contents of an array by removing or replacing existing elements and/or adding new elements in place.

在第一个代码中,您首先创建了数组的副本,因此发生变化的不是处于状态的对象,因此一切都很好。但在第二个代码中,您正在改变原始数组,如果您需要不可变的东西,这就是一个问题。 (尽管您随后传播了变异的原始数组的副本,但原始数组仍然发生了变异。)

例如:

const setArray = (newArray) => {
  // do something
};

const array = [1, 2, 3, 4];
const i = 2;

array.splice(i, 1)
setArray([ ...array ])

// Original array has been mutated:
console.log(array);

您也可以使用slice来代替:

const newArr = array.slice(0, i).concat(i + 1);
setArray(newArr);

关于javascript - 从数组中删除元素和突变的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58313110/

相关文章:

javascript - 创建一个新的div并移动现有的div

javascript - 对 JavaScript 语法感到困惑

javascript - 在创建事件中动态设置 jQuery ui slider 值

javascript - react "after render"代码?

javascript - 如何在多页面网站(非 SPA)中使用 react.js?

javascript - React 传播属性列表

javascript - Textfield 不允许我在 Firefox 中按键输入字符

javascript - 类型错误:无法读取未定义的 React 属性 'any'

javascript - bindActionCreators 在调度时调用

javascript - jQuery + 表格排序器 : Error when table is empty