2017-04-20 69 views
1

我一直在寻找一些示例代码反应过来(在antd文档),我注意到他们的代码等同于:React setState直接修改prevState的分支?

this.setState(prevState => { prevState.name = "NewValue"; return prevState; }); 

这看起来有点调皮,但它实际上破坏任何东西?由于它使用箭头函数,因此即使React在后台对它们进行批处理,也不会中断正在应用的更改的顺序。

当然,setState旨在期望一个部分状态,因此可能会出现性能副作用,因为它可能会尝试将整个状态应用于自身。

编辑:(响应于@Sulthan)

实际的代码是这样的:

handleChange(key, index, value) { 
    const { data } = this.state; 
    data[index][key].value = value; 
    this.setState({ data }); 
} 

N.B.数据是一个数组,所以它只是被引用复制然后发生了变异。

它实际上完全错误,因为它甚至不使用箭头函数来获取最新状态。

它来自于可编辑的表格例子在这里:https://ant.design/components/table/

+0

你能链接这个例子吗?箭头函数将返回赋值的结果,并且绝对看起来不正确。 – Sulthan

+0

@Sulthan会将其添加到帖子中。 – DanH

+0

你的例子根本就不相同。这意味着完全不同的东西。 – Sulthan

回答

1

你的例子也可以写成:

this.setState(prevState => { 
    prevState.name = "NewValue" 
    return "NewValue"; 
}); 

当一个函数传递给state最重要的事情是不是发生变异传递参数并返回新状态。你的例子都失败了。

... prevState是对之前状态的参考。它不应该直接变异。相反,改变应该通过构建基于从prevState输入一个新的状态对象表示...

(从setState

我不知道它是否是以往任何时候都可以使用setState就像在你例如,但看着更改日志我真的怀疑它。

+0

啊,这是我现在反思的一个很好的观点。我应该返回prevState,而不仅仅是返回赋值的值。当然这会导致双重任务。 – DanH