详解vue生命周期(常问面试题)

article/2025/9/1 14:50:38

面试常问:
1、vue生命周期是什么?

Vue 实例从创建到销毁的过程为生命周期。从开始创建、初始化数据、编译模板、挂载Dom→渲染、更新→渲染、卸载等一系列过程,称之为 Vue 的生命周期。

2、vue生命周期的作用是什么?

在控制整个Vue实例的过程时更容易形成好的逻辑。

3、vue生命周期总共有几个阶段?

总共分为8个阶段:创建前/后, 载入前/后,更新前/后,销毁前/销毁后

4、第一次页面加载会触发哪几个钩子?

会触发 beforeCreate, created, beforeMount, mounted 这几个钩子

5、DOM 渲染在 哪个周期中就已经完成?

DOM 渲染在 mounted 中就已经完成了。

6、简述每个生命周期 具体适合哪些场景?

  • 创建vue实例,Vue();
  • 在创建Vue实例的时候,执行了init(),在init过程中首先调用了beforeCreate钩子函数;
  • 同时监听data数据,初始化vue内部事件,进行属性和方法的计算;
  • 以上都干完了,调用Created钩子函数;
  • 模板编译,把data对象里面的数据和vue语法写的模板编译成HTML。编译过程分三种情况:1)实例内部有template属性,直接调用,然后调用render函数去渲染;2)没有该属性调用外部html;3)都没有抛出错误;
  • 编译模板完成,调用beforeMount钩子函数;
  • render函数执行之后,将渲染出来的内容挂载到DOM节点上;
  • 挂在结束,调用Mounted钩子函数;
  • 数据发生变化,调用beforeUpdate钩子函数,经历virtual Dom;
  • 更新完成,调用Updated钩子函数;
  • beforeDestory销毁所有观察者、组件及事件监听;
  • Destoryed实例销毁;

7、父子组件的生命周期(有点蒙,往下看!反正:父~子~子~父)

执行顺序:父组件开始执行到beforeMount 然后开始子组件执行,最后是父组件mounted。

如果有兄弟组件,父组件开始执行到beforeMount,然后兄弟组件依次执行到beforeMount,然后按照顺序执行mounted,最后执行父组件的mounted。
当子组件挂载完成后,父组件才会挂载。

当子组件完成挂在后,父组件会主动执行一次beforeUpdated/updated钩子函数(仅首次)

父子组件在data变化中是分别监控的,但是更新props中的数据是关联的。

销毁父组件时,先将子组件销毁后才会销毁父组件。

兄弟组件的初始化(mounted之前)是分开进行,挂载是从上到下依次进行

当没有数据关联时,兄弟组件之间的更新和销毁是互不关联的

图解vue生命周期:

1.beforeCreate、created

beforeCreate:创建前,此阶段为实例初始化之后,this指向创建的实例,此时的数据观察事件机制都未形成,不能获得DOM节点。data,computed,watch,methods 上的方法和数据均不能访问。可以在这加个loading事件。

created:创建后,此阶段为实例已经创建,完成数据(data、props、computed)的初始化导入依赖项。可访问 data computed watch methods 上的方法和数据。初始化完成时的事件写在这里,异步请求也适宜在这里调用(请求不宜过多,避免白屏时间太长)。可以在这里结束loading事件,还做一些初始化,实现函数自执行。未挂载DOM,若在此阶段进行DOM操作一定要放在Vue.nextTick()的回调函数中。

2.模板编辑


3.beforeMount、mounted

beforeMount:挂载前,虽然得不到具体的DOM元素,但vue挂载的根节点已经创建,下面vue对DOM的操作将围绕这个根元继续进行。beforeMount这个阶段是过渡性的,一般一个项目只能用到一两次。

mounted:挂载,完成创建vm.$el,和双向绑定完成挂载DOM和渲染,可在mounted钩子函数中对挂载的DOM进行操作。可在这发起后端请求,拿回数据,配合路由钩子做一些事情。

4.beforeUpdate、updated

beforeUpdate:数据更新前,数据驱动DOM。在数据更新后虽然没有立即更新数据,但是DOM中的数据会改变,这是vue双向数据绑定的作用。可在更新前访问现有的DOM,如手动移出添加的事件监听器。

