为何起作用:使用传播运算符更新状态中的数组元素

阿尔克索

在阅读React Cookbook时,我偶然发现了一个代码片段,当用户检查TODO列表中已完成的任务时,将调用此函数:

  markAsCompleted = id => {
    // Finding the task by id...
    const foundTask = this.state.items.find(task => task.id === id);

    // Updating the completed status...
    foundTask.completed = true;

    // Updating the state with the new updated task...
    this.setState({
      items: [
        ...this.state.items,
        ...foundTask
      ]
    });
  }

UPD:不知何故,我完全错过了foundTask上的传播算子因此,真正发生的是状态仅通过... this.state.items(已更改)进行更新,而... foundTask部分未进入状态,因为它不是有效的传播。

乍一看,它应该将一个新元素添加到items数组中,而不是进行更新,因此我去了JS控制台进行检查:

state = { items: [{id: '0', done: false}, {id: '1', done: false}] }

upd = state.items.find(obj => obj.id === '0') // {id: "0", done: false}

upd.done = true // also updates object inside the array

state = { items: [...state.items, upd] }

/* Indeed, adds a new element:
items: Array(3)
0: {id: "0", done: true}
1: {id: "1", done: false}
2: {id: "0", done: true}
*/

因此,我下载了代码并在本地运行。而且,令我惊讶的是,它起作用了!状态正在更新,没有任何麻烦,没有多余的元素出现。我使用React DevTools在测试时查看实时状态。

我在网上搜索,但找不到类似本书的任何示例,但有更好的解释。通常,所有解决方案都涉及使用.map()构建新数组,然后替换现有数组(例如https://stackoverflow.com/a/44524507/10304479)。

我看到的书本代码片段和控制台测试之间的唯一区别是React使用的是.setState(),所以也许这可以有所帮助。任何人都可以帮助澄清,它为什么起作用?

谢谢!

vatz88

Array.find将返回数组中匹配的第一个值。这里的数组由对象组成,返回的值将是对该对象的引用。

const foundTask = this.state.items.find(task => task.id === id);

此处foundTask将引用中包含的相同对象state.items因此,当您进行修改时,foundTask您将修改与中相同的对象state.items

例如,

如果this.state.items[{ id: 1 }],如果您这样做

const foundTask = this.state.items.find(obj => obj.id === 1);
foundTask.id = 2;
console.log(this.state.items); // [{ id:2 }]

在代码中

this.setState({
  items: [
    ...this.state.items,
    ...foundTask
  ]
});

这将使用completed任务的更新值来更新状态...foundTask将在控制台中给您一个错误,因为foundTask它将是一个对象,并且您将其散布在一个数组中。

在这里不会...foundTask产生相同的结果。也许没有错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

负运算符对Java中的按位运算符如何起作用?

节点5.10传播运算符不起作用

如果使用传播运算符,为什么状态会更新为最新消息?

使用XOR运算符交换数组在Python中不起作用

在没有$运算符的情况下使用mongodb中的子数组元素更新多个文档

使用传播运算符更新包含对象的数组

在Typescript中的NodeList上使用传播运算符

在SQL Server中的运算符中不起作用

如何使用传播运算符从对象数组中删除重复项

使用传播运算符设置键名

VBA使用类似运算符在数组中查找字符串不起作用

React .setState()中的传播运算符

反应:使用传播运算符使用表单数据onChange更新状态

在不使用传播运算符的情况下正确更新React.js状态下的对象

Lodash克隆数组与传播运算符

Clojurescript中的Javascript传播运算符?

使用扩展运算符时如何更新数组内的元素

如何在Redux中使用传播运算符获取内部数组和对象的旧状态

Python的'in'运算符在数组中不起作用

使用逻辑运算符时Excel数组公式不起作用

传播运算符在 Object.assign() 中不起作用

JSX 传播运算符的使用

如何使用传播运算符?

当“IN”运算符中的列表很大时,SQLAlchemy 更新操作不起作用

在 C 中对数组元素使用“-=”运算符

为什么关系运算符在指针和数组中不起作用

在反应中更新对象状态的正确方法(合并状态?传播运算符?)

使用 `...` 运算符将切片的元素传递给 `fmt.Println` 以传播参数不起作用。为什么?

位置运算符针对“findOneAndUpdate”更新查询中数组字段的错误元素