React类组件setState后this.state与初始引用不等的问题咨询
问题原因解答
- 你对
setState的合并逻辑存在误解:它的合并指的是对state的属性做浅合并,而非直接修改原state对象。 - React类组件执行
setState更新时,内部会创建全新的state对象,不会修改constructor中初始化的原始state对象。你在构造函数中将this.ref指向了初始state对象,该对象后续永远不会被改动,因此this.ref会一直指向count为0的初始对象,和更新后的this.state自然不是同一个引用。 - 浅合并的具体逻辑是:React会将你传入
setState的对象和旧state做浅拷贝合并,生成新对象赋值给this.state,未被修改的属性会直接复用旧state中的引用,这也是你测试中this.state.names === this.ref.names始终返回true的原因——names属性没有被修改,它的引用被直接复用到了新的state对象中。 - 这个设计是React故意为之:保证state的不可变性,既方便React做状态变更前后的对比,也能避免直接修改状态带来的各类隐性bug,这也是官方要求必须通过
setState更新状态、禁止直接修改this.state的核心原因。
内容的提问来源于stack exchange,提问作者Vegeta
相关产品推荐
相关产品推荐

