• 前端开发面试题—Vue的生命周期


    📚文章目录

    💻Vue的生命周期和钩子函数介绍

    💻生命周期的钩子函数

    🔗beforeCreate

    🔗created

    🔗beforeMount

    🔗mounted

    🔗beforeUpdate

    🔗updated

    🔗beforeUnmount

    🔗unmounted

    🔗errorCaptured

    🔗activated

    🔗deactivated

    🔗补充

    🔗下图是实例生命周期的图表

    💻代码演示

    💻原生网页与生命周期钩子函数的对比


    今天分享一下我遇到很多次的前端面试题,就是Vue的生命周期,比如说问生命周期的过程有多少种钩子函数,分析解释一下生命周期过程中每个钩子函数都做了什么。

    💻Vue的生命周期和钩子函数介绍

    • 首先Vue的生命周期就如同一个有序的流程,就象代码从上往下运行一样,想象一下是不是就像一条挂起来的绳索一样从上往下,但是在绳索上面每间隔一段距离就有一个挂钩,可以从上往下在挂钩上面挂上物品,就是钩子函数,在每个阶段运行的代码就是钩子函数的大括号包裹的代码。
    • 每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤,比如设置好数据侦听,编译模板,挂载实例到 DOM,以及在数据改变时更新 DOM。在此过程中,它也会运行被称为生命周期钩子的函数,让开发者有机会在特定阶段运行自己的代码。

    💻生命周期的钩子函数

    🔗beforeCreate

    在组件实例初始化完成之后立即调用。

    • 类型

      1. interface ComponentOptions {
      2. beforeCreate?(this: ComponentPublicInstance): void
      3. }
    • 详细信息

      会在实例初始化完成、props 解析之后、data() 和 computed 等选项处理之前立即调用。

      注意,组合式 API 中的 setup() 钩子会在所有选项式 API 钩子之前调用,beforeCreate() 也不例外。


    🔗created

    在组件实例处理完所有与状态相关的选项后调用。

    • 类型

      1. interface ComponentOptions {
      2. created?(this: ComponentPublicInstance): void
      3. }
    • 详细信息

      当这个钩子被调用时,以下内容已经设置完成:响应式数据、计算属性、方法和侦听器。然而,此时挂载阶段还未开始,因此 $el 属性仍不可用。


    🔗beforeMount

    在组件被挂载之前调用。

    • 类型

      1. interface ComponentOptions {
      2. beforeMount?(this: ComponentPublicInstance): void
      3. }
    • 详细信息

      当这个钩子被调用时,组件已经完成了其响应式状态的设置,但还没有创建 DOM 节点。它即将首次执行 DOM 渲染过程。

      这个钩子在服务端渲染时不会被调用。


    🔗mounted

    在组件被挂载之后调用。

    • 类型

      1. interface ComponentOptions {
      2. mounted?(this: ComponentPublicInstance): void
      3. }
    • 详细信息

      组件在以下情况下被视为已挂载:

      这个钩子通常用于执行需要访问组件所渲染的 DOM 树相关的副作用,或是在服务端渲染应用中用于确保 DOM 相关代码仅在客户端被调用。

      这个钩子在服务端渲染时不会被调用。

      • 所有同步子组件都已经被挂载。(不包含异步组件或  树内的组件)

      • 其自身的 DOM 树已经创建完成并插入了父容器中。注意仅当根容器在文档中时,才可以保证组件 DOM 树也在文档中。


    🔗beforeUpdate

    在组件即将因为一个响应式状态变更而更新其 DOM 树之前调用。

    • 类型

      1. interface ComponentOptions {
      2. beforeUpdate?(this: ComponentPublicInstance): void
      3. }
    • 详细信息

      这个钩子可以用来在 Vue 更新 DOM 之前访问 DOM 状态。在这个钩子中更改状态也是安全的。

      这个钩子在服务端渲染时不会被调用。


    🔗updated

    在组件因为一个响应式状态变更而更新其 DOM 树之后调用。

    • 类型

      1. interface ComponentOptions {
      2. updated?(this: ComponentPublicInstance): void
      3. }
    • 详细信息

      父组件的更新钩子将在其子组件的更新钩子之后调用。

      这个钩子会在组件的任意 DOM 更新后被调用,这些更新可能是由不同的状态变更导致的。如果你需要在某个特定的状态更改后访问更新后的 DOM,请使用nextTick()作为替代。

      这个钩子在服务端渲染时不会被调用。

    • 不要在 updated 钩子中更改组件的状态,这可能会导致无限的更新循环!


    🔗beforeUnmount

    在一个组件实例被卸载之前调用。

    • 类型

      1. interface ComponentOptions {
      2. beforeUnmount?(this: ComponentPublicInstance): void
      3. }
    • 详细信息

      当这个钩子被调用时,组件实例依然还保有全部的功能。

      这个钩子在服务端渲染时不会被调用。


    🔗unmounted

    在一个组件实例被卸载之后调用。

    • 类型

      1. interface ComponentOptions {
      2. unmounted?(this: ComponentPublicInstance): void
      3. }
    • 详细信息

      一个组件在以下情况下被视为已卸载:

      可以在这个钩子中手动清理一些副作用,例如计时器、DOM 事件监听器或者与服务器的连接。

      这个钩子在服务端渲染时不会被调用。

      • 其所有子组件都已经被卸载。

      • 所有相关的响应式作用 (渲染作用以及 setup() 时创建的计算属性和侦听器) 都已经停止。


    🔗errorCaptured

    在捕获了后代组件传递的错误时调用。

    • 类型

      1. interface ComponentOptions {
      2. errorCaptured?(
      3. this: ComponentPublicInstance,
      4. err: unknown,
      5. instance: ComponentPublicInstance | null,
      6. info: string
      7. ): boolean | void
      8. }
    • 详细信息

      错误可以从以下几个来源中捕获:

      这个钩子带有三个实参:错误对象、触发该错误的组件实例,以及一个说明错误来源类型的信息字符串。

      • 组件渲染
      • 事件处理器
      • 生命周期钩子
      • setup() 函数
      • 侦听器
      • 自定义指令钩子
      • 过渡钩子

    🔗activated

    若组件实例是缓存树的一部分,当组件被插入到 DOM 中时调用。

    这个钩子在服务端渲染时不会被调用。

    • 类型

      1. interface ComponentOptions {
      2. activated?(this: ComponentPublicInstance): void
      3. }

    🔗deactivated

    若组件实例是缓存树的一部分,当组件从 DOM 中被移除时调用。

    这个钩子在服务端渲染时不会被调用。

    • 类型

      1. interface ComponentOptions {
      2. deactivated?(this: ComponentPublicInstance): void
      3. }

    🔗补充

    当然还有销毁阶段的两个钩子函数

    • beforeDestroy:实例销毁之前调用。在这一步,实例仍然完全可用。
    • destroyed:实例销毁后调用。该钩子被调用后,对应 Vue 实例的所有指令都被解绑,所有的事件监听器被移除,所有的子实例也都被销毁。

    但是在Vue3.0中已经被移除


    🔗下图是实例生命周期的图表

    参考来自

    Vue.js官方文档——生命周期选项

    💻代码演示

    1. <template>
    2. <div>div>
    3. template>
    4. <script>
    5. export default {
    6. data () {
    7. return {}
    8. },
    9. // 在实例初始化之后,数据观测(data observer)和event/watcher事件配置之前被调用
    10. beforeCreate () {
    11. console.log('beforeCreate')
    12. },
    13. // 在实例创建完成后被立即调用。在这一步,实例已完成以下配置:数据观测(data observer)
    14. // 属性和方法的运算,watch/event事件回调。但是,挂载阶段还没开始,$el属性目前不可见
    15. created () {
    16. console.log('created')
    17. },
    18. // 在挂载开始之前被调用:相关的编译函数首次被调用
    19. beforeMount () {
    20. console.log('beforeMount')
    21. },
    22. // el被新创建的vm.$el替换,挂载成功
    23. mounted () {
    24. console.log('mounted')
    25. },
    26. // 数据更新时调用
    27. beforeUpdate () {
    28. console.log('beforeUpdate')
    29. },
    30. // 组件DOM已经更新,组件更新完毕
    31. updated () {
    32. console.log('updated')
    33. },
    34. beforeUnmount () {
    35. console.log('beforeDestroy')
    36. },
    37. unmounted () {
    38. console.log('destroy')
    39. }
    40. }
    41. script>
    42. <style>style>

    首先运行到编写生命周期的页面,我们可以发现如下图的运行结果

     然后我们离开这个页面,我继续观察运行结果

    可以发现离开这个页面时,生命周期也进入了销毁阶段 

    💻原生网页与生命周期钩子函数的对比

    • 在原生的网页中,代码是从上到下执行的,一般是头部head先加载,然后是中间的body,最后是在HTML标签的结尾处加载完毕。其中的head大都是引入外部的资源,如JS、CSS等外部文件,然后body是DOM标签部分,紧接着是JavaScript脚本区域。这就是传统网页的运行顺序。
    • Vue.js提供了更为详细的加载流程的生命周期钩子函数,它们可以把代码分类放在不同的区域,这样代码就会变得非常清晰,即便是不同的前端开发人员来维护代码也会得心应手。
  • 相关阅读:
    redis6.0引入多线程
    C++从入门到精通
    神经网络自动求导
    如何将数据输入神经网络,神经网络的数据预处理
    JavaScript 数据结构与算法2(队列和双端队列)
    python变量名解析总结
    .NET Core 实现Excel的导入导出
    100天精通Andriod逆向——第1天:ADB原理及其常用命令
    Docker 搭建 LNMP + Wordpress
    leetcode-814:二叉树剪枝
  • 原文地址:https://blog.csdn.net/weixin_53231455/article/details/126446179