文章参考 React官网文档 知乎专栏
state和props
state(状态)和props(属性)是React组件渲染须要的数据,不同的是state是组件公有的,齐全由组件本身保护;props由父组件传递给以后组件。
能够在class组件的constructor中初始化state,这是惟一能给state赋值的中央。如果要扭转state,不能以this.state.xxx = xxx这种模式赋值,这样做React会认为state没有扭转,组件不会更新。须要调用React组件的setState办法更新state
class Counter extends React.Component{ constructor(props){ super(props) this.state = { count: 0 } } // render}
setState是异步的吗?
React文档中有一句话“出于性能思考,React 可能会把多个 setState()
调用合并成一个调用。”也就是说,咱们在setState后想用最新的state去做一些计算时,可能不会拿到咱们想要的值。
但这并不代表setState肯定是异步的,这个办法的实现自身是一个同步的流程,但React出于性能思考,在某些场景下会使setState的值异步更新。能够了解为setState自身不是异步的过程,但React不保障setState肯定是同步的。
合成事件中的setState
React为了解决跨平台问题,兼容所有浏览器,本人封装了一套浏览器的原生事件的跨浏览器包装器,即合成事件。onClick、onFocus、onBlur这些都是合成事件。
如图所示,通过点击事件扭转count状态的值,setState后在控制台输入的还是原来的值,合成事件中的setState不是同步的。
生命周期中的setState
生命周期中调用setState办法,React同样没有立刻更新state,而是等componentDidUpdate执行完后再执行setState
原生事件中的setState
与合成事件不同,原生事件中setState后能够间接拿到更新后的state值
setTimeout中的setState
能够在原生事件、合成事件、生命周期中应用setTimeout,不论是哪种场景,因为JS event loop机制,setTimeout中setState后总能拿到最新的state