这是我参与8月更文挑战的第24天,活动详情查看:8月更文挑战
一、生命周期
在react 16版本后废弃了这三个生命周期,但是没删除:componentWillMount、componentWillReceiveProps、componentWillUpdate,这三个生命周期在源码里在17版本后只改为UNSAVE_前缀开头,所以要开始避免使用这三个生命周期。
react16.8后生命周期主要分为三个阶段:
- 挂载阶段
1)constructor:构造函数,最先被执行,通常在构造函数里初始化state对象或把自定义的方法绑定this
2)getDerivedStateFromProps(nextProps,prevState) 这个静态方法,在我们需要接收到新属性去修改state的时候,可以适用
3)render函数,render函数是纯函数,只返回需要渲染的东西,不包含其他业务逻辑,例如原生DOM,组件,字符串,数字等
4)componentDidMount是在组件挂载后调用的,这时可以拿到DOM节点并操作,例如对canvas,服务器请求,订阅等,但是要在componentWillUnmount里取消订阅。
- 更新阶段
1)getDerivedStateFromProps在更新和挂载阶段都可能会调用
2)shouleComponentUpdate(nextProps,nextState),这个生命周期有两个参数nextProps和nextState,标识新属性变化后是状态,返回一个boolean值,true代表会触发重新渲染,false代表不会触发重新渲染,默认返回true,一般用来优化性能。
3)render:更新阶段也可以触发
4)getSnapshotBeforeUpdate(prevProps,prevState)在render之后调用,在componentDidUpdate之前调用,这两个参数代表更前之前的属性状态,这个生命周期会有返回值返回给componentDidUpdate如果不需要就可以返回null,这个生命周期必须和componentDidUpdate搭配使用
5)componentDidUpdate(prevProps,prevStat,snapshot)在getSnapshotBeforeUpdate后被调⽤,三个参数表示之前的props,之前的state,和snapshot这个就是刚刚提到的返回值,一般在对比DOM元素状态时用到,通常出发回调和更新状态,在componentWillUnmount中取消订阅。
- 卸载阶段
componentWillUnmount: 在组件被卸载或销毁了就会调⽤,一般在这个函数⾥去清除⼀些定时器等。
二、setState是同步还是异步
有时异步,有时同步
1、setState只在合成事件和钩⼦函数中是“异步”的,在原⽣事件和setTimeout中都是同步的。
2、setState的“异步”并不是说内部由异步代码实现,其实是在执⾏的过程的时候,并且代码都是同步的,只是合成事件和钩⼦函数的调⽤顺序在更新之前,导致在合成事件和钩⼦函数中没法⽴⻢拿到更新后的值,形成了所谓的“异步”,可以通过第⼆个参数setState(partialState, callback) 中的 callback 拿到更新后的结果。
3、setState 的批量更新优化也是建⽴在“异步”(合成事件、钩⼦函数)之上的,在原⽣事件和setTimeout 中不会 批量更新,在“异步”中如果对同⼀个值进⾏多次 setState , setState 的批量更新策略会对其进⾏覆盖,取最后⼀次的执⾏,如果是同时setState多个不同的值,在更新时会进⾏合并批量更新。
三、react组件通信
1、⽗组件向⼦组件通讯:⽗组件可以向⼦组件通过传 props 的⽅式,向⼦组件进⾏通讯 。
2、⼦组件向⽗组件通讯:props+回调的⽅式,⽗组件向⼦组件传递props进⾏通讯,此props为作⽤域为⽗组件⾃身的函数,⼦组件调⽤该函数,将⼦组件想要传递的信息,作为参数传递到⽗组件的作⽤域中 。
3、兄弟组件通信: 找到这两个兄弟节点共同的⽗节点,结合上⾯两种⽅式由⽗节点转发信息进⾏通信 。
4、跨层级通信:Context上下文共享那些对于⼀个组件树⽽⾔是“全局”的数据,例如当前认证的⽤户、主题 或⾸选语⾔,对于跨越多层的全局数据通过 Context 通信再适合不过 。
5、发布订阅模式: 发布者发布事件,订阅者监听事件并做逻辑处理,一般通过引⼊event模块进⾏通信。
6、全局状态管理⼯具:借助Redux或者Mobx等全局状态管理⼯具进⾏通信,可以维护⼀个全局状态中⼼Store,来根据不同的事件产⽣新的状态。
总的来说和vue差不多也有,但是也有很多不同的地方。