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

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

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

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

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

    💻生命周期的钩子函数

    🔗beforeCreate

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

      • 类型
      interfaceComponentOptions {
      beforeCreate?(this: ComponentPublicInstance): void}


        • 详细信息
          会在实例初始化完成、props 解析之后、data()computed 等选项处理之前立即调用。
          注意,组合式 API 中的 setup() 钩子会在所有选项式 API 钩子之前调用,beforeCreate() 也不例外。

        🔗created

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

          • 类型
          interfaceComponentOptions {
          created?(this: ComponentPublicInstance): void}


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

          🔗beforeMount

          在组件被挂载之前调用。

            • 类型
            interfaceComponentOptions {
            beforeMount?(this: ComponentPublicInstance): void}

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

            🔗mounted

            在组件被挂载之后调用。

              • 类型
              interfaceComponentOptions {
              mounted?(this: ComponentPublicInstance): void}


              • 详细信息组件在以下情况下被视为已挂载:这个钩子通常用于执行需要访问组件所渲染的 DOM 树相关的副作用,或是在服务端渲染应用中用于确保 DOM 相关代码仅在客户端被调用。这个钩子在服务端渲染时不会被调用。
              • 所有同步子组件都已经被挂载。(不包含异步组件或 <Suspense> 树内的组件)
              • 其自身的 DOM 树已经创建完成并插入了父容器中。注意仅当根容器在文档中时,才可以保证组件 DOM 树也在文档中。

                🔗beforeUpdate

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

                  • 类型
                  interfaceComponentOptions {
                  beforeUpdate?(this: ComponentPublicInstance): void}

                  • 详细信息
                    这个钩子可以用来在 Vue 更新 DOM 之前访问 DOM 状态。在这个钩子中更改状态也是安全的。
                    这个钩子在服务端渲染时不会被调用。

                  🔗updated

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

                    • 类型
                    interfaceComponentOptions {
                    updated?(this: ComponentPublicInstance): void}

                    • 详细信息
                      父组件的更新钩子将在其子组件的更新钩子之后调用。
                      这个钩子会在组件的任意 DOM 更新后被调用,这些更新可能是由不同的状态变更导致的。如果你需要在某个特定的状态更改后访问更新后的 DOM,请使用nextTick()作为替代。
                      这个钩子在服务端渲染时不会被调用。
                    • 不要在 updated 钩子中更改组件的状态,这可能会导致无限的更新循环!

                    🔗beforeUnmount

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

                      • 类型
                      interfaceComponentOptions {
                      beforeUnmount?(this: ComponentPublicInstance): void}


                      • 详细信息
                        当这个钩子被调用时,组件实例依然还保有全部的功能。
                        这个钩子在服务端渲染时不会被调用。

                      🔗unmounted

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

                        • 类型
                        interface ComponentOptions {
                          unmounted?(this: ComponentPublicInstance): void
                        }


                        • 详细信息一个组件在以下情况下被视为已卸载:可以在这个钩子中手动清理一些副作用,例如计时器、DOM 事件监听器或者与服务器的连接。这个钩子在服务端渲染时不会被调用。
                        • 其所有子组件都已经被卸载。
                        • 所有相关的响应式作用 (渲染作用以及 setup() 时创建的计算属性和侦听器) 都已经停止。

                          🔗errorCaptured

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

                            • 类型
                            interfaceComponentOptions {
                            errorCaptured?(
                            this: ComponentPublicInstance,
                            err: unknown,
                            instance: ComponentPublicInstance|null,
                            info: string  ): boolean|void}


                            • 详细信息错误可以从以下几个来源中捕获:这个钩子带有三个实参:错误对象、触发该错误的组件实例,以及一个说明错误来源类型的信息字符串。
                            • 组件渲染
                            • 事件处理器
                            • 生命周期钩子
                            • setup() 函数
                            • 侦听器
                            • 自定义指令钩子
                            • 过渡钩子

                              🔗activated

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

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

                                • 类型
                                interface ComponentOptions {
                                  activated?(this: ComponentPublicInstance): void
                                }



                                🔗deactivated

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

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

                                  • 类型
                                  interface ComponentOptions {
                                    deactivated?(this: ComponentPublicInstance): void
                                  }



                                  🔗补充

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

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

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

                                    image.gif


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

                                    参考来自

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

                                    💻代码演示

                                    <template><div></div></template><script>exportdefault {
                                    data () {
                                    return {}
                                      },
                                    // 在实例初始化之后,数据观测(data observer)和event/watcher事件配置之前被调用beforeCreate () {
                                    console.log('beforeCreate')
                                      },
                                    // 在实例创建完成后被立即调用。在这一步,实例已完成以下配置:数据观测(data observer)// 属性和方法的运算,watch/event事件回调。但是,挂载阶段还没开始,$el属性目前不可见created () {
                                    console.log('created')
                                      },
                                    // 在挂载开始之前被调用:相关的编译函数首次被调用beforeMount () {
                                    console.log('beforeMount')
                                      },
                                    // el被新创建的vm.$el替换,挂载成功mounted () {
                                    console.log('mounted')
                                      },
                                    // 数据更新时调用beforeUpdate () {
                                    console.log('beforeUpdate')
                                      },
                                    // 组件DOM已经更新,组件更新完毕updated () {
                                    console.log('updated')
                                      },
                                    beforeUnmount () {
                                    console.log('beforeDestroy')
                                      },
                                    unmounted () {
                                    console.log('destroy')
                                      }
                                    }
                                    </script><style></style>
                                    image.gif

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

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

                                    image.gif

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

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

                                      • 在原生的网页中,代码是从上到下执行的,一般是头部head先加载,然后是中间的body,最后是在HTML标签的结尾处加载完毕。其中的head大都是引入外部的资源,如JS、CSS等外部文件,然后body是DOM标签部分,紧接着是JavaScript脚本区域。这就是传统网页的运行顺序。
                                      • Vue.js提供了更为详细的加载流程的生命周期钩子函数,它们可以把代码分类放在不同的区域,这样代码就会变得非常清晰,即便是不同的前端开发人员来维护代码也会得心应手。
                                      相关文章
                                      |
                                      7月前
                                      |
                                      JavaScript 前端开发 Java
                                      制造业ERP源码,工厂ERP管理系统,前端框架:Vue,后端框架:SpringBoot
                                      这是一套基于SpringBoot+Vue技术栈开发的ERP企业管理系统,采用Java语言与vscode工具。系统涵盖采购/销售、出入库、生产、品质管理等功能,整合客户与供应商数据,支持在线协同和业务全流程管控。同时提供主数据管理、权限控制、工作流审批、报表自定义及打印、在线报表开发和自定义表单功能,助力企业实现高效自动化管理,并通过UniAPP实现移动端支持,满足多场景应用需求。
                                      725 1
                                      |
                                      8月前
                                      |
                                      移动开发 前端开发 JavaScript
                                      Vue与React两大前端框架的主要差异点
                                      以上就是Vue和React的主要差异点,希望对你有所帮助。在选择使用哪一个框架时,需要根据项目的具体需求和团队的技术栈来决定。
                                      507 83
                                      |
                                      9月前
                                      |
                                      JSON 自然语言处理 前端开发
                                      【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
                                      【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
                                      525 72
                                      【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
                                      |
                                      7月前
                                      |
                                      JavaScript 前端开发 编译器
                                      Vue与TypeScript:如何实现更强大的前端开发
                                      Vue.js 以其简洁的语法和灵活的架构在前端开发中广受欢迎,而 TypeScript 作为一种静态类型语言,为 JavaScript 提供了强大的类型系统和编译时检查。将 Vue.js 与 TypeScript 结合使用,不仅可以提升代码的可维护性和可扩展性,还能减少运行时错误,提高开发效率。本文将介绍如何在 Vue.js 项目中使用 TypeScript,并通过一些代码示例展示其强大功能。
                                      346 22
                                      |
                                      9月前
                                      |
                                      人工智能 JavaScript 前端开发
                                      Vue 性能革命:揭秘前端优化的终极技巧;Vue优化技巧,解决Vue项目卡顿问题
                                      Vue在处理少量数据和有限dom的情况下技术已经非常成熟了,但现在随着AI时代的到来,海量数据场景会越来越多,Vue优化技巧也是必备技能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
                                      |
                                      JavaScript 前端开发 搜索推荐
                                      Vue的数据驱动视图与其他前端框架的数据驱动方式有何不同?
                                      总的来说,Vue 的数据驱动视图在诸多方面展现出独特的优势,其与其他前端框架的数据驱动方式的不同之处主要体现在绑定方式、性能表现、触发机制、组件化结合、灵活性、语法表达以及与后端数据交互等方面。这些差异使得 Vue 在前端开发领域具有独特的地位和价值。
                                      273 58
                                      |
                                      11月前
                                      |
                                      JavaScript 前端开发 jenkins
                                      抛弃node和vscode,如何用记事本开发出一个完整的vue前端项目
                                      本文探讨了在不依赖Node和VSCode的情况下,仅使用记事本和浏览器开发一个完整的Vue3前端项目的方法。通过CDN引入Vue、Vue Router、Element-UI等库,直接编写HTML文件实现页面功能,展示了前端开发的本质是生成HTML。虽然日常开发离不开现代工具,但掌握这种基础方法有助于快速实现想法或应对特殊环境限制。文章还介绍了如何用Node简单部署HTML文件到服务器,提供了一种高效、轻量的开发思路。
                                      284 10
                                      |
                                      监控 JavaScript 前端开发
                                      vue学习第十二章(生命周期)
                                      欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。本文深入探讨了Vue实例的生命周期,从初始化到销毁各阶段的关键钩子函数及其应用场景,帮助你更好地理解Vue的工作原理。如果你觉得有帮助,欢迎关注我,将持续分享更多优质内容!🎉🎉🎉
                                      223 1
                                      vue学习第十二章(生命周期)
                                      |
                                      前端开发 JavaScript 开发者
                                      React与Vue:前端框架的巅峰对决与选择策略
                                      【10月更文挑战第23天】React与Vue:前端框架的巅峰对决与选择策略
                                      |
                                      前端开发 JavaScript 数据管理
                                      React与Vue:两大前端框架的较量与选择策略
                                      【10月更文挑战第23天】React与Vue:两大前端框架的较量与选择策略