让前端飞前端开发技巧

React生命周期

2018-12-20  本文已影响0人  蓝枫

V16.3之前

图解

来自 程墨

生命周期总览

react的生命周期大概分为

组件装载过程

组件更新过程

当组件挂载到DOM树上之后,props/state被修改会导致组件进行更新操作。更新过程会以此调用如下的生命周期函数:

组件卸载过程

卸载过程只涉及一个函数componentWillUnmount,当React组件要从DOM树上删除前,会调用一次这个函数。这个函数经常用于去除componentDidMount函数带来的副作用,例如清楚计时器、删除componentDidMount中创造的非React元素。

注意事项

setState

要修改state,只能使用this.setState(),不能使用this.state.value='myData' 类似方式设置state,一是不会驱动重新渲染,二是很可能被后面的操作替换,造成无法预知的错误。此外,React利用状态队列来实现setState的异步更新,避免频繁地重复更新state。当同时做了很多setState操作的时候,react会智能的合并成一个setState,当需要确定的setState完成后的操作,可以使用

    setState({}, () => {
    // 在这里进行state改变后的操作
    })

setState的调用是有风险的,在某些生命周期函数中调用可能会无用甚至早恒循环调用导致崩溃。state的初始化一般在构造函数中实现;setState可以在装载过程的componentWillMount、componentDidMount中调用;setState可以在更新过程中的componentWillReceiveProps、componentDidUpdate中调用

render

render是一个异步函数,render执行后并不会直接生成Dom,而是生成虚拟Dom节点(模拟HTML Dom节点的一个javaScript数据结构),何时生成真实的DOM树取决于react框架本身的计算。
参考 腾讯前端

V16.3之后

图解

图解

新的生命周期

getDerivedStateFromProps

static getDerivedStateFromProps(nextProps, prevState) {
  //根据nextProps和prevState计算出预期的状态改变,返回结果会被送给setState
}

getSnapshotBeforeUpdate

删除生命周期

  1. componentWillReceiveProps
  2. componentWillMount
  3. componentWillUpdate

差异

所有被删除的生命周期函数,目前还凑合着用,但是只要用了,开发模式下会有红色警告,在下一个大版本(也就是React v17)更新时会彻底废弃。

生命周期功能替换一览

  static getDerivedStateFromProps(nextProps, prevState) {
    4. Updating state based on props
    7. Fetching external data when props change
  }
  constructor() {
    1. Initializing state
  }
 
  componentDidMount() {
    2. Fetching external data
    3. Adding event listeners (or subscriptions)
  }
  
  shouldComponentUpdate() {
  }
  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() {
  }
  
  // before
  
  componentWillMount() {
    // 1. Initializing state
    // 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
  }
  componentWillUpdate(nextProps, nextState) {
    // 5. Invoking external callbacks
    // 8. Reading DOM properties before an update
  }

参考 程墨

上一篇下一篇

猜你喜欢

热点阅读