有人能解释一下这两者之间的区别吗:

const arr = users;

arr.push({ firstName, email })

setUsers((prevState) => arr)

这是:

setUsers(prevState => [...prevState, { firstName, email }])

推荐答案

答案是引用和对象相等...

Array.prototype.push()使数组原地变异,这意味着其对象引用不会更改.

const prevState = [1,2,3];
const nextState = prevState;
nextState.push(4);
nextState === prevState; // true

[...prevState, { firstName, email }]创建一个不等于prevState的新array.

const prevState = [1,2,3];
const nextState = [...prevState, 4];
nextState === prevState; // false

根据React的状态变化检测规则...

Bailing out of a dispatch

如果从减速器挂钩返回与当前状态相同的值,React将退出,而不渲染子对象或激发效果.(React使用Object.is comparison algorithm.)

使用.push()并将状态更新为相同的值意味着React将退出重新渲染,您将看不到所做的更改.

users.push({
  firstName: "Bob",
  email: "bob@example.com"
});
setUsers(users);

Edit lucid-williamson-21sejq

创建一个新的数组,更改将可见

setUsers((prev) => [
  ...prev,
  {
    firstName: "Bob",
    email: "bob@example.com"
  }
]);

Edit keen-napier-hk5m5i

Javascript相关问答推荐

具有相同参数的JS类

如何在不创建新键的情况下动态更改 map 中的项目?

在nextjs服务器端api调用中传递认证凭证

在观察框架中搜索CSV数据

用JavaScript复制C#CRC 32生成器

如何将Map字符串,布尔值转换为{key:string;value:bo布尔值;}[]?<>

自定义高图中的x轴标签序列

实现JS代码更改CSS元素

虚拟滚动实现使向下滚动可滚动到末尾

JS:XML insertBefore插入元素

使用领域Web SDK的Vite+Vue应用程序中的Web程序集(WASM)错误

检索相加到点的子项

TypeError:无法读取未定义的属性(正在读取';宽度';)

自定义图表工具提示以仅显示Y值

传递方法VS泛型对象VS事件特定对象

如何用javascript更改元素的宽度和高度?

如何为仅有数据可用的点显示X轴标签?

如何使本地html页面在重新加载时保持当前可隐藏部分的打开状态?

我正在试着做一个TicTacToe Ai来和我玩.但是,我试着在第一个方块被点击时出现一个X,然后在第二个方块之后出现一个O

在SuperBase JS客户端中寻址JSON数据