美文网首页
React生命周期

React生命周期

作者: MangoLx | 来源:发表于2019-02-27 19:46 被阅读0次

React生命周期三个阶段

  • 装载阶段(Mounting):构建并插入真实DOM
  • 更新阶段(Updating):更新数据重新渲染DOM
  • 销毁阶段(Unmounting):移除真实DOM


    React中文网生命周期图

一、装载阶段(Mounting)

装载阶段主要包括以下几个函数

constructor

  • 组件的构造函数
  • 通常在这里初始化组件内部状态(state)
  • 如果要调用this必须要super()之后
    constructor() {
      // 只执行一次,且this在super()执行完成之后才能调用
      super()
      console.log('constructor只执行一次');
      this.state = {
        name: 'zs'
      }
    }
    

componentWillMount

  • 组件将要挂载到虚拟DOM之前执行

  • 唯一一个可以同步修改state的生命周期函数

    注意点1:将在 react 17这个版本之后废弃,如果还想继续用, 可以用UNSAFE_componentWillMount来代替。

    注意点2:不要在这个方法里进行ajax请求,因为在react 新的版本采用了fiber算法

    fiber算法是异步渲染,异步的渲染,有可能随时中断,那么componentWillMount就可能执行多次,由此可以想到ajax请
    求也有可能会执行多次。

      UNSAFE_componentWillMount () {
        console.log('componentWillMount执行,dom挂载之前')
      }
    

static getDerivedStateFromProps

  • react 16.3之后新增的生命周期
  • 是一个静态方法
    • 静态方法中没有this
    • 接收参数为下一次传入的props
  • 完成后需要返回一个对象,该对象就相当于setState的参数
    static getDerivedStateFromProps (nextProps) {
      console.log('getDerivedStateFromProps, return对象改变state')
      return {
        status: nextProps.isCompleted ? '已完成' : '未完成'
      }
    }
    

    注意:如果使用了getDerivedStateFromProps 方法,那么componentWillMount、componentWillReceiveProps、componentWillUpdate三个方法都将无效并报错

render

  • 生成虚拟DOM,此时并没有实际DOM
render () {
  console.log('执行render,合成虚拟dom')
  // 此时没有真实DOM
  return (
    <li>
      {this.props.children}------
      <span>{this.state.status}</span>------
      <button onClick={this.handleChangeItem}>{this.props.isCompleted ? '重做' : '完成'}</button>------
      <button onClick={this.handleDelItem}>删除</button>
    </li>
  )
}

componentDidMount

  • 渲染真实DOM
  • 在此发送ajax请求
componentDidMount () {
  console.log('componentDidMount, 真实dom挂载完成')
  // 此时渲染完成真实DOM,在此请求ajax
}

二、更新阶段(Updating)

更新阶段分为两种情况:state改变和props改变

  • state改变:执行shouldComponentUpdate
  • props改变:先执行componentWillReceiveProps再执行shouldComponentUpdate

componentWillReceiveProps

  • 16.4之前,由于在更新阶段,没有static getDerivedStateFromProps这个方法,如果有根据props来改变state,就需要在这再重新设置1次
  • componentWillReceiveProps在react 17 版本中将要被废弃
componentWillReceiveProps () {
  console.log('执行componentWillReceiveProps, 更新props')
  // static getDerivedStateFromProps出现之前进行接收新的props设置给state
}

shouldComponentUpdate

  • 用于react的性能优化(判断是否需要重新渲染)
  • 接收两个参数(nextProps, nextState)
  • 返回值为Boolean类型(true为重新渲染,false不重新渲染)
shouldComponentUpdate (nextProps, nextState) {
  console.log('重绘dom----shouldComponentUpdate,主要在这里做性能优化')
  return nextProps.isCompleted !== this.props.isCompleted
  // 返回值true为重新渲染,false不重新渲染
}

componentWillUpdate

  • componentWillUpdate在react 17 版本中将要被废弃
componentWillUpdate () {
  console.log('componentWillUpdate执行完成之前的方法,将要更新,之后执行render渲染虚拟dom');
  // 该方法在17版本之后会被废弃
}

render

  • 与上文的render方法相同

componentDidUpdate

  • 根据更新次数更新多次
componentDidUpdate () {
  console.log('componentDidUpdate表明数据更新完成');
  // 数据更新完成会调用该方法,因此可能多次调用
}

三、销毁阶段

componentWillUnmount

  • 组件将要销毁
  • 清理定时器,解绑事件
componentWillUnmount () {
  console.log('组件马上销毁之前');
  // 此处清理定时器,解绑事件
}

相关文章

  • React概念图

    React概念图 React组件生命周期概念图 参考文档:React入门教程 组件生命周期React:组件生命周期...

  • React基础篇之组件的生命周期

    引出生命周期 react生命周期(旧) react生命周期(新) getSnapshotBeforeUpdate的...

  • React生命周期

    React v16.0前的生命周期 React v16.4+ 的生命周期图 React v16.9后这些生命周期钩...

  • React v16 生命周期

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

  • 学习并实现react (4)

    实现生命周期 生命周期介绍 React 生命周期图 React 子组件在父组件下的生命周期流程 实现 compon...

  • React面试题 整理脑图

    react基础 React生命周期 react-router react进阶 react Hooks redux 其他

  • react/vue常见问题整理

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

  • React 组件生命周期

    组件生命周期 参考阅读: component-lifecycle react组件生命周期过程说明 react 组件...

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

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

  • React总结

    [toc] 1.React组件生命周期 1.1 生命周期图 组件的生命周期的图如下: 具体可参考React 组件生...

网友评论

      本文标题:React生命周期

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