React文档setState
对此有这样的说法:
切勿this.state
直接进行突变,因为setState()
随后的呼叫可能会取代您所做的突变。对待this.state
就好像它是不可变的。
setState()
不会立即变异,this.state
但会创建待处理的状态转换。this.state
调用此方法后进行访问可能会返回现有值。
无法保证对呼叫的同步操作,setState
并且可以为提高性能而对呼叫进行批量处理。
setState()
除非在中实现了条件渲染逻辑,否则它将始终触发重新渲染shouldComponentUpdate()
。如果正在使用可变对象,并且无法在中实现逻辑shouldComponentUpdate()
,则setState()
仅在新状态与先前状态不同时进行调用才能避免不必要的重新渲染。
基本上,如果this.state
直接进行修改,则会造成一种情况,即这些修改可能会被覆盖。
与您的扩展问题1)和2)有关,setState()
不是立即的。。由于已排队而不是立即应用,因此完全有可能在两者之间进行某些修改,以使您的直接更改被覆盖。
如果没有别的,您可能会觉得更好,只是考虑将不直接修改this.state
视为良好做法。您可能个人知道您的代码与React交互时不会发生这些覆盖或其他问题,但是您正在创建一种情况,其他开发人员或将来的更新可能突然发现自己遇到奇怪或微妙的问题。