Vue的生命周期函数学习记录

本文详细解析了Vue.js的生命周期,从beforeCreate到destroyed的每个阶段,包括组件加载、渲染、更新和销毁的过程。阐述了虚拟DOM如何转换为真实DOM,并展示了各生命周期钩子函数的应用场景。

在看Vue的声明周期函数之前,可以看一下Vue元素被载入显示的过程。

也就是说,template模板在编译之后,转化成渲染函数render,有render渲染函数生成对应的虚拟节点VNode,然后VNode再通过patch(虚拟DOM的核心部分,会区分当前结点的变化,根据变化进行数据跟新。),使用方法createElement()生成对应的实体节点DOM,显示到网页的视图上。

beforeCreate:function(){
    //被import 载入 此时的方法和 属性都没有被绑定
    console.log('1 --YellowChild---beforeCreate');
},
created:function(){
    // 虚拟结点VNode创建成功  此时的方法和 属性都已经绑定了
    console.log('2--YellowChild---created');
},
beforeMount:function(){
    //挂载之前 还是虚拟节点VNode dom还没显示
    console.log('3---YellowChild---beforeMount');
    console.log(this.$refs.id_container);
},
mounted:function(){
    //实体DOM已经显示出来了
    console.log('4---YellowChild---mounted');
},
beforeUpdate:function(){
    //数据更新前
    console.log('5--YellowChild---beforeUpdate');
},    
updated:function(){
    //数据跟新后
    console.log('6--YellowChild---updated');
},   
activated:function(){
    // keep-alive标签之后 会留在内存中 不会被销毁 展示当前Vue组件时 调用
    console.log('7---YellowChild---activated');
},   
deactivated:function(){
    //keep-alive标签之后 会留在内存中 不会被销毁 切换到被的Vue页面时被调用
    console.log('8---YellowChild---deactivated');
},
beforeDestroy:function(){
    //Vue被销毁之前
    console.log('9---YellowChild---beforeDestroy');
},
destroyed:function(){
    //Vue被销毁之后
    console.log('10---YellowChild---destroyed');
},

学习博客:

https://www.cnblogs.com/fundebug/p/vue-virtual-dom.html

https://www.youkuaiyun.com/gather_20/OtTakg0sODAwLWJsb2cO0O0O.html

https://blog.youkuaiyun.com/qq_43201542/article/details/87885131

