前端_Vue_8.生命周期钩子、侦听器

news2025/1/13 10:07:06

文章目录

  • 一、生命周期钩子
    • 1.1. 注册生命周期钩子
    • 1.2. 生命周期图示
  • 二、侦听器
    • 2.1. 基本示例
    • 2.2. 深层侦听器
    • 2.3. 即时回调的侦听器
    • 2.4. 回调的触发时机
    • 2.5. this.$watch()
    • 2.6. 停止侦听器


一、生命周期钩子

每个Vue组件实例在创建时都需要经历一系列的初始化步骤,比如设置好数据侦听,编译模板,挂在实例到 DOM,以及在数据改变时更新 DOM。在此过程中,它也会运行被称为生命周期钩子的函数,让开发者有机会在特定阶段运行自己的代码。

1.1. 注册生命周期钩子

举例来说,mounted 钩子可以用来在组件完成初始渲染并创建DOM节点后运行代码:

export default {
	mounted() {
		console.log('the component is now mounted.')
	}
}

还有一些其他钩子,会在实例生命周期的不同阶段被调用,最常见的是 mounted、updated和unmounted。

所有生命周期钩子函数的 this 上下文都会自动指向当前调用它的组件实例。注意:避免用箭头函数来定义生命周期钩子,因为如果这样的话你将无法在函数中通过 this 获取组件实例。

1.2. 生命周期图示

下面是实例生命周期的图表。你现在并不需要完全理解图中所有内容,但以后它将是一个有用的参考。
在这里插入图片描述

二、侦听器

2.1. 基本示例

计算属性允许我们声明性地计算衍生值。然而在有些情况下,我们需要在状态变化时执行一些“副作用”:例如更改DOM,或是根据异步操作的结果去修改另一处的状态。

在选项式API中,我们可以使用 watch 选项在每次响应式属性发生变化时触发一个函数。

回顾一下,响应式属性就是用响应式系统进行包装的对象的顶层属性,即data选项中返回的对象中的顶层属性。
当你更改响应式属性后,相关的DOM中绑定的值会自动更新。而侦听器可以使你在响应式属性更新时添加更复杂的更新逻辑。

由于前台绑定的写法是固定的,<标签 :attribute=“绑定值”/>和<标签>{{绑定值}}<标签/>,你无法通过这种写法来添加复杂逻辑,所以就有了watch侦听器的写法。

export default {
	data() {
		return {
			question: '',
			answer: 'Questions usually contain a question mark. ;-)'
		}
	},
	watch: {
		// 每当 question 改变时,这个函数就会执行
		question(newQuestion, oldQuestion) {
			if (newQuestion.includes('?')) {
				this.getAnswer()
			}
		}
	},
	methods: {
		async getAnswer() {
			this.answer = 'Thinking...'
			try {
				const res = await fetch('https://yesno.wtf/api')
				this.answer = (await res.json()).answer
			} catch (error) {
				this.answer = 'Error! Could not reach the API. ' + error
			}
		}
	}
}
<p>
	Ask a yes/no question:
	<input v-model="question" />
</p>
<p> {{ answer }} </p>

watch 选项也支持把键设置成用 . 分隔的路径:

export default {
	watch: {
		// 只能是简单的路径,不支持表达式
		'some.nested.key'(newValue) {
	
		}
	}
}

2.2. 深层侦听器

watch 默认是浅层的:被侦听的属性,仅在被赋新值时,才会触发回调函数——而嵌套属性的变化不会触发。如果想侦听所有嵌套的变更,你需要深层侦听器:

export default {
	watch: {
		someObject: {
			handler(newValue, oldValue) {
				// 注意:在嵌套的变更中,
				// 只要没有替换对象本身
				// 那么这里的 newValue 和 oldValue 相同
				// 也就是说这边的 new/oldValue 只是反映对象本身是否变化,嵌套对象变化不会影响本身,有点类似 值类型和引用类型的区别。
			},
			deep: true
		}
	}
}

谨慎使用
深度侦听需要遍历被侦听对象中所有嵌套的属性,当用于大型数据结构时,开销很大。因此请只在必要时才使用它,并且要留意性能。

2.3. 即时回调的侦听器

watch 默认是懒执行的:仅当数据源变化时,才会执行回调。但在某些场景中,我们希望在创建侦听器时候,立即执行一遍回调。举例来说,我们想请求一些初始数据,然后在相关状态更改时重新请求数据。

我们可以用一个对象来声明侦听器,这个对象由 handler 方法和 immediate: true 选项(这边可以看出,子项也叫选项,即 属性: value形式的),这样便能强制回调函数立即执行:

export default {
	// ...
	watch: {
		question: {
			handler(newQuestion) {
				// 在组件实例创建时会立即调用
			},
			// 强制立即执行回调
			immediate: true
		}
	}
}

回调函数的初次执行就发生在 created 钩子之前。Vue此时已经处理了 data 、 computed 和 methods 选项,所以这些属性在第一次调用时就是可用的。

2.4. 回调的触发时机

当你更改了响应式状态,它可能会同时触发Vue组件更新和侦听器回调。

默认情况下,用户创建的侦听器回调,都会在Vue组件更新之前被调用。这意味着你在侦听器回调中访问的DOM将是被Vue更新之前的状态。

如果想在侦听器回调中能访问被Vue更新之后的DOM,你需要指明 flush: ‘post’ 选项:

export default {
	// ...
	watch: {
		key: {
			handler() {},
			flush: 'post'
		}
	}
}

2.5. this.$watch()

我们也可以使用组件实例的 $watch() 方法来命令式地创建一个侦听器:

export default {
	created() {
		this.$watch('question', (newQuestion) => {
			// ...
		})
	}
}

如果要在特定条件下设置一个侦听器,或者只侦听响应用户交互的内容,这方法很有用。它还允许你提前停止该侦听器。

2.6. 停止侦听器

用 watch 选项或者 $watch() 实例方法声明的侦听器,会在宿主组件卸载时自动停止。因此,在大多数场景下,你无需关心怎么停止它。

在少数情况下,你的确需要在组件卸载之前就停止一个侦听器,这时可以调用 $watch() API返回的函数:

const unwatch = this.$watch('foo', callback)

// 当侦听器不再需要时
unwatch()

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

重要升级:SpreadJS 16.0 crack SpreadJS 2023

SpreadJS 16.0 crack&#xff0c;建议大家赶紧升级&#xff0c;速度提升65% Adds enhancements for TableSheet, Designer, Calculation, Shape and Workbook. December 22, 2022 - 16:53New Version Features New File Format New .sjs file format makes the ExcelIO process…

Java语法:final关键字

一、final是什么&#xff1f; final关键字是最终的意思&#xff0c;可以修饰&#xff08;类、方法、变量&#xff09;。 二、final的作用 修饰类&#xff1a;表明该类是最终类&#xff0c;不能被继承&#xff1b; 报错说明&#xff1a;不发从最终的Animal类继承 修饰方法&…

数论专题(2)莫比乌斯反演

今天我们开始莫比乌斯反演的学习.这篇博文特别多的公式,强迫症患者请勿观看 莫比乌斯反演 莫比乌斯函数: 定义莫比乌斯函数,当时,. 当是square-free number时,设的质因数分解有项,则; 否则,; 根据上面,我们不难验证也是积性函数 定理 ,即和互为彼此的逆 证明 设n的不…

4.防止数据权限越权

涉及的修改 这次提交内容很简单&#xff0c;就是在这些类的操作上&#xff0c;添加了 checkXxxDataScope()方法校验&#xff0c;下面来看下这个方法的实现 /*** 校验用户是否有数据权限* * param userId 用户id*/ Override public void checkUserDataScope(Long userId) {if (…

RMQ延迟队列

目录一、场景二、TTL和DLX三、开发步骤一、场景 “订单下单成功后&#xff0c;15分钟未支付自动取消” 1.传统处理超时订单 采取定时任务轮训数据库订单&#xff0c;并且批量处理。其弊端也是显而易见的&#xff1b;对服务器、数据库性会有很大的要求&#xff0c; 并且当处理大…

jeecg-boot前端实现表格插槽、定制化修改

大家好&#xff0c;我是雄雄。 前言 关于jeecg-boot&#xff0c;之前介绍过好多好多次&#xff0c;至于说这是个什么样的技术&#xff0c;这里不在详细介绍&#xff0c;大家可以在gitee或者百度上搜搜&#xff0c;大致了解一下。 因为是个开源的框架&#xff0c;所以一般小项目…

Unity 3D 创建简单的几何模型 || Unity 3D Assets 游戏资源目录管理

Unity 3D 创建简单的几何模型 Unity 3D 是一个强大的游戏开发引擎。在游戏开发中使用的模型常常是从外部导入的&#xff0c;Unity 3D 为了方便游戏开发者快速创建模型&#xff0c;提供了一些简单的几何模型&#xff0c;其中包括立方体、球体、圆柱体、胶囊体等。 自由物体创建…

单测在商家前端业务中的实践

1. 背景 商家系统是提供给得物商家在得物平台上可以稳定运营的服务抓手&#xff0c;前端代码也伴随着系统的发展而不断壮大。这样将导致文档却更新不及时&#xff0c;最后想再通过这些文档回溯业务逻辑也非常困难。 且若代码结构上没有关注&#xff0c;动辄就会产出一个大几千…

LFU 的设计与实现