updated:数据更新后,完成虚拟DOM的重新渲染和打补丁。组件DOM已完成更新,可执行依赖的DOM操作。注意:不要在此函数中操作数据(修改属性),会陷入死循环。

5.beforeDestroy、destroyed

beforeDestroy:销毁前,可做一些删除提示,如:您确定删除xx吗?

destroyed:销毁后,当前组件已被删除,销毁监听事件,组件、事件、子实例也被销毁。这时组件已经没有了,无法操作里面的任何东西了。

6.activated、deactivated

activated:在使用vue-router时有时需要使用<keep-alive></keep-alive>来缓存组件状态,这个时候created钩子就不会被重复用了。如果我们的子组件需要在每次加载的时候进行某些操作,可以使用activated钩子触发。

deactivated:<keep-alive></keep-alive>组件被移除时使用。

vue生命周期完整图:

vue生命周期演示:

PS:当点击button控件跳转后,beforeCreatecreatedbeforeMountmounted就已经执行了。在添加事件就会更新展示beforeUpdateupdated;退出这个界面就执行销毁beforeDestroydestroyed

相关代码:

<template><div><div class="label-head"><label>生命周期详解</label></div><div :data="count">{{count}}</div><p><button @click="add">添加</button></p></div>
</template>
<script>
export default {data() {return {count: "",filter: "all",states: ["all", "active", "completed"]};},methods: {add() {this.count++;}},beforeCreate() {console.log("=========" + "beforeCreated:初始化之前" + "======");console.log(this.$el);console.log(this.$data);console.log(this.filter);},created() {console.log("==========" + "created:创建完成" + "===========");console.log(this.$el);console.log(this.$data);console.log(this.filter);},beforeMount() {console.log("==========" + "beforeMount:挂载之前" + "=======");console.log(this.$el);console.log(this.$data);console.log(this.filter);},mounted() {console.log("==========" + "mounted:被挂载之后" + "==========");console.log(this.$el);console.log(this.$data);console.log(this.filter);},beforeUpdate() {console.log("========" + "beforeUpdate:数据更新前" + "========");console.log(this.$el);console.log(this.$data);console.log(this.filter);},updated() {console.log("========" + "updated:被更新之后" + "============");console.log(this.$el);console.log(this.$data);console.log(this.filter);},beforeDestroy() {console.log("=========" + "beforeDestroy:销毁之前" + "========");console.log(this.$el);console.log(this.$data);console.log(this.filter);},destroyed() {console.log("==========" + "destroyed:销毁之后" + "===========");console.log(this.$el);console.log(this.$data);console.log(this.filter);},activated() {console.log("");},deactivated() {console.log("");}
};
</script>
<style scoped>
.label-head {text-align: center;font-size: 40px;
}
</style>

整体的函数知道后,遇到父子组件时他们的函数是如何执行的呢?

父子组件生命周期:

父组件:parents

子组件:child、grandson

1、加载

/*parents的打印代码*/created () {console.log('============"parents created":我第一============')},beforeMount () {console.log('============"parents befortemounted"我第二=======')},mounted () {console.log('============"parents mounted"我第九==============')},/*child的打印代码*/created () {console.log('----------------"child created"我第三-------------')},beforeMount () {console.log('----------------"child beforemounted"我第四-------')},mounted () {this.$parent.panes.push(this)console.log('----------------"child mounted"我第七-------------')},/*grandson的打印代码*/created () {console.log('~~~~~~~~~~~~~"grandson created"我第五~~~~~~~~~~~~~')}beforeMount () {console.log('~~~~~~~~~~~"grandson beforemounted"我第六~~~~~~~~~')},mounted () {console.log('~~~~~~~~~~~~"grandson mounted"我第八~~~~~~~~~~~~~~')}

执行顺序:父beforeCreate>父created>父beforeMount>子beforeCreate->子created->子beforeMount->子mounted->父mounted

第一圈:先执行父组件的created和beforemount函数;created和beforeMount再按子组件的使用顺序执行,

第二圈:折回去执行mounted,先子后父!

结论:

父组件准备挂载还没挂载时,子组件先完成挂载;

最后父组件再挂载!

2、更新

