-
为什么不能改变原有state,需要使用setState并传入修改的部分state,执行setState后怎么更新
是否调用render进行再次渲染是由state是否变化决定的。setState本质是通过一个队列机制实现state更新的,执行setState时,会将要更新的state合并后放入状态队列,而不会立刻更新state,队列机制可以批量更新state。如果不通过setState而直接修改this.state,那么这次state的变化不会放入状态队列中,下次调用setState再进行状态队列进行合并时,会忽略之前直接直接对state修改,这样就无法合并到这次变化,实际也就没有将想要的state更新上去。setState是异步的。
只要调用了setState,就会在合并后生成一个新的state,只要判断state指向的是否是同一个内存地址就知道state是否发生了变化,以此来决定是否进行render重新渲染。如果不用这种方式都直接操作this.state,也就是同一块内存,要侦测state是否发生变化(如angular中的deepwatch)来决定是否重新渲染会非常复杂和低效。redux的reducer中返回新的对象也是同理。react状态管理库还有redux-sagas、redux-observable、MobX等。
网友评论