我理解array.push()
返回变异数组而不是新长度的期望。以及出于链接原因使用此语法的愿望。
但是,有一种内置方法可以做到这一点:array.concat()
. 请注意,concat
期望给定一个数组,而不是一个项目。因此,请记住包装要添加的项目([]
如果它们尚未在数组中)。
newArray = oldArray.concat([newItem]);
数组链接可以通过使用来完成.concat()
,因为它返回一个数组,
但不是通过.push()
,因为它返回一个整数(数组的新长度)。
这是用于根据其先前值React
更改变量的常用模式:state
// the property value we are changing
selectedBook.shelf = newShelf;
this.setState((prevState) => (
{books: prevState.books
.filter((book) => (book.id !== selectedBook.id))
.concat(selectedBook)
}
));
state
object 有一个books
属性,它包含一个book
.
book
是一个具有id
, 和shelf
属性(等等)的对象。
setState()
接受一个对象,该对象包含要分配给的新值state
selectedBook
已在books
数组中,但shelf
需要更改其属性。
然而,我们只能给出setState
一个顶级对象。
我们不能告诉它去寻找这本书,并在那本书上寻找一个属性,并赋予它这个新的价值。
所以我们按books
原样使用数组。
filter
删除selectedBook
.
然后在更新它的属性后concat
重新添加。selectedBook
shelf
想要链接的很好用例push
。
但是,执行此操作的正确方法实际上是使用concat
.
摘要:
array.push()
将返回一个数字(变异数组的新长度)。
array.concat([])
将返回一个新的“变异数组”。
从技术上讲,它返回一个新数组,其中添加了修改后的元素,并保持初始数组不变。返回一个新的数组实例,而不是回收现有的数组实例是一个重要的区别,这使得 React 应用程序中的状态对象非常有用,可以获取更改的数据以重新渲染。