Vue生命周期

1.vue的生命周期是什么?

        每一个vue实例从创建到销毁的过程,就是这个vue实例的生命周期。

        在这个过程中,他经历了从开始创建、初始化数据、编译模板、挂载Dom、渲染→更新→渲染、卸载等一系列过程

2.Vue生命周期图 

3.Vue生命周期图 详解

  • 我们先简单的来解说这张图,然后再通过例子来详看
  • 首先,从图上,我们可以看出,他的一个过程是

1.new Vue()实例化一个vue实例,然后init初始化event 和 lifecycle, 其实这个过程中分别调用了3个初始化函数(initLifecycle(), initEvents(), initRender()),分别初始化了生命周期,事件以及定义createElement函数,初始化生命周期时,定义了一些属性,比如表示当前状态生命周期状态得_isMounted ,_isDestroyed ,_isBeingDestroyed,表示keep-alive中组件状态的_inactive,而初始化event时,实际上就是定义了$once、$off、$emit、$on几个函数。而createElement函数是在初始化render时定义的(调用了initRender函数)


2.执行beforeCreate生命周期函数


3.beforeCreate执行完后,会开始进行数据初始化,这个过程,会定义data数据,方法以及事件,并且完成数据劫持observe以及给组件实例配置watcher观察者实例。这样,后续当数据发生变化时,才能感知到数据的变化并完成页面的渲染


4.执行created生命周期函数,所以,当这个函数执行的时候,我们已经可以拿到data下的数据以及methods下的方法了,所以在这里,我们可以开始调用方法进行数据请求了


5.created执行完后,我们可以看到,这里有个判断,判断当前是否有el参数(这里为什么需要判断,是因为我们后面的操作是会依赖这个el的,后面会详细说),如果有,我们再看是否有template参数。如果没有el,那么我们会等待调用$mount(el)方法(后面会详细说)。


