react v16.3终于出来了,最大的变更莫过于生命周期去掉了如下三个html
同时为了弥补失去上面三个周期的不足又加了两个前端
固然,这个更替是缓慢的,在整个16版本里都能无障碍的使用旧的三生命周期,但值得注意的是,旧的生命周期(unsafe)不能和新的生命周期同时出如今一个组件,不然会报错“你使用了一个不安全的生命周期”。react
旧的生命周期十分完整,基本能够捕捉到组件更新的每个state/props/ref,没有什从逻辑上的毛病。安全
可是架不住官方本身搞事情,react打算在17版本推出新的Async Rendering,提出一种可被打断的生命周期,而能够被打断的阶段正是实际dom挂载以前的虚拟dom构建阶段,也就是要被去掉的三个生命周期。bash
生命周期一旦被打断,下次恢复的时候又会再跑一次以前的生命周期,所以componentWillMount,componentWillReceiveProps, componentWillUpdate都不能保证只在挂载/拿到props/状态变化的时候刷新一次了,因此这三个方法被标记为不安全。markdown
class Example extends React.Component {
static getDerivedStateFromProps(nextProps, prevState) {
// 没错,这是一个static
}
}
复制代码
class Example extends React.Component {
getSnapshotBeforeUpdate(prevProps, prevState) {
// ...
}
}
复制代码
初始化state — Initializing statedom
请求数据 — Fetching external data异步
添加事件监听 — Adding event listeners (or subscriptions)async
根据props更新state — Updating state based on propside
if (this.props.currentRow !== nextProps.currentRow) { ... } 复制代码
取而代之的是,额外写一个state来记录上一个props (` ^ ‘)
if (nextProps.currentRow !== prevState.lastRow) { return { ... lastRow: nextProps.currentRow, }; // 不更新state return null } 复制代码
触发请求 — Invoking external callbacks
props更新引发的反作用 — Side effects on props change
// 在didUpdate中根据props更新的确很不适应 // props变了也是能够触发update的 componentDidUpdate(prevProps, prevState) { if (this.props.isVisible !== prevProps.isVisible) { logVisibleChange(this.props.isVisible); } } 复制代码
props更新时从新请求 — Fetching external data when props change
// old componentWillReceiveProps(nextProps) { if (nextProps.id !== this.props.id) { this.setState({externalData: null}); this._loadAsyncData(nextProps.id); } } 复制代码
// new static getDerivedStateFromProps(nextProps, prevState) { // Store prevId in state so we can compare when props change. if (nextProps.id !== prevState.prevId) { return { externalData: null, prevId: nextProps.id, }; } // No state update necessary return null; } componentDidUpdate(prevProps, prevState) { if (this.state.externalData === null) { this._loadAsyncData(this.props.id); } } 复制代码
在更新前记录原来的dom节点属性 — Reading DOM properties before an update
static getDerivedStateFromProps(nextProps, prevState) { 4. Updating state based on props 7. Fetching external data when props change // Clear out previously-loaded data so we dont render stale stuff } constructor() { 1. Initializing state } componentWillMount() { // 1. Initializing state // 2. Fetching external data // 3. Adding event listeners (or subscriptions) } componentDidMount() { 2. Fetching external data 3. Adding event listeners (or subscriptions) } componentWillReceiveProps() { // 4. Updating state based on props // 6. Side effects on props change // 7. Fetching external data when props change } shouldComponentUpdate() { } componentWillUpdate(nextProps, nextState) { // 5. Invoking external callbacks // 8. Reading DOM properties before an update } render() { } getSnapshotBeforeUpdate(prevProps, prevState) { 8. Reading DOM properties before an update } componentDidUpdate(prevProps, prevState, snapshot) { 5. Invoking external callbacks 6. Side effects on props change } componentWillUnmount() { } 复制代码
上面的内容基本就是结合个人一些经验半翻译半总结,有不许确的地方欢迎指正。
对更多细节感兴趣的话能够去看官方文档,https://reactjs.org/blog/2018/03/27/update-on-async-rendering.html
对async-rendering或者对dan小哥哥感兴趣的话能够去看看他在前端大会上的一段小演示:https://reactjs.org/blog/2018/03/01/sneak-peek-beyond-react-16.html