我正在阅读反应文档State Updates are Merged,当我们设置这样的对象时,它说了一部分,例如:this.setState({comments})
,它完全替代了this.state.comments
。
因此,我想知道在事件name
上更改user
对象的onChangeText
的方法是否有效,因为每次onChangeText
被替换时,整个对象都会被替换叫。
这是一种好习惯还是有不良表现等副作用?
示例代码:
this.state = {
user:{
name: "",
surname: "",
},
isLoading: false
};
/***/
onChangeText={name => this.setState({
user: {
...user,
name
}
})}
答案 0 :(得分:1)
不变性是一方面,性能是另一点。
不变性意味着您不应使用相同的引用来更新对象,而应使用新的引用进行替换。在React中推荐这样做,因为仅当对象是新对象时才会进行大量更新。如果在状态中重复使用user
,更改名称,然后使用状态更新状态,则可能会造成问题。这就是为什么它是一个建议的原因,在大多数情况下,React magic可以在其他无法区分的情况下起作用。所以你必须
const copy = Object.assign({}, this.state.user);
您可以在the power of not mutating data
中看到此说明。在这种情况下,性能与您有关,因为它是文本侦听器,没关系,React在虚拟DOM中跟踪UI,因此它只能更新不同的内容。这意味着除了新的或删除的字符外,其他所有内容都将保持不变。
答案 1 :(得分:0)
我推荐set
中的lodash/fp
:
https://gist.github.com/jfmengels/6b973b69c491375117dc#_setpath-value-object
答案 2 :(得分:0)
您的示例是完全有效的,只要user
变量是最新的。
为了确保这一点,您可能需要使用setState
的函数arg形式。这将使用this.state
的当前值调用您的函数,并将状态设置为返回值。
onChangeText={
name =>
this.setState(
({ user }) => ({
user: { ...user, name }
})
)
}