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

相关文章

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

MySQL 中 ROW_NUMBER() 函数最佳实践

《MySQL中ROW_NUMBER()函数最佳实践》MySQL中ROW_NUMBER()函数,作为窗口函数为每行分配唯一连续序号,区别于RANK()和DENSE_RANK(),特别适合分页、去重... 目录mysql 中 ROW_NUMBER() 函数详解一、基础语法二、核心特点三、典型应用场景1. 数据分

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

Python get()函数用法案例详解

《Pythonget()函数用法案例详解》在Python中,get()是字典(dict)类型的内置方法,用于安全地获取字典中指定键对应的值,它的核心作用是避免因访问不存在的键而引发KeyError错... 目录简介基本语法一、用法二、案例:安全访问未知键三、案例:配置参数默认值简介python是一种高级编

python 常见数学公式函数使用详解(最新推荐)

《python常见数学公式函数使用详解(最新推荐)》文章介绍了Python的数学计算工具,涵盖内置函数、math/cmath标准库及numpy/scipy/sympy第三方库,支持从基础算术到复杂数... 目录python 数学公式与函数大全1. 基本数学运算1.1 算术运算1.2 分数与小数2. 数学函数

前端如何通过nginx访问本地端口

《前端如何通过nginx访问本地端口》:本文主要介绍前端如何通过nginx访问本地端口的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、nginx安装1、下载(1)下载地址(2)系统选择(3)版本选择2、安装部署(1)解压(2)配置文件修改(3)启动(4)

HTML中meta标签的常见使用案例(示例详解)

《HTML中meta标签的常见使用案例(示例详解)》HTMLmeta标签用于提供文档元数据,涵盖字符编码、SEO优化、社交媒体集成、移动设备适配、浏览器控制及安全隐私设置,优化页面显示与搜索引擎索引... 目录html中meta标签的常见使用案例一、基础功能二、搜索引擎优化(seo)三、社交媒体集成四、移动

HTML input 标签示例详解

《HTMLinput标签示例详解》input标签主要用于接收用户的输入,随type属性值的不同,变换其具体功能,本文通过实例图文并茂的形式给大家介绍HTMLinput标签,感兴趣的朋友一... 目录通用属性输入框单行文本输入框 text密码输入框 password数字输入框 number电子邮件输入编程框

HTML img标签和超链接标签详细介绍

《HTMLimg标签和超链接标签详细介绍》:本文主要介绍了HTML中img标签的使用,包括src属性(指定图片路径)、相对/绝对路径区别、alt替代文本、title提示、宽高控制及边框设置等,详细内容请阅读本文,希望能对你有所帮助... 目录img 标签src 属性alt 属性title 属性width/h

CSS3打造的现代交互式登录界面详细实现过程

《CSS3打造的现代交互式登录界面详细实现过程》本文介绍CSS3和jQuery在登录界面设计中的应用,涵盖动画、选择器、自定义字体及盒模型技术,提升界面美观与交互性,同时优化性能和可访问性,感兴趣的朋... 目录1. css3用户登录界面设计概述1.1 用户界面设计的重要性1.2 CSS3的新特性与优势1.