操作数组的核心思想
在 JavaScript 中,数组只是另一种对象。与 objects 一样,您应该将处于 React 状态的数组视为 read-only。
这意味着您不应该重新分配数组中的项目,例如
arr[0] = 'bird'
,也不应该使用改变数组的方法,例如
push()
和
pop()
。
相反,每次您想更新一个数组时,您都需要将一个新数组传递给您的状态设置函数。为此,您可以通过调用其非变异方法(如
filter()
和
map()
)从您所在 state 的原始数组创建一个新数组。然后您可以将您的状态设置为生成的新数组。
这里有一个常见数组操作的参考表。在处理 React 状态中的数组时,您需要避免使用左栏中的方法,而更喜欢右栏中的方法:
标题
|
|
|
|
避免(改变数组)
|
更喜欢(返回一个新数组)
|
添加
|
push, unshift
|
concat,[...arr]传播语法
|
删除
|
pop, shift, splice
|
filter, slice
|
更换
|
splice,arr[i] = ...赋值
|
map
|
排序
|
reverse, sort
|
首先复制数组
|
或者,您可以使用
Immer
,它允许您使用来自两列的方法。
陷阱
slice和splice命名相似但有很大不同:
slice 让您复制数组或其中的一部分。
splice
改变数组
(插入或删除项目)。
在 React 中,你会更频繁地使用slice(而不是 splice)
因为你不应该直接改变状态中的对象或数组。
[...arr]是浅拷贝
即使你使用
[...arr]
复制了一个数组,你也不能直接改变其中的现有项。
这是因为复制是浅层的——新数组将包含与原始数组相同的项。
这里一定要注意,可以通过更新嵌套对象来解决
详见:
更新数组中的对象
你可以使用 [...arr] 进行操作,来代替
添加到数组末尾的 push()
添加到数组头部的 unshift()