• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 生命周期钩子

    每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤,比如设置好数据侦听,编译模板,挂载实例到 DOM 以及数据改变时更新 DOM。在此过程中,它也会运行称为生命周期钩子的函数,让开发者有机会在特定阶段添加自己的代码。

    生命周期图示



    组合式 API

    组合式 API 生命周期钩子:

    • onBeforeMount():在组件被挂载之前,调用。当这个钩子被调用时,组件已经完成了其响应式状态的设置,但还没有创建 DOM 节点。它即将首次执行 DOM 渲染过程。这个钩子在服务器端渲染期间不会被调用。
    • onMounted():在组件挂载完成后,调用。组件在以下情况下被视为已挂载:其所有同步子组件都已经被挂载(不包含异步组件或<Suspense>的组件)。其自身的 DOM 树已经创建完成并插入了父容器中。注意仅当根容器在文档中时,才可以保证组件 DOM 树也在文档中。这个钩子在服务器端渲染期间不会被调用。
    • onBeforeUpdate():由于响应式状态更改,在组件即将更新其 DOM 树之前,调用。这个钩子可以用来在 Vue 更新 DOM 之前访问 DOM 状态。在这个钩子中更改状态也是安全的。这个钩子在服务器端渲染期间不会被调用。
    • onUpdated():由于响应式状态更改,在组件更新其 DOM 树之后,调用。父组件的更新钩子将在其子组件的更新钩子之后调用。这个钩子会在组件的任意 DOM 更新后被调用,这些更新可能是由不同的状态变更导致的。
    • onBeforeUnmount():在卸载组件实例之前,调用。当这个钩子被调用时,组件实例依然还保有全部的功能。这个钩子在服务器端渲染期间不会被调用。
    • onUnmounted():在卸载组件实例之后,调用。一个组件在以下情况下被视为已卸载:其所有子组件都已经被卸载。所有相关的响应式作用(渲染作用以及 setup()时创建的计算属性和侦听器)都已经停止。可以在这个钩子中手动清理一些副作用,例如计时器、DOM 事件监听器或者与服务器的连接。这个钩子在服务器端渲染期间不会被调用。
    • onActivated():若组件实例是<KeepAlive>缓存树的一部分,当组件被插入到 DOM 中时,调用。这个钩子在服务器端渲染期间不会被调用。
    • onDeactivated():若组件实例是<KeepAlive>缓存树的一部分,当组件从 DOM 中被移除时,调用。这个钩子在服务器端渲染期间不会被调用。
    • onServerPrefetch():在组件实例在服务器上被渲染之前,调用。如果这个钩子返回了一个 Promise,服务端渲染会在渲染该组件前等待该 Promise 完成。这个钩子仅会在服务端渲染中执行,可以用于执行一些仅存在于服务端的数据抓取过程。
    • onErrorCaptured():在捕获到后代组件传递的错误时,调用。错误可以从以下几个来源中捕获:组件渲染、事件处理器、生命周期钩子、setup()函数、侦听器、自定义指令钩子、过渡钩子。
    • onRenderTracked():调试钩子。当组件渲染过程中追踪到响应式依赖时,调用。这个钩子仅在开发模式下可用,且在服务器端渲染期间不会被调用。
    • onRenderTriggered():调试钩子。当响应式依赖的变更触发了组件渲染时,调用。这个钩子仅在开发模式下可用,且在服务器端渲染期间不会被调用。


    注册周期钩子

    举个例子,onMounted钩子,可以用来在组件完成初始渲染并创建 DOM 节点后运行代码。

    <script setup>
    import { onMounted } from 'vue'
    
    onMounted(() => {
      console.log(`the component is now mounted.`)
    })
    </script>
    

    还有其他一些钩子,会在实例生命周期的不同阶段被调用,最常用的是onMountedonUpdatedonUnmounted

    当调用onMounted时,Vue 会自动将回调函数注册到当前正被初始化的组件实例上。这意味着这些钩子应当在组件初始化时被同步注册。例如,请不要这样做:

    setTimeout(() => {
      onMounted(() => {
        // 这将不会正常工作
      })
    }, 100)
    

    请注意,这并不意味着对onMounted的调用必须放在setup()<script setup>内的词法环境下。onMounted()也可以在一个外部函数中调用,只要调用栈是同步的,且最终起源自setup()


    选项式 API

    选项式 API 生命周期钩子:

    • beforeCreate:在实例初始化完成、props解析之后,在处理与状态相关的选项之前,调用。(与状态相关的选项:例如data()computed())。
    • created:在组件实例处理完所有与状态相关的选项后调用。当这个钩子被调用时,以下内容已经设置完成:响应式数据data()、计算属性computed()、方法methods:{}和侦听器watch()。但是,安装阶段尚未开始,该$el属性将不可用。
    • beforeMount():在组件被挂载之前,调用。当这个钩子被调用时,组件已经完成了其响应式状态的设置,但还没有创建 DOM 节点。它即将首次执行 DOM 渲染过程。这个钩子在服务器端渲染期间不会被调用。
    • mounted():在组件挂载完成后,调用。组件在以下情况下被视为已挂载:其所有同步子组件都已经被挂载(不包含异步组件或<Suspense>的组件)。其自身的 DOM 树已经创建完成并插入了父容器中。注意仅当根容器在文档中时,才可以保证组件 DOM 树也在文档中。这个钩子在服务器端渲染期间不会被调用。
    • beforeUpdate():由于响应式状态更改,在组件即将更新其 DOM 树之前,调用。这个钩子可以用来在 Vue 更新 DOM 之前访问 DOM 状态。在这个钩子中更改状态也是安全的。这个钩子在服务器端渲染期间不会被调用。
    • updated():由于响应式状态更改,在组件更新其 DOM 树之后,调用。父组件的更新钩子将在其子组件的更新钩子之后调用。这个钩子会在组件的任意 DOM 更新后被调用,这些更新可能是由不同的状态变更导致的。
    • beforeUnmount():在卸载组件实例之前,调用。当这个钩子被调用时,组件实例依然还保有全部的功能。这个钩子在服务器端渲染期间不会被调用。
    • unmounted():在卸载组件实例之后,调用。一个组件在以下情况下被视为已卸载:其所有子组件都已经被卸载。所有相关的响应式作用(渲染作用以及 setup()时创建的计算属性和侦听器)都已经停止。可以在这个钩子中手动清理一些副作用,例如计时器、DOM 事件监听器或者与服务器的连接。这个钩子在服务器端渲染期间不会被调用。
    • activated():若组件实例是<KeepAlive>缓存树的一部分,当组件被插入到 DOM 中时,调用。这个钩子在服务器端渲染期间不会被调用。
    • deactivated():若组件实例是<KeepAlive>缓存树的一部分,当组件从 DOM 中被移除时,调用。这个钩子在服务器端渲染期间不会被调用。
    • serverPrefetch():在组件实例在服务器上被渲染之前,调用。如果这个钩子返回了一个 Promise,服务端渲染会在渲染该组件前等待该 Promise 完成。这个钩子仅会在服务端渲染中执行,可以用于执行一些仅存在于服务端的数据抓取过程。

    注册周期钩子

    举个例子,mounted钩子可以用来在组件完成初始渲染并创建 DOM 节点后运行代码。

    export default {
      mounted() {
        console.log(`the component is now mounted.`)
      }
    }
    

    还有其他一些钩子,会在实例生命周期的不同阶段被调用,最常用的是mountedupdatedunmounted

    所有生命周期钩子函数的this,上下文都会自动指向当前调用它的组件实例。注意:避免用箭头函数来定义生命周期钩子,因为如果这样的话,你将无法在函数中,通过this获取组件实例。