6.确保有了el后,继续往下走,判断当有template参数时,我们会选择去将template模板转换成render函数(其实在这前面是还有一个判断的,判断当前是否有render函数,如果有的话,则会直接去渲染当前的render函数,如果没有那么我们才开始去查找是否有template模板),如果没有template,那么我们就会直接将获取到的el(也就是我们常见的#app,#app里面可能还会有其他标签)编译成templae, 然后在将这个template转换成render函数。


7.之后再调用beforMount, 也就是说实际从creted到beforeMount之间,最主要的工作就是将模板或者el转换为render函数。并且我们可以看出一点,就是你不管是用el,还是用template, 或者是用我们最常用的.vue文件(如果是.vue文件,他其实是会先编译成为template),最终他都是会被转换为render函数的。


8.beforeMount调用后,我们是不是要开始渲染render函数了,首先我们会先生产一个虚拟dom(用于后续数据发生变化时,新老虚拟dom对比计算),进行保存,然后再开始将render渲染成为真实的dom。渲染成真实dom后,会将渲染出来的真实dom替换掉原来的vm.$el(这一步我们可能不理解,请耐心往下看,后面我会举例说明),然后再将替换后的$el append到我们的页面内。整个初步流程就算是走完了


9.之后再调用mounted,并将标识生命周期的一个属性_isMounted 置为true。所以mounted函数内,我们是可以操作dom的,因为这个时候dom已经渲染完成了。


10.再之后,只有当我们状态数据发生变化时,我们在触发beforeUpdate,要开始将我们变化后的数据渲染到页面上了(实际上这里是有个判断的,判断当前的_isMounted是不是为ture并且_isDestroyed是不是为false,也就是说,保证dom已经被挂载的情况下,且当前组件并未被销毁,才会走update流程)


11.beforeUpdate调用之后,我们又会重新生成一个新的虚拟dom(Vnode),然后会拿这个最新的Vnode和原来的Vnode去做一个diff算,这里就涉及到一系列的计算,算出最小的更新范围,从而更新render函数中的最新数据,再将更新后的render函数渲染成真实dom。也就完成了我们的数据更新


12.然后再执行updated,所以updated里面也可以操作dom,并拿到最新更新后的dom。不过这里我要插一句话了,mouted和updated的执行,并不会等待所有子组件都被挂载完成后再执行,所以如果你希望所有视图都更新完毕后再做些什么事情,那么你最好在mouted或者updated中加一个$nextTick(),然后把要做的事情放在$netTick()中去做(至于为什么,以后讲到$nextTick再说吧)


13.再之后beforeDestroy没啥说的,实例销毁前,也就是说在这个函数内,你还是可以操作实例的


14.之后会做一系列的销毁动作,解除各种数据引用,移除事件监听,删除组件_watcher,删除子实例,删除自身self等。同时将实例属性_isDestroyed置为true


15.销毁完成后,再执行destroyed

4. Vue生命周期图 (中文图解)

5.Vue生命周期知识点 详解图 

 6..Vue生命周期实例

App.vue代码

<template>
	<div>
		<h1>爱笑话</h1>
		<!-- 03 使用组件 -->
		<JokCom></JokCom>
	</div>
</template>

<script>
	import JokCom from './components/JokCom.vue'
	export default{
		components:{JokCom}
	}
	//axios 安装
	// 01 cd /myday 切换到myday项目
	//02 npm i axios -S安装ajax请求工具
	//03 npm run serve 运行项目
</script>

<style>
	
</style>

JokCom.vue代码

<template>
	<div>
		<!-- <div>笑话数据</div> -->
		<div class="jok" v-for="jok in joks" :key="jok.docid">
			{{jok.summary}}
			<hr>
		</div>
		<button @click="getJok" :disabled="!canLoad" >加载更多</button>
	</div>

</template>
<style scoped="scoped">
	.jok{
		padding: 15px;
	}
</style>
<script>
	// 导入ajax请求工具  'axios'没有./开头,就直接从node_modules加载
	import axios from 'axios'
	export default{
		data(){
			return {
				joks:[],//笑话列表数据
				page:1,//当前是第几页数据
				canLoad:true,//是否可以加载下一页
			}
		},
		// 创建完毕
		created(){
			// 执行ajax请求
			this.getJok();
		},
		methods:{
			getJok(){
				this.canLoad = false;
				axios.get("http://dida100.com/mi/list.php?page="+this.page)
				// 表示请求成功
				.then(res=>{
					// res.data就是请求的数据
					console.log(res.data);
					// 把请求的数据添加到joks里面
					// concat(A,B) 把A数组与B数组合并赋值给joks
					this.joks = this.joks.concat(res.data.result)
					this.page++;
					this.canLoad = true;
				})
				// 请求失败
				.catch(err=>console.log(err))
			}
		}
	}
</script>

<style>
</style>

<think>嗯,用户想了解Vue.js生命周期及其各个阶段的钩子函数功能。首先,我需要回顾一下Vue生命周期相关知识。根据提供的引用内容,Vue生命周期分为八个阶段,每个阶段都有对应的钩子函数。用户的问题是要详细解释每个阶段和钩子函数的作用,所以我需要按照生命周期的顺序来组织回答。 首先,我应该先介绍生命周期的整体概念,说明它从实例创建到销毁的整个过程,以及钩子函数的作用。然后分阶段介绍每个钩子函数,比如创建阶段、挂载阶段、更新阶段和销毁阶段。每个阶段里有哪些钩子函数,它们的触发时机和用途是什么。比如在创建阶段,有beforeCreate和created,这两个钩子函数分别在实例初始化之后和数据观测建立之前触发,created之后可以进行数据操作,但DOM还未生成。 接下来是挂载阶段的beforeMount和mounted,这两个钩子涉及模板编译和DOM挂载。beforeMount在模板编译完成但尚未挂载到DOM时触发,而mounted在实例挂载到DOM后触发,适合进行DOM操作或第三方库初始化。 然后是更新阶段的beforeUpdate和updated,当数据变化导致DOM重新渲染时触发,beforeUpdate在虚拟DOM打补丁之前,updated在之后。需要注意的是避免在这两个钩子里修改数据,以免导致无限循环。 最后是销毁阶段的beforeDestroy和destroyed,用于清理工作,如移除事件监听或定时器。beforeDestroy在实例销毁前触发,还可以访问实例,而destroyed之后实例完全被销毁。 另外,需要提到Vue 3中的变化,比如使用setup函数替代了之前的钩子,但用户可能还在使用Vue 2,所以需要区分说明。同时,要强调正确使用生命周期钩子的重要性,比如在created中获取数据,在mounted中进行DOM操作,避免在beforeDestroy中遗漏清理导致内存泄漏。 还要考虑用户可能的后续问题,比如生命周期在实际项目中的应用、Vue 2和3的区别、常见错误处理等,提前准备相关问题。确保回答结构清晰,分点说明每个钩子函数,并引用提供的参考资料来支持内容,比如引用[1]到[4]中的描述。同时注意使用正确的LaTeX格式,虽然这个问题可能不涉及数学公式,但如果有需要的地方要正确应用。 现在需要将以上思考整理成一个结构化的回答,分阶段解释每个钩子函数,确保引用正确,并生成相关问题供用户进一步探索。还要检查是否符合用户的要求,比如使用中文,正确的代码块格式(如果有的话),以及引用标识的添加。</think>### Vue.js 生命周期详解及钩子函数功能 Vue.js 生命周期描述了 Vue 实例从创建到销毁的全过程,开发者可通过生命周期钩子函数在特定阶段执行自定义逻辑。以下按阶段详细说明各钩子函数的功能及触发时机: --- #### 一、**创建阶段** 1. **`beforeCreate`** - **触发时机**:实例初始化后,数据观测(data observer)和事件配置前 - **功能**:此时无法访问 `data` 和 `methods` 中的属性,适合初始化非响应式变量 - 代码示例: ```javascript beforeCreate() { console.log(this.message); // undefined } ``` 2. **`created`** - **触发时机**:数据观测已建立,但 DOM 未生成 - **功能**:可访问 `data` 和 `methods`,常用于异步数据请求(如 API 调用) - 示例: ```javascript created() { this.fetchData(); // 调用接口获取数据 } ``` --- #### 二、**挂载阶段** 3. **`beforeMount`** - **触发时机**:模板编译完成,但尚未挂载到 DOM - **功能**:最后一次操作虚拟 DOM 的机会,但实际 DOM 元素不可见 4. **`mounted`** - **触发时机**:实例挂载到 DOM 后 - **功能**:可操作真实 DOM,适合初始化第三方库(如图表库) - 示例: ```javascript mounted() { this.initChart(); // 渲染图表到 DOM } ``` --- #### 三、**更新阶段** 5. **`beforeUpdate`** - **触发时机**:数据变化后,虚拟 DOM 重新渲染前 - **功能**:可获取数据更新前的 DOM 状态 6. **`updated`** - **触发时机**:虚拟 DOM 重新渲染并应用补丁后 - **注意**:避免在此阶段修改数据,可能导致无限循环 --- #### 四、**销毁阶段** 7. **`beforeDestroy`** - **触发时机**:实例销毁前 - **功能**:清理定时器、解绑事件等资源释放操作 - 示例: ```javascript beforeDestroy() { clearInterval(this.timer); // 清除定时器 } ``` 8. **`destroyed`** - **触发时机**:实例销毁后 - **功能**:所有子实例和事件监听器已被移除 --- ### 生命周期图示 ```plaintext 创建阶段 → 挂载阶段 → 更新阶段 → 销毁阶段 │ │ │ │ beforeCreate beforeMount beforeUpdate beforeDestroy │ │ │ │ created mounted updated destroyed ``` --- ### 注意事项 - **Vue 3 变化**:组合式 API 中使用 `setup()` 替代 `beforeCreate` 和 `created`[^3] - **性能优化**:在 `mounted` 中避免同步修改 DOM,可能导致重复渲染 - **内存泄漏**:务必在 `beforeDestroy` 中清理全局事件监听器 --- §§ 1. Vue 生命周期钩子函数在实际项目中如何选择使用? 2. Vue 2 和 Vue 3 的生命周期有哪些区别? 3. 在 `created` 和 `mounted` 中请求数据有什么区别? 4. 为什么在 `updated` 钩子中修改数据可能导致问题? [^1]: Vue.js组件生命周期详解 [^2]: Vue实例生命周期与功能实现 : Vue.js 核心框架生命周期阶段 [^4]: Vue实例创建到销毁的全过程解析
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

让我打个盹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值