<think>首先,用户的问题是关于Vue页面的生命周期函数的介绍。系统指令要求使用中文回答,并且遵循特定的LaTeX格式:行内数学表达式用$...$,独立公式用$$...$$并单独成段。还要确保LaTeX语法正确。 用户提供了多个引用,我需要参考这些引用来构建回答。引用包括: - 引用[1]: Vue 3 生命周期函数详解,提到生命周期钩子及其重要性。 - 引用[2]: 强调Vue 3的新增生命周期函数提供了更多灵活性和控制力。 - 引用[3]: 描述了beforeCreate钩子,初始化阶段。 - 引用[4]: 提供了详细的代码示例,展示了beforeCreate, created, beforeMount, mounted等钩子。 关键点是介绍Vue页面的生命周期函数。Vue生命周期函数是组件在创建、更新和销毁过程中自动调用的钩子函数。 回顾Vue生命周期阶段: 1. Creation:初始化阶段,包括beforeCreate、created。 2. Mounting:挂载阶段,包括beforeMount、mounted。 3. Updating:更新阶段,包括beforeUpdate、updated。 4. Destruction:销毁阶段,包括beforeUnmount、unmounted(在Vue 3中名称有变化)。 从引用中,Vue 3的生命周期钩子包括: - beforeCreate - created - beforeMount - mounted - beforeUpdate - updated - beforeUnmount(在Vue 2中是beforeDestroy) - unmounted(在Vue 2中是destroyed) 在回答中,我需要结构化介绍: 1. 概述生命周期函数的重要性。 2. 列出主要生命周期钩子,并简要描述每个钩子。 3. 基于引用提供代码示例。 4. 确保回答真实可靠,参考提供的引用。 引用[3]和[4]有具体描述: - beforeCreate:初始化事件和生命周期,data和methods未初始化。 - created:data和methods已初始化。 - beforeMount:模板编译完成,但未渲染到DOM。 - mounted:组件挂载到DOM,用户可见。 我需要覆盖所有主要钩子。 系统指令还要求生成相关问题。 回答结构: - 使用清晰的结构,逐步解释。 - 帮助用户理解生命周期。 - 最后添加相关问题。 LaTeX要求:由于这是关于编程的,可能需要数学表达式,但如果提到变量或概念,确保使用$...$。例如,如果提到一个变量名如$data$,但最好避免必要的LaTeX。主要焦点是文本描述。 确保中文回答。 大纲回答: 1. 引言:简述Vue生命周期函数的作用(参考引用[1])。 2. 生命周期概述:描述主要阶段(Creation, Mounting, Updating, Unmouting)。 3. 详细解释每个钩子: - beforeCreate:初始化事件和生命周期,data和methods未初始化(引用[3]、[4])。 - created:data和methods已初始化,可以操作数据(引用[4])。 - beforeMount:模板编译完成,但未渲染到DOM(引用[4])。 - mounted:组件挂载到DOM,用户可见(引用[4])。 - beforeUpdate:数据变化前调用。 - updated:数据变化后DOM更新后调用。 - beforeUnmount:组件销毁前调用(Vue 3)。 - unmounted:组件销毁后调用。 4. 代码示例:基于引用[4],提供一个简单的示例代码块。 5. 总结:强调合理使用这些函数的重要性(参考引用[2])。 6. 相关问题:生成相关问题。 最后,添加引用标识:[^1], [^2], etc.,基于提供的引用。引用已编号为[1]到[4],所以在回答末尾添加引用。 引用标识如[^1],在Markdown中通常用于脚注。 在回答中,自然地添加引用标识在引用段落的末尾。 例如:"Vue 3 生命周期函数详解[^1]." 生成相关问题: - 类似于示例:"1. Vue生命周期函数在项目中的应用场景?" - "2. Vue 3中的新生命周期钩子?" - "3. 如何优化使用生命周期函数?" 确保回答完整。 </think>### Vue 页面生命周期函数详解 Vue.js 是一个渐进式的 JavaScript 框架,其核心概念之一是组件的生命周期函数(Lifecycle Hooks)。这些函数是 Vue 组件在创建、挂载、更新和销毁过程中自动调用的钩子,开发者可以利用它们在特定阶段执行自定义逻辑(如数据初始化、DOM 操作或资源清理)。理解生命周期函数对于构建高效、可维护的 Vue 应用至关重要,因为它允许开发者精确控制组件行为,避免常见陷阱如内存泄漏或性能瓶颈[^1]。本文基于 Vue 3(Vue.js 的最新主要版本)进行介绍,主要内容基于引用[1]、[3]、[4],并结合通用知识以确保准确性。 #### 生命周期概述 Vue 组件的生命周期分为四个主要阶段: 1. **Creation(创建阶段)**:组件实例初始化,设置数据、事件和生命周期钩子。 2. **Mounting(挂载阶段)**:模板编译并渲染到 DOM,组件变为可见。 3. **Updating(更新阶段)**:响应式数据变化时,组件重新渲染。 4. **Unmounting(卸载阶段)**:组件实例销毁,清理资源。 每个阶段包含特定的生命周期钩子函数,开发者在钩子中编写代码可以干预这些过程。Vue 3 在生命周期方面与 Vue 2 兼容,但优化了钩子名称(如 `beforeUnmount` 替代 `beforeDestroy`),提升了性能和开发者体验[^2]。 #### 主要生命周期钩子函数详解 以下是 Vue 3 的核心生命周期钩子函数,按执行顺序列出。每个钩子都包括作用描述和代码示例(基于引用[4]的简化版)。注意:钩子函数中的 `this` 指向 Vue 组件实例。 1. **`beforeCreate`** - **作用**:在组件实例初始化后立即调用。此时,事件系统(Events)和基础生命周期已设置,但数据(`data`)、方法(`methods`)和响应式系统尚未初始化。通常用于插件注入或全局配置,但无法操作组件数据[^3][^4]。 - **代码示例**: ```vue <script> export default { beforeCreate() { console.log('beforeCreate: 数据未初始化', this.msg); // 输出 undefined }, data() { return { msg: 'Hello Vue' }; } }; </script> ``` 2. **`created`** - **作用**:在实例创建完成后调用。此时,数据(`data`)、方法(`methods`)和计算属性(`computed`)已初始化,但 DOM 尚未挂载。适合进行数据获取(如 API 调用)、事件监听设置或逻辑初始化。避免在此阶段执行 DOM 操作,因为元素未渲染[^4][^1]。 - **代码示例**: ```vue <script> export default { created() { console.log('created: 数据已初始化', this.msg); // 输出 "Hello Vue" // 可以安全操作数据,例如:this.fetchData(); }, data() { return { msg: 'Hello Vue' }; } }; </script> ``` 3. **`beforeMount`** - **作用**:在模板编译完成后、首次渲染到 DOM 前调用。此时,虚拟 DOM 已生成,但真实 DOM 元素尚未替换模板字符串。可用于最后时刻的数据修改,但一般推荐在此操作视图。 - **代码示例**: ```vue <script> export default { beforeMount() { console.log('beforeMount: DOM 未渲染', document.querySelector('div')); // 可能为 null } }; </script> ``` 4. **`mounted`** - **作用**:在组件首次挂载到 DOM 后调用。此时,真实 DOM 已渲染完成,用户可以看见页面。适合执行 DOM 操作(如初始化第三方库)、事件绑定或异步任务启动。这是创建阶段的最后一个钩子,表示组件完全就绪[^4][^2]。 - **代码示例**: ```vue <script> export default { mounted() { console.log('mounted: DOM 已渲染', document.querySelector('div')); // 输出真实元素 // 例如:this.initChart(); // 初始化图表库 } }; </script> ``` 5. **`beforeUpdate`** - **作用**:在响应式数据变化后、虚拟 DOM 重新渲染前调用。用于在更新前访问当前 DOM 状态或执行条件检查。避免在此更改数据,可能导致无限循环。 - **代码示例**: ```vue <script> export default { data() { return { count: 0 }; }, beforeUpdate() { console.log('beforeUpdate: 数据将更新', this.count); }, methods: { increment() { this.count++; } } }; </script> ``` 6. **`updated`** - **作用**:在数据变化导致的虚拟 DOM 重新渲染并应用到真实 DOM 后调用。适合执行依赖于新 DOM 的操作(如调整元素位置)。但避免在此修改数据,以防止递归更新[^1]。 - **代码示例**: ```vue <script> export default { updated() { console.log('updated: DOM 已更新', document.querySelector('div').innerText); } }; </script> ``` 7. **`beforeUnmount` (Vue 3 新名称)** - **作用**:在组件实例销毁前调用。用于清理资源(如移除事件监听器、取消定时器或关闭连接)。确保应用无内存泄漏[^2][^1]。 - **代码示例**: ```vue <script> export default { beforeUnmount() { console.log('beforeUnmount: 组件即将销毁'); // 例如:window.removeEventListener('resize', this.handleResize); } }; </script> ``` 8. **`unmounted` (Vue 3 新名称)** - **作用**:在组件实例销毁后调用。所有子组件也已卸载,此时组件已从 DOM 中移除。常用于日志记录或最终清理[^2]。 - **代码示例**: ```vue <script> export default { unmounted() { console.log('unmounted: 组件已销毁'); } }; </script> ``` 在 Vue 3 中,`beforeUnmount` 和 `unmounted` 替代了 Vue 2 的 `beforeDestroy` 和 `destroyed`,以增强语义一致性[^2]。 #### 总结与最佳实践 Vue生命周期函数提供了对组件生命周期的精细控制。合理使用它们可以显著提升代码可维护性和性能: - 优先在 `created` 中处理数据初始化,避免阻塞渲染。 - 在 `mounted` 中执行 DOM 相关操作,确保元素可用。 - 在 `beforeUnmount` 中清理资源,防止内存泄漏。 Vue 3 的新钩子(如 `beforeUnmount`)提供了更多灵活性,帮助开发者适应现代前端需求[^2][^1]。实际开发中,应结合 Composition API(如 `setup()` 函数)使用生命周期钩子,以获得更简洁的代码结构。 如需进一步学习,可参考 Vue 官方文档或相关教程[^1][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值