美文网首页让前端飞
React 16生命周期整理

React 16生命周期整理

作者: 全世界最酷的李大厨 | 来源:发表于2019-04-16 17:17 被阅读3次

新项目用的React16.6, 遂整理一下新版本带来的生命周期改变。

最大的改动是生命周期去掉了三个

componentWillMount
componentWillReceiveProps
componentWillUpdate

并且加了两个静态方法

static getDerivedStateFromProps
getSnapshotBeforeUpdate

刚开始用的时候非常不习惯,不是很能理解为什么16里面React要把这三个生命周期方法干掉。专程google了一下:
React打算推出新的Async Rendering,提出一种可被打断的生命周期,而可以被打断的阶段正是实际dom挂载之前的虚拟dom构建阶段,也就是要被去掉的三个生命周期。生命周期一旦被打断,下次恢复的时候又会再跑一次之前的生命周期,因此componentWillMount, componentWillReceiveProps, componentWillUpdate都不能保证只在挂载/拿到props/状态变化的时候刷新一次了,所以这三个方法被标记为不安全。而在整个16版本里都能无障碍的使用旧的这三个生命周期,但值得注意的是,旧的生命周期(unsafe)不能和新的生命周期同时出现在一个组件,否则会报错“你使用了一个不安全的生命周期”。(引用自https://juejin.im/post/5aca20c96fb9a028d700e1ce

React16之前的生命周期图.png 新的生命周期图.png

我们可以看见除了shouldComponentUpdate,其他在render函数之前的所有函数(componentWillMount,componentWillReceiveProps,componentWillUpdate)都被getDerivedStateFromProps替代。我们在render之前的操作被限制在只能根据props和state的变化生成新的state。

getDerivedStateFromProps:
之前没怎么关注这个文档,根据自己项目实践中发现getDerivedStateFromProps无论是Mounting还是Updating都会被调用(在render之前)。返回一个新对象来更新当前的state或者返回null不改变state。
getSnapshotBeforeUpdate:
这个方法暂时还没有实践过,从查到的文档来看被调用于render之后。它使组件可以在可能更改之前从DOM捕获一些信息(例如滚动位置)。此生命周期返回的任何值都将作为参数传递给componentDidUpdate。

getSnapshotBeforeUpdate(prevProps, prevState) {
    console.log('enter getSnapshotBeforeUpdate.....');
    return 'I will see you in componentDidUpdate';
  }

  componentDidUpdate(prevProps, prevState, snapshot) {
    console.log('enter componentDidUpdate snapshot: ', snapshot);
    // you will see  'I will see you in componentDidUpdate' in consolelog
  }

componentDidCatch: 错误handler

componentDidCatch(err, info)

React16提供了错误处理的生命周期方法,在任何子组件渲染期间,生命周期方法中或者构造函数 constructor 发生错误时调用。但通过文档来看componentDidCatch不会捕获下面的错误:

  • 事件处理 (Event handlers) (因为事件处理不发生在 React 渲染时,报错不影响渲染)
  • 异步代码 (Asynchronous code) (e.g. setTimeout or requestAnimationFrame callbacks)
  • 服务端渲染 (SSR)
  • 错误边界本身(而不是子组件)抛出的错误

参考鸣谢
https://www.jianshu.com/p/514fe21b9914
https://juejin.im/post/5aca20c96fb9a028d700e1ce

相关文章

  • react/vue常见问题整理

    一、react 1. react生命周期 react 16生命周期相对于15的变化:componentWillMo...

  • React v16 生命周期

    React 16 生命周期 React 16.3 新增的生命周期方法 逐渐废弃的生命周期方法: 一般将生命周期分成...

  • 《深入React技术栈》学习笔记Ⅲ

    以下的生命周期都是在 React 15 的生命周期, React 16 的生命周期 API 已经发生变化。Reac...

  • ReactV16.3+新增的api

    React16新的生命周期弃用了componentWillMount、componentWillReceivePo...

  • react的生命周期钩子@郝晨光

    本人之前写在CSDN上的文章,原创转载至此;react的生命周期钩子 1、React16新的生命周期弃用了comp...

  • React生命周期及减少render次数

    React生命周期 环境:react16 常用生命周期的钩子分类后,分布3个阶段内 初始化阶段 - 组件创建阶段才...

  • react生命周期只要一张图

    1. react v16 版本生命周期 react v17 (还未发布), 生命周期将被改动,下面红框的部分就是会...

  • React的生命周期

    基于react16.x版本,保持更新 生命周期介绍 带 * 标识的为重要、常用的生命周期。 constructor...

  • React最新的生命周期

    React 16之后有三个生命周期被废弃(但并未删除) componentWillMountcomponentWi...

  • React 16生命周期整理

    新项目用的React16.6, 遂整理一下新版本带来的生命周期改变。 最大的改动是生命周期去掉了三个 并且加了两个...

网友评论

    本文标题:React 16生命周期整理

    本文链接:https://www.haomeiwen.com/subject/biabwqtx.html