React与Vue组件生命周期以及钩子函数
创始人
2025-05-28 06:17:17

React与Vue组件生命周期以及钩子函数

  • 组件生命周期
    • `React`组件的生命周期
      • 挂载阶段
      • 更新阶段
      • 卸载阶段
      • 其他
      • React 生命周期函数调用顺序
        • 单个组件生命周期函数调用顺序
        • 父子组件生命周期函数调用顺序
    • `React`组件的生命周期(新版)
      • 挂载阶段
      • 更新阶段
      • 卸载阶段
      • 其他
      • `React` 生命周期函数调用顺序
        • 单组件
        • 父子组件
    • `VUE@2`组件的生命周期
      • 初始化阶段
      • 编译阶段
      • 挂载阶段
      • 生命周期组件调用顺序
        • 单组件
        • 父子组件
      • 更新阶段
      • 销毁阶段
      • 其他钩子函数
    • `VUE@3`组件的生命周期
      • 生命周期执行顺序
        • 单个组件
        • 父子组件
    • `VUE@2`与`VUE@3`对比
    • `VUE`与`React`生命周期对比
      • 相同点
      • 不同点

组件生命周期

组件生命周期:组件从被创建到挂载到页面中运行,再到组件不用时卸载的过程。

  • 钩子函数,使开发者的代码可以在固定阶段执行。

  • 注意:只有类组件才有生命周期。函数组件每次都是重新运行函数,旧的组件即刻被销毁。

React组件的生命周期

在这里插入图片描述