/*parents的更新代码*/beforeUpdate() {console.log('============"parents beforeUpdate"我第一=======')},updated() {console.log('============"parents updated"我第四==========')},/*child的更新代码*/beforeUpdate() {console.log('------------"child beforeUpdate"我第二-------')},updated() {console.log('------------"child updated"我第三-----------')},

执行顺序:父beforeUpdate->子beforeUpdate->子updated->父updated

3、销毁

/*parents的销毁代码*/beforeDestroy () {console.log('============"parents beforDestroy"我第一=======')},destroyed () {console.log('============"parents destroyed"我第四==========')},/*child的销毁代码*/beforeDestroy () {console.log('------------"child beforDestroy"我第二-------')},destroyed () {console.log('------------"child destroyed"我第三-----------')},

执行顺序:父beforeDestroy->子beforeDestroy->子destroyed->父destroyed

总结:想一千次不如去做一次,华丽的跌倒,胜过无谓的徘徊...

                                                                                   



http://chatgpt.dhexx.cn/article/RU1bFN2E.shtml

相关文章

Vue学习 — 详解Vue生命周期

目录 一、前言二、生命周期1、beforeCreat / created(1)、beforeCreat&#xff1a;&#xff08;2&#xff09;、created&#xff1a; 2、eforeMount / mounted&#xff08;1&#xff09;、beforeMount&#xff1a;&#xff08;2&#xff09;、mounted&#xff1a; 3、beforeUpd…

Vue生命周期详解学习笔记

生命周期 生命周期又名生命周期回调函数&#xff0c;生命周期函数&#xff0c;生命周期钩子。生命周期是Vue在关键时刻帮我们调用的一些特殊名称的函数。生命周期函数的名字不可更改&#xff0c;但函数的具体内容是程序员根据需求编写的。生命周期中的this指向vm或组件实例对象…

Vue的生命周期详解,一文带你弄懂Vue的生命周期

大家好&#xff0c;我是Ned&#x1f440;&#xff0c;一个刚刚入门前端未满两年的大三小学生&#x1f339; 未来路还长&#x1f389;, 一起努力加油吧❤~ 前言 我记得尤大曾经说过&#xff0c;你看Vue源码干嘛&#xff1f;你使用Vue又不需要它的源码&#xff0c;你只需要会用就…

Vue系列之vue生命周期详解

文章の目录 1、什么是 vue 生命周期2、生命周期钩子函数2.1、beforeCreate&#xff08;创建前&#xff09;2.2、created&#xff08;创建后&#xff09;2.3、beforeMount&#xff08;挂载前&#xff09;2.4、mounted&#xff08;挂载后&#xff09;2.5、beforeUpdate&#xff0…

Vue的生命周期详解(简单易懂)

一、定义 Vue的生命周期就是实例从创建到销毁的一个过程&#xff0c;即从创建、初始化数据、编译模板、挂载Dom->渲染、更新->渲染&#xff0c;卸载等一系列的过程。 写代码时注意&#xff1a; Vue的生命周期钩子函数会自动绑定this上下文到实例中&#xff0c;这意味着…

【Vue】 Vue生命周期详解

每一个vue实例从创建到销毁的过程&#xff0c;就是这个vue实例的生命周期。在这个过程中&#xff0c;它经历了从开始创建、初始化数据、编译模板、挂载Dom、渲染→更新→渲染、卸载等一系列过程。 通过这张流程图已经可以清晰的看到Vue整个生命周期的过程 beforeCreate( 创建前…

Vue极简教程,生命周期详解

Vue | 渐进式 | JS框架 | 极简教程 生命周期详解

vue实例的生命周期详解

Vue实例的生命周期 简介 此篇文章说的是最简单的单个VUE组件的生命周期。 官网中的长图诠释了Vue实例从创建&#xff0c;运行到销毁的整个过程。从vue实例的创建&#xff0c;运行&#xff0c;销毁期间&#xff0c;总是伴随着各种各样的事件&#xff0c;这些事件统称为生命周期…

【Vue生命周期详解】

细谈Vue声明周期 什么是生命周期&#xff1f;Vue的生命周期beforeCreate( 创建前 )&#xff1a;created ( 创建后 &#xff09;&#xff1a;beforeMount&#xff1a;mounted&#xff1a;beforeUpdate&#xff1a;updated&#xff1a;beforeDestroy&#xff1a;destroyed&#x…

