vue的生命周期及钩子函数

2024-05-16 12:32

本文主要是介绍vue的生命周期及钩子函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

每个vue实例被创建时都会经历一系列初始化过程,例如:设置数据监听、编译模板、将实例挂载到 DOM 并在数据变化时更新 DOM 等。同时在这些过程中会运行一些vue生命周期中的钩子函数,这些函数为用户提供在创建vue实例及创建完成后期不同阶段添加自己代码的机会。

钩子函数中的this指向当前vue实例。

vue实例生成及后期的钩子函数如下:

  • beforeCreate created
  • beforeMount mounted
  • beforeUpdate updated
  • beforeDestroy destroyed

注意: beforeCreate、created、beforeMount、mounted是在初始化实例时执行,会默认按照先后顺序执行。但是当更新数据时,就不再执行这4个钩子函数。

vue生命周期图示
vue生命周期图示
Vue实例有一个完整的生命周期,也就是从开始创建、初始化数据、编译模板、挂载Dom、渲染→更新→渲染、销毁等一系列过程,我们称这是Vue的生命周期。通俗说就是Vue实例从创建到销毁的过程,就是生命周期。

每一个组件或者实例都会经历一个完整的生命周期,总共分为三个阶段:初始化、运行中、销毁。

  • 1、实例、组件通过new Vue() 创建出来之后会初始化事件和生命周期,然后就会执行beforeCreate钩子函数,这个时候,数据还没有挂载,只是一个空壳,无法访问到数据和真实的dom,一般不做操作

  • 2、挂载数据,绑定事件等等,然后执行created函数,这个时候已经可以使用data中的数据,也可以更改数据,在这里更改数据不会触发updated函数,在这里可以在渲染前倒数第二次更改数据的机会,不会触发其他的钩子函数,一般可以在这里做初始数据的获取

  • 3、接下来开始找实例或者组件对应的模板,编译模板为虚拟dom放入到render函数中准备渲染,然后执行beforeMount钩子函数,在这个函数中虚拟dom已经创建完成,马上就要渲染,在这里也可以更改数据,不会触发updated,在这里可以在渲染前最后一次更改数据的机会,不会触发其他的钩子函数,一般可以在这里做初始数据的获取

  • 4、接下来开始render,渲染出真实dom,然后执行mounted钩子函数,此时,组件已经出现在页面中,数据、真实dom都已经处理好了,事件都已经挂载好了,可以在这里操作真实dom等事情

  • 5、当组件或实例的数据更改之后,会立即执行beforeUpdate,然后vue的虚拟dom机制会重新构建虚拟dom与上一次的虚拟dom树利用diff算法进行对比之后重新渲染

  • 6、当更新完成后,执行updated,数据已经更改完成,dom也重新render完成,可以操作更新后的虚拟dom

  • 7、当经过某种途径调用$destroy方法后,立即执行beforeDestroy,一般在这里做一些善后工作,例如清除计时器、清除非指令绑定的事件等等

  • 8、组件的数据绑定、监听…去掉后只剩下dom空壳,这个时候,执行destroyed,在这里做善后工作也可以

<div id="app"><ul><li v-for="a in arr">{{a}}</li></ul>{{msg}}<button @click="fn">改变</button>
</div>
<script src="node_modules/vue/dist/vue.js"></script>
<script>let vm = new Vue({el:"#app",//它是选择器data:{//data的值可以是对象或是函数,函数必须返回对象msg:"hello",arr:[1,2,3]},methods:{fn(){this.msg = "world";}},beforeCreate(){// 在这个钩子函数执行之前初始化一些事件和vue的生命周期// 在该函数执行时不能获取data中的数据,不能操作真实DOMconsole.log(this.msg);//undefinedconsole.log(document.getElementsByTagName("li"));//只能获取页面上的一个li并且行间还有vue指令console.log("beforeCreate");},created(){// 在执行这个钩子函数之前初始化注入和响应数据。一般在该函数中用于获取初始化数据// 在该函数执行时可以获取data中的数据,但是不能操作真实DOM// 在该函数中可以修改数据,此时数据还没有挂载到真实dom上,不会触发update函数console.log(this.msg);//"hello"console.log(document.getElementsByTagName("li"));//只能获取页面上的一个li并且行间还有vue指令console.log("created");},beforeMount(){// 在这个钩子函数之前判断是否有el、模板// 在该函数执行时可以获取data中的数据,但是不能操作真实DOM// 这是最后一次可以修改数据的地方,此时数据还没有挂载到真实dom上console.log(this.msg);//"hello"console.log(document.getElementsByTagName("li"));//只能获取页面上的一个li并且行间还有vue指令console.log("beforeMount");},mounted(){// 在该函数执行前把vue实例虚拟的dom挂载到真实dom上// 在该函数执行时可以获取data中的数据,也能操作真实DOMconsole.log(this.msg);//"hello"console.log(document.getElementsByTagName("li"));//获取到页面上的3个liconsole.log("mounted");},beforeUpdate(){console.log("beforeUpdate");},updated(){// 在该函数之前通过dom-diff算法进行dom对比,并重新渲染和打补丁console.log("updated");},beforeDestroy(){// vue实例不会自动销毁console.log("beforeDestroy");},destroyed(){// 销毁以后vue实例对象存在,但是会销毁观察者、子组件、事件监听者console.log("destroyed");}});vm.$destroy();//销毁vm实例vm.msg = "123";console.log(vm.msg);//"123"
</script>

注意: 虽然销毁了vue实例,但是vue对象依然存在,可以修改vue对象中的数据,只是不再更新对应的视图。

这篇关于vue的生命周期及钩子函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/994918

相关文章

Vue和React受控组件的区别小结

《Vue和React受控组件的区别小结》本文主要介绍了Vue和React受控组件的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录背景React 的实现vue3 的实现写法一:直接修改事件参数写法二:通过ref引用 DOMVu

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Python Counter 函数使用案例

《PythonCounter函数使用案例》Counter是collections模块中的一个类,专门用于对可迭代对象中的元素进行计数,接下来通过本文给大家介绍PythonCounter函数使用案例... 目录一、Counter函数概述二、基本使用案例(一)列表元素计数(二)字符串字符计数(三)元组计数三、C

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

MySQL中REPLACE函数与语句举例详解

《MySQL中REPLACE函数与语句举例详解》在MySQL中REPLACE函数是一个用于处理字符串的强大工具,它的主要功能是替换字符串中的某些子字符串,:本文主要介绍MySQL中REPLACE函... 目录一、REPLACE()函数语法:参数说明:功能说明:示例:二、REPLACE INTO语句语法:参数