我有一个React应用程序,我相信 - 虽然不确定 - 那个"嵌套状态"导致我延误。
这就是事情:
我将状态保存在名为 dataset
的变量中。
dataset
是一个对象数组,如下所示:
(5) [{…}, {…}, {…}, {…}, {…}]
并且每个对象具有以下结构:
{id: '5', name: 'Bob', url: 'http://example.com', paid: 'yes'}
最后,我的渲染方法在表格中显示数据:
...
{dataset.map((entry) => (
...
<tr id={entry.id}><td>{entry.name} has paid: {entry.paid}</td></tr>
...
))}
这一切似乎都运转良好,但随后我需要更新状态,因为大概是用户5号本月没有付款我这样做:
// copy current state
let new_dataset = this.state.dataset.slice();
// modify the copy
new_dataset[5].paid = !this.state.dataset[5].paid;
// replace old state with the modified copy
this.setState({
dataset: new_dataset
});
但问题是:
React会更新所有5行还是仅包含我修改过的对象的行?
对于一行中的小变化,反应更新10000行不会浪费吗?这种情况的最佳做法是什么?
提前致谢。
P.S。我已经查看了如何Avoid Reconciliation,但我不确定如何应用这种情况。
答案 0 :(得分:2)
答案 1 :(得分:2)
React会更新所有5行还是仅包含我修改过的对象的行?
它只会使用已更改的内容更新DOM,但它仍将遍历dataset
数组中的所有项目。如果数组中有许多项目,迭代以及对帐过程本身需要时间。
所以这里的问题实际上不是实现本身 - 对于中小型阵列来说,这是一种非常常见的方法。但是,如果您的数组中确实有大型条目,您可能会注意到性能命中,在这种情况下,您可能希望找到不同的实现。
那就是说,我确实在你的代码中发现了一个小错误:
您使用this.state.dataset.slice();
正确创建了数组的副本,但是您没有创建要变异的对象的副本。所以你很有必要直接改变国家。所以改为:
// copy current state
let new_dataset = this.state.dataset.slice();
// copy the object
let obj = Object.assign({}, new_dataset[5]);
// modify the copy
obj.paid = !obj.paid;
// replace the array item with the new object
new_dataset[5] = obj;
答案 2 :(得分:0)
React会更新所有5行还是仅包含对象I的行 改性?
不会再没有反应渲染所有5行。而是反应优化许多事情,以便不再渲染相同的变化。其中一个问题是key
属性。此外,React运行一个diffing算法来仅渲染更改