VUE的十一个生命周期详解

生命周期可以分为三个阶段&#xff1a; 挂载阶段 更新阶段 销毁阶段 创建前&#xff1a;beforeCreate() 无法获取data数据 创建后&#xff1a;created() 可以获取data数据和操作methods 但不能使用DOM 挂载前&#xff1a;beforeMount() 挂载后&#xff1a;mounted() …

Vue生命周期和钩子函数详解

Vue生命周期和钩子函数详解 Vue生命周期介绍&#xff1a; 组件每个阶段它的内部构造是不一样的&#xff0c;所以一般特定的钩子做特定的事&#xff0c;比如Ajax获取数据就可以在mounted阶段。从Vue实例被创建开始到该实例最终被销毁的整个过程叫做VUE的生命周期&#xff0c;在…

vue生命周期详解(一)----创建期间的生命周期函数

文章目录 vue生命周期一、beforeCreate1.在beforeCreate函数里面调用data里面的属性2.在beforeCreate钩子函数里面调用methods里面的方法 二、created生命周期钩子函数1.在created钩子函数里面调用methods里面的方法和data里面的属性 三、beforeMount和mountedbeforeMount生命周…

Vue中组件生命周期过程详解

一、什么是生命周期&#xff1f; Vue中的生命周期是指&#xff1a;组件从创建到销毁的一个过程&#xff0c;在这过程中&#xff0c;我们在每个特定阶段会触发一些方法&#xff08;这些方法具备一些功能&#xff09;&#xff0c;我们给这些方法起了名字叫做(生命周期钩子函数/组…

vue生命周期详解和使用场景整理

我们从vue的原理上来理解一下vue的生命周期&#xff0c;以及使用场景&#xff08;使用场景应该试很多新手同学比较懵的地方&#xff09;&#xff0c;建议有条件的同学可以看一下vue源码&#xff0c;更能深入理解。 不看源码的同学也没有关系&#xff0c;我们从业务场景切入&…

vue生命周期钩子函数详解

先放一张官网生命周期图&#xff1a; vue有8种生命周期函数&#xff1a; 钩子函数触发的行为在此阶段可以做的事情beforeCreadtedvue实例的挂载元素$el和数据对象data都为undefined&#xff0c;还未初始化。加loading事件createdvue实例的数据对象data有了&#xff0c;$el还…

Vue的生命周期详解

Vue的生命周期 Vue的生命周期就是vue实例从创建到销毁的全过程&#xff0c;也就是 new Vue() 开始就是vue生命周期的开始。Vue实例有一个完整的生命周期&#xff0c;也就是从开始创建、初始化数据、编译模板、挂载Dom-->渲染、更新-->渲染、卸载 等一系列过程&#xff0…

Vue的生命周期函数详解

Vue有一个完整的生命周期&#xff0c;也就是从开始创建&#xff0c;初始化创建&#xff0c;编译模板&#xff0c;挂载Dom&#xff0c;渲染–>更新–>渲染&#xff0c;销毁等一系列过程&#xff0c;我们称之为Vue的生命周期。通俗的说就是Vue实例从创建到销毁的过程&#…

vue 生命周期 详解

详解Vue Lifecycle 先来看看vue官网对vue生命周期的介绍 Vue实例有一个完整的生命周期&#xff0c;也就是从开始创建、初始化数据、编译模板、挂载Dom、渲染→更新→渲染、销毁等一系列过程&#xff0c;我们称这是Vue的生命周期。通俗说就是Vue实例从创建到销毁的过程&#xff…

【vue2】vue生命周期的理解

&#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;vue生命周期的介绍、vue生命周期钩子函数详解&#xff0c;vue生命周期的执行顺序 目录 …

Vue生命周期详解(图解)

程序员学习必备书籍推荐&#xff1a; 首先我们对Vue生命周期官方给出的图进行详细解释 vue生命周期详细图解 什么是生命周期? 简而言之:从生到死的过程,从Vue实例创建-运行-销毁的过程 Vue实例有一个完整的生命周期&#xff0c;也就是从开始创建、初始化数据、编译模板、挂载…