这是密码
funtion App(){
const [Cards, setCards] = useState([
{id: 0 , name: 'Harry Potter'},
{id: 1 , name: 'Hermonie Granger'},
{id: 2 , name: 'Ron Weasly'},])
const shuffle = (arr)=>{
// just shuffle the arr then return it.
}
return (
<div className="App">
<div>{Cards[0].name}</div>
<button onClick={() => {
setCards([...shuffle(Cards)])
console.log(Cards)
}}>Testing</button>
</div>
);
}
为什么这个可以用setCards([...shuffle(Cards)])
而不是这个setCards(shuffle(Cards))
。
即使我不使用传播操作符,它 Shuffle (见控制台),但不显示在页面上。
:);).
1条答案
按热度按时间flseospp1#
JavaScript是一种passes objects by reference。这意味着即使对象的内部值发生了变化,它也总是等于自身。为了证明这一点,请看下面的代码片段:
在上面的代码片段中,您将看到
a
和b
包含相同的值,即使只有b
被.sort
重新排序。您还将看到a === b
等于true
。这是因为Array.prototype.sort
执行in-place排序。请参阅文档:sort()
方法就地对数组元素进行排序,并返回对已排序的同一数组的引用。从React的
useState
文档中可以看到:如果通过www.example.com比较确定下一个状态等于上一个状态,React将忽略您的更新Object.is。
所以,为了回答你为什么spread算子能修正它,不,spread算子实际上并不能修正它。
实际的修复是在使用
[...array]
时创建的新数组,因为新数组是新引用: