【Vue】生命周期一文详解

目录

前言

生命周期

钩子函数使用方法

​编辑

周期-----创建阶段

创建阶段做了些什么事

该阶段可以干什么

周期----挂载阶段

挂载阶段做了什么事

该阶段适合干什么

周期----更新阶段

更新阶段做了什么事

该阶段适合做什么

周期----销毁阶段

销毁阶段做了什么事

该阶段适合做什么


前言

Vue生命周期分为四个周期:创建、挂载、更新、销毁

生命周期

每个周期对应两个函数,对应的函数又叫钩子函数

创建:

beforeCreate()        ------        创建前

created()                ------        创建后

挂载:

beforeMount()        ------       挂载前

mounted()               ------        挂载后

更新:

beforeUpdate()        ------        更新前

updated()                -----        更新后

销毁:

beforeDestroy()        -------        销毁前

destroyed()                ------        销毁后

钩子函数使用方法

<div class="app"><h1>{{msg}}</h1>{{num}}<button @click="add()">+1</button><button @click="destroy()">销毁</button></div><script>const vm = new Vue({el:'.app',data:{msg:'Vue的生命周期',num:1},methods:{add(){this.num++},destroy(){this.$destroy()}},// 创建// 创建前beforeCreate(){console.log('beforeCreate');},// 创建后created(){console.log('Created');},// 挂载// 挂载前beforeMount(){console.log('beforeMount');               },// 挂载后mounted(){console.log('Mounted');},// 更新// 更新前beforeUpdate(){console.log('beforeUpdata');},// 更新后updated(){console.log('Updataed');},// 销毁// 销毁前beforeDestroy(){console.log('beforeDestory');},// 销毁后destroyed(){console.log( 'Destoryed');}})</script>

更新数据

销毁

调用该方法

this.$destroy()

周期-----创建阶段

生成虚拟dom

该周期包含两个钩子函数,创建前beforeCreate()和创建后Created()

所谓的创建不是指Vue实例的创建,而是指数据代理和数据监测的创建,以此来分创建前和创建后

在创建前,是无法访问data中的数据的,包括methods

例:

在原代码的基础上,访问data中的num

 //创建前

beforeCreate(){

                console.log('beforeCreate',this.num);

            }

创建后是可以访问的,包括methods

// 创建后

            created(){

                console.log('Created',this.num);

            }

创建阶段做了些什么事

  1. 创建Vue实例vm
  2. 初始化事件对象和生命周期
  3. 调用beforeCreate()钩子函数(此时还无法通过vm去访问data中的属性)
  4. 初始化数据代理和数据监测
  5. 调用created()钩子函数(此时数据代理和数据监测已经创建完毕,可以通过vm去访问data中的属性)
  6. 编译模板语句生成虚拟dom(此时只是生成虚拟dom,页面上还没有渲染)

该阶段可以干什么

  • beforeCreate():可以在此时加一些loading效果
  • created:结束loading效果,发送一些网络请求,获取数据,也可以添加定时器

周期----挂载阶段

生成真实dom

该阶段包含两个钩子函数,挂载前beforeMount()和挂载后mounted()

挂载前和挂载后中间存在一个真实dom的生成

而挂载前和创建后之间存在一个虚拟dom的生成

在挂载前,是无法修改页面内容的

// 挂载前

            beforeMount(){

                console.log('beforeMount');

                document.querySelector('h1').innerHTML='挂载'

            }

挂载后是可以修改的

// 挂载后

            mounted(){

                console.log('Mounted');

                document.querySelector('h1').innerHTML='挂载'

            }

挂载阶段做了什么事

  1. 调用beforeMount()钩子函数(此时页面还未渲染,真实dom还没生成)
  2. 给vm追加$el属性,用它来代替"el",$el代表了真实的dom元素(此时真实dom生成,页面渲染完成)
  3. 调用mounted()钩子函数

该阶段适合干什么

mounted:可以操作页面的dom元素了

周期----更新阶段

该阶段只有在data变化后才会触发,进行重新渲染

该周期包含两个钩子函数,更新前beforeUpdate()和更新后updated()

这里的更新前是指data中的数据更新了,但是页面还没重新渲染前

更新前

使用断点debugger

 // 更新前

            beforeUpdate(){

                console.log('beforeUpdata');

                debugger

            }

更新后

解开断点

//更新后

 updated(){

                console.log('Updataed');

            }

其中diff算法就是在更新前和更新后之间进行的,虚拟dom进行对比,生成真实dom渲染到页面

更新阶段做了什么事

  1. data发生改变(这是该阶段开始的标志)
  2. 调用beforeUpdate()钩子函数(此时只是内存中的data数据发生变化,页面还没更新)
  3. 虚拟dom重新渲染和修补
  4. 调用updated()钩子函数(此时页面已更新)

该阶段适合做什么

  • beforeUpdate:适合在更新之前访问现有的dom,例,手动清除已添加的事件监听器
  • updated:页面更新后,如果想对数据作统一处理,可以在这里完成

周期----销毁阶段

卸载监视器,子组件,事件监听器

该阶段包含两个钩子函数,销毁前beforeDestroy()和销毁后Destroy()

与其说是销毁其实是卸载,卸载Vue实例上面的所有

该阶段只有调用该方法才能进入

vm.$destroy()

销毁前

打印vue实例对象,查看监视器,销毁前,监视器还是激活状态

 // 销毁前

            beforeDestroy(){

                console.log('beforeDestory');

                console.log(this);

                debugger

            }

虽然是激活状态,但是还是无法监听,我们在原有的代码基础上监听data中的num属性

 watch:{num(){console.log('监听一次');}},

当num属性值变化时,成功监听到了,当我们执行销毁时,由上得知,监听器还是在激活状态

但是以及无法监听了

销毁后

 // 销毁后

            destroyed(){

                console.log( 'Destoryed');

                console.log(this);

            }

watcher激活状态已经成了false

销毁阶段做了什么事

  1. 调用vm.$destroy()(进入销毁阶段)
  2. 调用beforeDestroy()钩子函数(此时Vue实例还在,虽然vm上的监视器、子组件、事件监听器还在,但是无法使用了,此时修改data也不会重新渲染页面了)
  3. 卸载子组件和监视器,解绑事件监听器
  4. 调用destroyed()钩子函数(此时Vue实例还在,只是空间还未释放,销毁后指的是vm对象身上所有的东西已经解绑完成)

该阶段适合做什么

beforeDestroy:适合作销毁前的准备工作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/206561.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tex2D使用学习

1. 背景&#xff1a; 项目中使用到了纹理进行插值的加速&#xff0c;因此记录一些自己在学习tex2D的一些过程 2. 代码&#xff1a; #include "cuda_runtime.h" #include "device_launch_parameters.h" #include <assert.h> #include <stdio.h>…

name 属性:提高 Vue 应用可维护性的关键

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

python爬虫中 HTTP 到 HTTPS 的自动转换

前言 在当今互联网世界中&#xff0c;随着网络安全的重要性日益增加&#xff0c;越来越多的网站采用了 HTTPS 协议来保护用户数据的安全。然而&#xff0c;许多网站仍然支持 HTTP 协议&#xff0c;这就给我们的网络爬虫项目带来了一些挑战。为了应对这种情况&#xff0c;我们需…

8. 队列

队列(queue)是一种遵循先入先出规则的线性数据结构。顾名思义&#xff0c;队列模拟了排队现象&#xff0c;即新来的人不断加入队列的尾部&#xff0c;而位于队列头部的人逐个离开。 如下图所示&#xff0c;我们将队列的头部称为“队首”&#xff0c;尾部称为“队尾”&#xff…

鸿蒙 ark ui 轮播图实现教程

前言&#xff1a; 各位同学有段时间没有见面 因为一直很忙所以就没有去更新博客。最近有在学习这个鸿蒙的ark ui开发 因为鸿蒙不是发布了一个鸿蒙next的测试版本 明年会启动纯血鸿蒙应用 所以我就想提前给大家写一些博客文章 效果图 具体实现 我们在鸿蒙的ark ui 里面列表使…

windows dockerdesktop 安装sqlserver2022

1.下载windows dockertop软件 下载连接 2.安装完成配置&#xff0c;下载源地址 {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"registry-mirrors": …

Jenkins与Docker的自动化CI/CD流水线实践

Pipeline 有诸多优点&#xff0c;例如&#xff1a; 项目发布可视化&#xff0c;明确阶段&#xff0c;方便处理问题 一个Jenkins File文件管理整个项目生命周期 Jenkins File可以放到项目代码中版本管理 Jenkins管理界面 操作实例&#xff1a;Pipeline的简单使用 这里是比较…

分布式架构demo

1、外层创建pom 版本管理器 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.15</version><relativePath/> <!-- lookup parent from repository…

2023年c语言程序设计大赛

7-1 这是一道送分题 为了让更多的同学参与程序设计中来&#xff0c;这里给同学们一个送分题&#xff0c;让各位感受一下程序设计的魅力&#xff0c;并祝贺各位同学在本次比赛中取得好成绩。 注&#xff1a;各位同学只需将输入样例里的代码复制到右侧编译器&#xff0c;然后直…

指针数组以及利用函数指针来实现简易计算器及typedef关键字(指针终篇)

文章目录 &#x1f680;前言&#x1f680;两段有趣的代码✈️typedef关键字 &#x1f680;指针数组&#x1f680;简易计算器的实现 &#x1f680;前言 基于阿辉前两篇博客指针的基础篇和进阶篇对于指针的了解&#xff0c;那么今天阿辉将为大家介绍C语言的指针剩下的部分&#…

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(八)

套餐模块功能开发 1. 新增套餐1.1 需求分析和设计1.1.1产品原型&#xff1a;1.1.2接口设计&#xff1a;1.1.3数据库设计&#xff1a; 1.2 代码开发1.2.1 DishController层1.2.2 DishService接口类1.2.3 DishServiceImpl接口实现类1.2.4 DishMapper层1.2.5 DishMapper.xml1.2.6 …

centos7内核升级(k8s基础篇)

1.查看系统内核版本信息 uname -r 2.升级内核 2.1更新yum源仓库 yum -y update更新完成后&#xff0c;启用 ELRepo 仓库并安装ELRepo仓库的yum源 ELRepo 仓库是基于社区的用于企业级 Linux 仓库&#xff0c;提供对 RedHat Enterprise (RHEL) 和 其他基于 RHEL的 Linux 发行…

java--static的应用知识:单例设计模式

1.什么是设计模式(Design pattern) ①一个问题通常有n中解法&#xff0c;其中肯定有一种解法最优的&#xff0c;这个最优的解法被人总结出来了&#xff0c;称之为设计模式。 ②设计模式有20多种&#xff0c;对应20多种软件开发中会遇到的问题。 2.单例设计模式 确保一个类只…

R语言如何实现多元线性回归

输入数据 先把数据用excel保存为csv格式放在”我的文档”文件夹 打开R软件,不用新建,直接写 回归计算 求三个平方和 置信区间(95%)

【功能测试】软件系统测试报告

1.引言 1.1.目的 本测试报告为 xxx 系统测试报告&#xff0c;本报告目的在于总结测试阶段的测试及测试结果分析&#xff0c;描述系统是否达到需求的目的。 本报告预期参考人员包括测试人员、测试部门经理、开发人员、项目管理人员等。 1.2.参考文档 《xxxx系统需求规格说明…

【CAN通信】CanIf模块详细介绍

目录 1.内容简介 2.CanIf详细设计 2.1 CanIf功能简介 2.2 一些关键概念 2.3依赖的上下层模块 2.4 功能详细设计 2.4.1 Hardware object handles 2.4.2 Static L-PDUs 2.4.3 Dynamic L-PDUs 2.4.4 Dynamic Transmit L-PDUs 2.4.5 Dynamic receive L-PDUs 2.4.6Physi…

什么是PDN的交流阻抗?

什么是PDN的交流阻抗&#xff1f; 在电力电子领域&#xff0c;PDN&#xff08;Power Distribution Network&#xff09;的交流阻抗是一个重要的概念&#xff0c;它反映了PDN在交流电源和负载之间传输电能的能力。了解PDN的交流阻抗对于优化电源设计、提高系统性能和可靠性具有重…

【Linux】第二十一站:文件(一)

文章目录 一、共识原理二、C系列文件接口三、从C过渡到系统&#xff1a;文件系统调用四、访问文件的本质 一、共识原理 文件 内容 属性 文件分为打开的文件 和 没打开的文件 打开的文件&#xff1a;是谁打开的&#xff1f;是进程&#xff01;----所以研究打开的文件本质是研…

扩散模型实战(十二):使用调度器DDIM反转来优化图像编辑

推荐阅读列表&#xff1a; 扩散模型实战&#xff08;一&#xff09;&#xff1a;基本原理介绍 扩散模型实战&#xff08;二&#xff09;&#xff1a;扩散模型的发展 扩散模型实战&#xff08;三&#xff09;&#xff1a;扩散模型的应用 扩散模型实战&#xff08;四&#xff…

Navicat 技术指引 | 适用于 GaussDB 的备份与还原功能

Navicat Premium&#xff08;16.2.8 Windows版或以上&#xff09; 已支持对 GaussDB 主备版的管理和开发功能。它不仅具备轻松、便捷的可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结构同步、协同合作、数据迁移等&#xff09;&#xff0c;这…