LFU 的设计与实现 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;LFU 的设计与实现 CSDN&#xff1a;LFU 的设计与实现 题目描述 LFU&#xff08;least frequently used&#xff09;。即最不经常使用页置换算法。 题目链接&#xff1a;LeetCode 460. LF…

浅析Linux字符设备驱动程序内核机制

前段时间在学习linux设备驱动的时候&#xff0c;看了陈学松著的《深入Linux设备驱动程序内核机制》一书。说实话&#xff0c;这是一本很好的书&#xff0c;作者不但给出了在设备驱动程序开发过程中的所需要的知识点&#xff08;如相应的函数和数据结构&#xff09;&#xff0c;…

从零开始的MySQL(2)

目录1.数据库约束1.1 unique1.2 not null1.3 default1.5 primary key1.6 foreign key2. 将A的记录插入到B中3.聚合函数3.1 count()函数3.2 sum()函数3.3 avg()函数3.4 max()函数3.5 MIN()函数3.6 group by4.联合查询4.1 内连接4.2 外连接4.3 自连接4.4 子连接1.数据库约束 约束…

【简单易上手】昇思MindSpore邀你定制专属Diffusion模型

昇思MindSpore首个可训练diffusion模型DDPM马上要和大家见面了&#xff0c;操作简单&#xff0c;可训练推理&#xff0c;单卡即可运行&#xff0c;欢迎广大产学研开发者使用启智社区免费Ascend NPU算力体验 最近爆火的AI绘图&#xff0c;相信大家并不陌生了。 从AI绘图软件生成…

知识图谱的知识表示:向量表示方法

目录 从词向量到实体向量 知识图谱向量表示学习模型 TransE TransH TransR TransD TransX系列总结 DisMult 从词向量到实体向量 知识图谱的向量表示。有一类词是代表实体的&#xff0c;假如对这类实体词的向量做一些计算&#xff0c;比如用Rome向量减去Italy的向量&am…

使用界面组件Telerik ThemeBuilder研发主题,只需要这七步!

Telerik DevCraft包含一个完整的产品栈来构建您下一个Web、移动和桌面应用程序。它使用HTML和每个.NET平台的UI库&#xff0c;加快开发速度。Telerik DevCraft提供最完整的工具箱&#xff0c;用于构建现代和面向未来的业务应用程序。 ThemeBuilder是一个web应用程序&#xff0…

前端基础(一)_初识JavaScript

最开始的时候&#xff0c;浏览器只能显示文本和图片&#xff0c;并不能做各种动态的操作。 一、JavaScript的历史 1、网景公司的布兰登艾奇开发了js 2、借鉴了java的数据管理机制、c的函数 3、Js的创建是用来解决浏览器和用户之间互动的问题&#xff08;表单提交的问题&#…

LeanCloud 快速实现服务端

1. 实现与服务器交互平台 1.1 Google 平台的 Firebase (需要科学网络) Firebasehttps://firebase.google.cn/ 1.2 LeanCloud 平台 LeanCloudhttps://www.leancloud.cn/ 2. 配置信息 2.1 在 LeanCloud 控制台创建应用, 根据 SDK下载 开发指南配置应用 2.2 配置文件 build…

拉伯杠杆平台|新冠药龙头跳水,万亿产业开启新阶段!

依照此前发表的时间表&#xff0c;新修订的《体育法》将于2023年1月1日起正式施行。 12月27日早盘&#xff0c;A股前期大热的抗疫体裁呈现显着回落。熊去氧胆酸、新冠药、肝炎概念、新冠检测、生物疫苗等体裁跌幅较大。熊去氧胆酸、新冠药两大板块跌幅超过4%&#xff0c;抢手龙…

外贸采购管理对业务的影响及解决方案

在外贸企业中&#xff0c;采购环节的把控对整个业务环节都有影响。像是采购供应商是否能够按时到货&#xff0c;会直接影响生产进度&#xff1b;采购质量的好坏直接影响产品的生产进度及质量&#xff1b;采购成本的高低&#xff0c;直接影响产品的成本及利润&#xff1b;采购供…

NSUM 问题

目录标题两数之和两数之和 2&#xff08;多个结果集去重&#xff09;15. 三数之和两数之和 问题描述 给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个 整数&#xff0c;并返回他们的数组下标。 你可以假设每种输入只会对应一个答…

基于Java(JSP)+MySQL实现(Web)学生成绩综合管理系统【100010065】

Java 课程设计:师生交流系统 1.1 课设题目 信息商务学院学生成绩综合管理系统的综合与开发 2.1 课设目的 《Java 程序设计》课程是计算机专业的一门专业必修课程&#xff0c;针对课程进行为期两周的实践教学&#xff0c;旨在提升本专业学生对此课程中的理论知识的综合应用能…