React native 生命周期 - ImVeryGood/Loan GitHub Wiki

React v16.0前的生命周期

React 生命周期分为三种状态

  1. 初始化

  2. 更新

  3. 销毁

)30E9XW7XQYV2$183F_GHE4.png

react.jpg

•初始化

1、getDefaultProps()

设置默认的props,也可以用dufaultProps设置组件的默认属性.

2、getInitialState()

在使用es6的class语法时是没有这个钩子函数的,可以直接在constructor中定义this.state。此时可以访问this.props

3、componentWillMount()

组件初始化时只调用,以后组件更新不调用,整个生命周期只调用一次,此时可以修改state。因为render前,所以setState不会重新渲染,推荐用constructor代替之

4、 render()

react最重要的步骤,创建虚拟dom,进行diff算法,更新dom树都在此进行。此时就不能更改state了。

5、componentDidMount() 该函数会在render渲染完毕之后调用,整个过程只执行一次。 该函数执行后,开发者就可以对界面上的组件或者子组件进行各种操作了。 该函数的应用场景适用于在移动端应用启动之后需要访问网络进行某些数据获取。

•更新

6、componentWillReceiveProps(nextProps)

组件初始化时不调用,组件初始化时不调用,当props(属性)发生改变或者接受到新的props时,该函数被调用,并接受一个输入参数,类型为Object ,如果在该函数当中对状态机变量进行了修改,RN不会立即渲染页面,而是会等待该方法执行完毕后一起渲染

**7、shouldComponentUpdate(nextProps, nextState) **

在接收到新的props或state时是否重新渲染,默认返回true,此方法通过比较nextProps,nextState及当前组件的this.props,this.state,返回true时当前组件将继续执行更新过程,返回false则当前组件更新停止,以此可用来减少组件的不必要渲染,优化组件性能。

8、componentWillUpdata(nextProps, nextState)

此方法在调用render方法前执行,在这边可执行一些组件更新发生前的工作,一般较少用。 不能调用this.setState方法,否则将导致无限循环调用

9、render()

组件渲染

10、componentDidUpdate()

此方法在组件更新后被调用,可以操作组件更新的DOM,prevProps和prevState这两个参数指的是组件更新前的props和state ,不能调用this.setState方法,否则将导致无限循环调用

•卸载

11、componentWillUnmount()

此方法在组件被卸载前调用,可以在这里执行一些清理工作,比如清除组件中使用的定时器,清除componentDidMount中手动创建的DOM元素等,以避免引起内存泄漏

React v16.4 的生命周期

v16.4生命周期.jpg 变更缘由 原来(React v16.0前)的生命周期在React v16推出的Fiber之后就不合适了,因为如果要开启async rendering,在render函数之前的所有函数,都有可能被执行多次。

**•static getDerivedStateFromProps **

在组件创建时和更新时的render方法之前调用,它应该返回一个对象来更新状态,或者返回null来不更新任何内容。,用于替换componentWillReceiveProps。static静态方法中没有this,因此,不能this.setState修改state的值,如果需要返回修改,直接return

在下列三种情况下,会调用getDerivedStateFromProps方法:

  1. 组件实例化。
  2. 组件的props发生变化。
  3. 父组件重新渲染。
  4. this.setState()。

•getSnapshotBeforeUpdate

该函数会在update后 DOM 更新前被调用,用于读取最新的 DOM 数据,返回值将作为 componentDidUpdate 的第三个参数

官网部分代码示例 snaps.png

更新组件(重新渲染界面)的方式有以下四种:

  • 首次渲染Initial Render,即首次加载组件

  • 调用this.setState,状态发生改变(并不是一次setState会触发一次render,React可能会合并操作,再一次性进行render)

  • 父组件发生更新(一般就是props发生改变,但是就算props没有改变或者父子组件之间没有数据交换也会触发render)

  • 调用this.forceUpdate,强制更新

推荐使用:

class A extends React.Component {

// 用于初始化 state

constructor() {}

// 用于替换 componentWillReceiveProps ,该函数会在初始化和 update 时被调用

// 因为该函数是静态函数,所以取不到 this

static getDerivedStateFromProps(nextProps, prevState) {}

// 判断是否需要更新组件,多用于组件性能优化

shouldComponentUpdate(nextProps, nextState) {}

// 组件挂载后调用

// 可以在该函数中进行请求或者订阅

componentDidMount() {}

// 用于获得最新的 DOM 数据

getSnapshotBeforeUpdate() {}

// 组件即将销毁 // 可以在此处移除订阅,定时器等等

componentWillUnmount() {}

// 组件销毁后调用

componentDidUnMount() {}

// 组件更新后调用

componentDidUpdate() {}

// 渲染组件函数

render() {}

// 以下函数不建议使用

UNSAFE_componentWillMount() {}

UNSAFE_componentWillUpdate(nextProps, nextState) {}

UNSAFE_componentWillReceiveProps(nextProps) {} }