代码之家  ›  专栏  ›  技术社区  ›  sharif_17

在ReactJS中使用useState时,[…arr,addThisElement]和arr.push(addThisElement)之间有什么区别?

  •  3
  • sharif_17  · 技术社区  · 3 年前

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

    const arr = users;
    
    arr.push({ firstName, email })
    
    setUsers((prevState) => arr)
    

    这是:

    setUsers(prevState => [...prevState, { firstName, email }])
    
    2 回复  |  直到 3 年前
        1
  •  3
  •   Phil    3 年前

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

    Array.prototype.push() 在适当位置对数组进行变异,这意味着其对象引用不会更改。

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

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

    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

        2
  •  0
  •   2jt    3 年前

    在第一种情况下,你改变了引用 arr 添加用户。在第二种情况下,创建一个全新的数组,复制旧数组中的所有数据,并添加新用户。

    您应该使用第二种情况作为使用 Object.is ,如果你的第一个病例 true 因为即使添加了新用户,引用也没有更改,因此ui不会更新。