组件的生命周期主要包括三阶段

  1. 挂载阶段
  2. 更新阶段
  3. 卸载阶段
  • 挂载阶段:组件被创建,执行初始化,并被挂载到DOM中,完成组件的第一次渲染(已经插入真实DOM

  • 更新阶段:组件被挂载到DOM之后,propsstate都可以引起组件的更新(重新渲染

  • 卸载阶段:在组件被卸载前调用(已经移出真实DOM

挂载阶段

  1. constructor()

    • ES6class的构造方法,组件被创建时会首先调用组件的构造方法

    • 初始化state,以及为事件处理程序绑定this

  2. componentWillMount() 不建议使用,已经废用了,是在组件被挂载在DOM之前调用,而且只会被调用一次

  3. render()

    • 根据组件的propsstate返回一个React元素

    • 渲染UI

    • 注意:在render()里面不能调用setState()

    • 实际上是调用React.creatElement()

  4. componentDidMount()

    • 在组件被挂载在DOM之后调用,而且只会被调用一次。

    • 可以调用 setState()

    • 向服务器端发送网络请求,以及处理依赖DOM节点的操作

更新阶段

  1. 父组件调用render方法
  2. 组件调用this.setState
  1. componentWillReceiveProps()

    • 已废用
    • props引起的组件更新过程中被调用
    • state引起的组件更新并不会触发该方法的执行
  2. shouldComponentUpdate()

    • 用于决定组件是否继续执行更新过程,默认值为true

    • 可以用来减少组件不必要的渲染,从而优化组件的性能

    • 对比前后两个propsstate是否相同

  3. componentWillUpdate()

    • 组件初始化时不调用

    • 只有在组件将要更新时才调用,此时可以修改state

  4. render()

    • 根据组件的propsstate返回一个React元素

    • 渲染UI

    • 注意:在render()里面不能调用setState()

    • 实际上是调用React.creatElement()

  5. componentDidUpdate()

    • 组件更新之后被调用

卸载阶段

  1. componentWillUnmount()

    • 在组件被卸载前调用

其他

  • componentDidCatch(error, errorInfo)在子组件发生错误是被调用。

    • 接收errorerrorInfo两个参数,
      • error 表示抛出的错误
      • errorInfo 带有 componentStack key 的对象,其中包含有关组件引发错误的栈信息

React 生命周期函数调用顺序

简记,容易记住的生命周期方法

单个组件生命周期函数调用顺序

  1. 单组件初始化

    • constructor -> componentWillMount -> render -> componentDidMount

    • 常用 constructor -> render -> componentDidMount

  2. 单组件更新state

    • shouldComponentUpdate -> componentWillUpdate -> render -> componentDidUpdate
  3. 单组件卸载

    • componentWillUnmount

父子组件生命周期函数调用顺序

  1. 父子组件初始化

    • 父组件constructor -> 父组件componentWillMount -> 父组件render -> 子组件constructor -> 子组件componentWillMount -> 子组件render -> 子组件componentDidMount -> 父组件componentDidMount
  2. 父组件更新state

    • 父组件shouldComponentUpdate -> 父组件componentWillUpdate -> 父组件render -> 子组件componentWillReceiveProps -> 子组件shouldComponentUpdate -> 子组件componentWillUpdate -> 子组件render -> 子组件componentDidUpdate -> 父组件componentDidUpdate
  3. 子组件更新state

    • 子组件shouldComponentUpdate -> 子组件componentWillUpdate -> 子组件render -> 子组件componentDidUpdate
  4. 父子组件卸载

    • 父组件componentWillUnmount -> 子组件componentWillUnmount

React组件的生命周期(新版)

在这里插入图片描述

新版本主要是React 16.3+

新版本的react生命周期函数主要变化

  1. 去除了三个不安全函数 componentWillMountcomponentWillReceivePropscomponentWillUpdate
  2. 新增了三个生命周期函数 static getDerivedStateFromPropsgetSnapshotBeforeUpdatestatic getDerivedStateFromError
  • 版本说明

    • componentWillMountcomponentWillReceivePropscomponentWillUpdate 表示使用这些生命周期的代码,有可能在未来的 React 版本中存在缺陷,可能会影响未来的异步渲染。

    • React 16.3 版本:为不安全的生命周期引入别名 UNSAFE_componentWillMount,UNSAFE_componentWillReceiveProps 和 UNSAFE_componentWillUpdate。(旧的生命周期名称和新的别名都可以在此版本中使用)

    • React 16.3 之后的版本:为 componentWillMount,componentWillReceiveProps 和 componentWillUpdate 启用弃用警告。(旧的生命周期名称和新的别名都可以在此版本中使用,但旧名称会记录DEV模式警告)

    • React 17.0 版本:推出新的渲染方式—异步渲染( Async Rendering),提出一种可被打断的生命周期(实际 dom 挂载之前的虚拟 dom 构建阶段),去掉的三个生命周期 componentWillMount,componentWillReceiveProps 和 componentWillUpdate。(从这个版本开始,只有新的“UNSAFE_”生命周期名称将起作用)

挂载阶段

constructor -> getDerivedStateFromProps -> render -> componentDidMount

  1. componentWillMount 不再使用
  2. getDerivedStateFromProps 替换 componentWillMount
  • static getDerivedStateFromProps(props, state) 在组件初始化和组件更新时都会被调用

    • 接收stateprops两个参数

      • 可以通过返回一个对象来更新组件自身的state
      • 返回null来表示接收到的props没有变化,不需要更新 state
    • 静态方法,所以该生命周期钩子函数内部没有this

    • 将父组件传递过来的props映射到子组件的state

    • 注意:子组件通过 setState 更新自身状态时,不会改变父组件的 props

更新阶段

getDerivedStateFromProps -> shouldComponentUpdate -> render -> getSnapshotBeforeUpdate -> componentDidUpdate

  1. 新增 getDerivedStateFromProps
  2. 替换 componentWillUpdate 为 getSnapshotBeforeUpdate
  • getSnapshotBeforeUpdate(prevProps, prevState) 在组件更新时被调用。被调用于 render之后、更新 DOM 和 refs 之前。

    • 必须有返回值,返回值将作为 componentDidUpdate 函数方法的第三个参数。

    • 通过this.propsthis.state是最新的数据,函数的参数prevPropsprevState是更新前的数据。可以通过比较,做逻辑处理。

卸载阶段

componentWillUnmount
无变化

其他

  • static getDerivedStateFromError(error) 在后代组件抛出错误后被调用。 它将抛出的错误作为参数,并返回一个值以更新 state。

    • 在渲染DOM之前调用,当我们遇到子组件出错的时候可以渲染备用UI,常用作错误边界。

    • componentDidCatch是在DOM渲染完后才会调用,可以用来输出错误信息或上传一些错误报告。

React 生命周期函数调用顺序

单组件

  1. 单组件初始化

    • constructor -> getDerivedStateFromProps -> render -> componentDidMount
  2. 单组件更新state

    • getDerivedStateFromProps -> shouldComponentUpdate -> render -> getSnapshotBeforeUpdate -> componentDidUpdate
  3. 单组件卸载

    • componentWillUnmount

父子组件

  1. 父子组件初始化

    • 父组件constructor -> 父组件getDerivedStateFromProps -> 父组件render -> 子组件constructor -> 子组件getDerivedStateFromProps -> 子组件render -> 子组件componentDidMount -> 父组件componentDidMount
  2. 父组件更新state

    • 父组件getDerivedStateFromProps -> 父组件shouldComponentUpdate -> 父组件render -> 子组件getDerivedStateFromProps -> 子组件shouldComponentUpdate -> 子组件render -> 子组件getSnapshotBeforeUpdate -> 父组件getSnapshotBeforeUpdate -> 子组件componentDidUpdate -> 父组件componentDidUpdate
  3. 子组件更新state

    • 子组件getDerivedStateFromProps -> 子组件shouldComponentUpdate -> 子组件render -> 子组件getSnapshotBeforeUpdate -> 子组件componentDidUpdate
  4. 父子组件卸载

    • 父组件componentWillUnmount -> 子组件componentWillUnmount

VUE@2组件的生命周期

在这里插入图片描述

组件的生命周期

  1. 初始化阶段
  2. 编译阶段
  3. 挂载阶段
  4. 更新阶段
  5. 销毁阶段

初始化阶段

  • beforeCreate

    • 在实例初始化之后,进行数据侦听和事件/侦听器的配置之前同步调用。

    • 实例的datamethods等配置还未初始化,无法调用,只能使用一些默认事件

  • created

    • 在实例创建完成后被立即同步调用。

    • 实例已完成对选项的处理,意味着以下内容已被配置完毕:数据侦听、计算属性、方法、事件/侦听器的回调函数。

    • 挂载阶段还没开始,且 $el.property 目前尚不可用。

    • 模板还没有编译,不能获取到DOM。

编译阶段

  • VUE对象是否指定el

  • VUE对象是否指定template