草庐IT

vue高级特性总结

敲代码敲到头发茂密 2023-05-01 原文


文章目录

一、修饰符

1、事件修饰符

案例

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<!--1、引入vue框架-->
		<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
		
		<style>
			.main{
				width:200px;
				height:200px;
				background: red;
			}
			.box{
				width:100px;
				height:100px;
				background: yellowgreen;
			}
		</style>
		
	</head>
	<body>
		
		<div id='app'>
			<div class='main' @click='work1'>
				<div class="box" @click='work2'>
					<button @click='work3'>按钮A</button>
				</div>	
			</div>	
			<a href='http://www.baidu.com' @click.prevent="work3">百度</a>
		</div>
			
		<script>
			
			Vue.createApp({
				data(){
					return{
						
					}
				},
				methods:{
					work1(){
						console.log('--work1--')
					},
					work2(){
						console.log('--work2--')
					},
					work3(){
						console.log('--work3--')
					},
				}
			}).mount('#app')
			
	
		</script>
		
	</body>
</html>

当点击按钮A时,会触发嵌套在最外层的事件,如下图所示:

html事件冒泡:html的事件默认会往外一层一层传递
事件修饰符:
.stop:阻止事件冒泡;(事件冒泡:点击子元素,事件会一级一级冒泡到父元素)
.self:只有点击元素自身时才触发事件
.prevent:阻止元素默认的事件行为

解决方法:采用.stop属性

案例1

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<!--1、引入vue框架-->
		<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
		
		<style>
			.main{
				width:200px;
				height:200px;
				background: red;
			}
			.box{
				width:100px;
				height:100px;
				background: yellowgreen;
			}
		</style>
		
	</head>
	<body>
		
		<div id='app'>
			<div class='main' @click='work1'>
				<div class="box" @click.stop='work2'>
					<button @click.stop='work3'>按钮A</button>
				</div>		
			</div>
		</div>

		<script>
			Vue.createApp({
				data(){
					return{
						
					}
				},
				methods:{
					work1(){
						console.log('--work1--')
					},
					work2(){
						console.log('--work2--')
					},
					work3(){
						console.log('--work3--')
					},
				}
			}).mount('#app')
		</script>
		
	</body>
</html>

案例2

.prevent:阻止元素默认的事件行为

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<!--1、引入vue框架-->
		<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
		
	</head>
	<body>
		
		<div id='app'>
			<a href='http://www.baidu.com' @click.prevent="work3">百度</a>
		</div>
	
		<script>
			Vue.createApp({
				data(){
					return{
						
					}
				},
				methods:{
					
				}
			}).mount('#app')

		</script>
		
	</body>
</html>

2、按键修饰符

键盘按键事件:@keyup
回车键:@keyup.enter:不用点击提交数据按钮触发事件,按enter键也可以触发事件

案例3

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<!--1、引入vue框架-->
		<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
	</head>
	<body>
		
		<div id='app'>
			
			<div>
				账号:<input type='text' v-model.trim='user'/><br>
				密码:<input type='pwd'  v-model.number='pwd'/><br>
				手机:<input type='text'  v-model.lazy='phone'/><br>
				年领:<input type='text' @keyup.enter='alertB' v-model.lazy='age' /><br />
				<button @click='alertB'>点击提交数据</button>
			</div>
		</div>
		
		<script>
			
			Vue.createApp({
				data(){
					return{
						user:'kobe',
						pwd:123456,
						phone:15111111111,
						age:18
					}
				},
				methods:{
					alertB(){
						alert('提交数据')
					}
				}
			}).mount('#app')
			
	
		</script>
		
	</body>
</html>

3、表单修饰符

.trim:如果要自动过滤用户输入的首尾空白字符,可以给 v-model 添加 trim 修饰符
.number:自动将输入的纯数字转换为数值类型
.lazy:在默认情况下, v-model 在每次 input 事件触发后将输入框的值与数据进行同步 (除了上述输入法组合文字时)。你可以添加 lazy 修饰符,从而转为在 change 事件之后进行同步:

案例4

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<!--1、引入vue框架-->
		<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
	</head>
	<body>
		
		<div id='app'>
			
			<div>
				账号:<input type='text' v-model.trim='user'/>
				密码:<input type='pwd'  v-model.number='pwd'/>
				手机号:<input type='text'  v-model.lazy='phone'/>
			</div>
		</div>
		
		<script>
			
			Vue.createApp({
				data(){
					return{
						user:'kobe',
						pwd:123456,
						phone:15111111111
					}
				}
			}).mount('#app')
			
	
		</script>
		
	</body>
</html>

二、计算属性computed

在vue中,如果我们需要通过一个或多个数据来计算出来另一个数据,应该怎么去做?比如:根据用户选择商品的数量来计算商品的总价格。这个时候我们就可以通过计算属性来实现。

计算属性是 vue实例中,可以通过 computed这个配置项来定义计算属性

案例5

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<!--1、引入vue框架-->
		<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
	</head>
	<body>
		
		<div id='app'>
			<h3>商品名称:{{goods.name}}</h3>
			<h3>商品单价:{{goods.price}}</h3>
			<h3>商品数量:
				<button @click='add'>+</button>
				<input type='text' v-model.number='goods.number' />
				<button @click='sub'>-</button>
			</h3>
			<hr />
			<h3>总价:{{sumPrice}}</h3>
			<hr />
			<h3>数组中大于50的数字:{{range_50}}</h3>
		</div>
		
		<script>
			
			Vue.createApp({
				data(){
					return{
						goods:{
							name:"lemon",
							price:8,
							number:6
						},
						arr:[1,5,8,89,54,66,88]
					}
				},
				methods:{
					sub(){
						return this.goods.number--
					},
					add(){
						return this.goods.number++
					},
					
				},
				//计算属性
				computed:{
					//商品总价
					sumPrice(){
						return this.goods.price*this.goods.number
					},
					range_50(){
						return this.arr.filter(function(value){
							return value>50
						})
					}
				}
			}).mount('#app')
			
	
		</script>
		
	</body>
</html>

三、监听器watch

Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:侦听器在vue中可以使用watch来定义侦听器,

案例6

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<!--1、引入vue框架-->
		<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
	</head>
	<body>
		
		<div id='app'>
			<h3>侦听器的使用</h3>
			air:<input type='text'v-model='air'/>
		</div>
		
		<script>
			
			Vue.createApp({
				data(){
					return{
						air:100
					}
				},
				//侦听器
				watch:{
					//侦听飞机这个属性值的变化,当air值发生变化时会执行和属性名称同名的侦听器中的方法
					air(val){
						//val:为lemon最新的值
						console.log('air最新的值:',val)
					},
				}
			}).mount('#app')
			
		</script>
		
	</body>
</html>

注意:data()中层级嵌套的数据侦听,第74行代码

案例7:当商品数量大于1000时,输入框中数字自动设置成1000;当商品数量小于0时,输入框中数字自动设置成0

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<!--1、引入vue框架-->
		<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
	</head>
	<body>
		
		<div id='app'>
			<h3>商品名称:{{goods.name}}</h3>
			<h3>商品单价:{{goods.price}}</h3>
			<h3>商品数量:
				<button @click='add'>+</button>
				<input type='text' v-model.number='goods.number' />
				<button @click='sub'>-</button>
			</h3>
			<h3>最大的库存量:{{goods.maxNumber}}</h3>
			<hr />
			<h3>总价:{{sumPrice}}</h3>
			<hr />
			<h3>数组中大于50的数字:{{range_50}}</h3>
			
			<hr />
			<h3>侦听器的使用</h3>
			air:<input type='text'v-model='air'/>
		</div>
		
		<script>
			
			Vue.createApp({
				data(){
					return{
						goods:{
							name:"lemon",
							price:8,
							number:6,
							maxNumber:1000,
						},
						arr:[1,5,8,89,54,66,88],
						air:100
					}
				},
				methods:{
					sub(){
						return this.goods.number--
					},
					add(){
						return this.goods.number++
					},
					
				},
				//计算属性
				computed:{
					//商品总价
					sumPrice(){
						return this.goods.price*this.goods.number
					},
					range_50(){
						return this.arr.filter(function(value){
							return value>50
						})
					},
				},
				//侦听器
				watch:{
					//侦听飞机这个属性值的变化,当air值发生变化时会执行侦听器中同名的方法 
					air(val){
						//val:为air最新的值
						console.log('air最新的值:',val)
					},
					//data()中层级嵌套的数据侦听
					'goods.number':function(val){
						console.log(val)
						if(val<0){
							this.goods.number=0
						}else if(val>1000){
							this.goods.number=this.goods.maxNumber
						}
					}
				}
			}).mount('#app')
			
	
		</script>
		
	</body>
</html>

侦听器之深度侦听

语法形式一:侦听直接定义在data中的数据的变化

a(val,oldVal){
	console.log('a:',val,oldVal)
},
或者
a:function(val,oldVal){
	console.log('a:',val,oldVal)
},

语法形式二:侦听嵌套数据的具体某个字段的变化

'obj.name':function(val,oldVal){
	console.log('name:',val,oldVal)
},

语法形式三:侦听嵌套数据中任意数据的变化
开启深度侦听(只要在obj里面,不管层级多深,都能够侦听到),例如

obj:{
	//开启深度侦听(只要在obj里面,不管层级多深,都能够侦听到)
	deep:true,
	handler:function(val){
		console.log('obj:',val)
	}
}

案例8

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<!--1、引入vue框架-->
		<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
	</head>
	<body>
		
		<div id='app'>
		
			a:<input type='text' v-model='a' />
			name:<input type='text' v-model='obj.name' />
			age:<input type='text' v-model='obj.age' />
			desc:<input type='text' v-model='obj.info.desc' />
		
		</div>
		
		<script>
			
			Vue.createApp({
				data(){
					return{
						a:'66',
						obj:{
							name:'kobe',
							age:18,
							info:{
								desc:'desc'
							}
						}
					}
				},
				methods:{
					
				},
				computed:{
					
				},
				watch:{
					//语法形式一:直接定义在data中的数据的变化
//					a(val,oldVal){
//						console.log('a:',val,oldVal)
//					},
					a:function(val,oldVal){
						console.log('a:',val,oldVal)
					},
					//语法形式二:嵌套数据的具体某个字段的变化
					'obj.name':function(val,oldVal){
						console.log('name:',val,oldVal)
					},
					//语法形式三:嵌套数据中任意数据的变化
					obj:{
						//开启深度侦听(只要在obj里面,不管层级多深,都能够侦听到)
						deep:true,
						handler:function(val){
							console.log('obj:',val)
						}
					}
					
				}
			}).mount('#app')
			
	
		</script>
		
	</body>
</html>

四、生命周期钩子函数

//生命周期的钩子函数
beforeCreate(){
	console.log('---组件对象创建之前----:')
},
created(){
	console.log('---组件对象创建之后----:')
},
beforeMount(){
	console.log('---组件挂载之前----:')
},
mounted(){
	console.log('---组件挂载之后----:')
},
beforeUpdate(){
	console.log('---数据修改之前----:')
},
updated(){
	console.log('---数据修改之后----:')
},

有关vue高级特性总结的更多相关文章

  1. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

  2. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  3. (附源码)vue3.0+.NET6实现聊天室(实时聊天SignalR) - 2

    参考文章搭建文章gitte源码在线体验可以注册两个号来测试演示图:一.整体介绍  介绍SignalR一种通讯模型Hub(中心模型,或者叫集线器模型),调用这个模型写好的方法,去发送消息。  内容有:    ①:Hub模型的方法介绍    ②:服务器端代码介绍    ③:前端vue3安装并调用后端方法    ④:聊天室样例整体流程:1、进入网站->调用连接SignalR的方法2、与好友发送消息->调用SignalR的自定义方法 前端通过,signalR内置方法.invoke()  去请求接口3、监听接受方法(渲染消息)通过new signalR.HubConnectionBuilder().on

  4. Simulink方法总结和避坑指南(一)——Simulink入门与基本调试方法 - 2

    文章目录一、项目场景二、基本模块原理与调试方法分析——信源部分:三、信号处理部分和显示部分:四、基本的通信链路搭建:四、特殊模块:interpretedMATLABfunction:五、总结和坑点提醒一、项目场景  最近一个任务是使用simulink搭建一个MIMO串扰消除的链路,并用实际收到的数据进行测试,在搭建的过程中也遇到了不少的问题(当然这比vivado里面的debug好不知道多少倍)。准备趁着这个机会,先以一个很基本的通信链路对simulink基础和相关的debug方法进行总结。  在本篇中,主要记录simulink的基本原理和基本的SISO通信传输链路(QPSK方式),计划在下篇记

  5. ruby - 高级语言是否使用数据结构? - 2

    我目前还在上学,正在上一门关于用C++实现数据结构的类(class)。在业余时间,我喜欢使用“高级”语言(主要是Ruby和一些c#)进行编程。既然这些高级语言为你管理内存,你会用数据结构做什么?我可以理解对队列和堆栈的需求,但是您需要在Ruby中使用二叉树吗?还是2-3-4树?为什么?谢谢。 最佳答案 Sosincethesehigherlevellanguagesmanagethememoryforyou,whatwouldyouusedatastructuresfor?使用数据结构的主要原因与垃圾收集无关。但它是以某种方式有效的

  6. vue 实现内容超出两行显示展开更多功能,可依据需求自定义任意行数! - 2

    平时开发中我们经常会遇到这样的需求,在一个不限高度的盒子中会有很多内容,如果全部显示用户体验会非常不好,所以可以先折叠起来,当内容达到一定高度时,显示展开更多按钮,点击即可显示全部内容,先来看看效果图: 这样做用户体验瞬间得到提升,接下来看看具体细节。0">主要操作在内容这里{{item.username}},……展开更多样式大家可依据自己项目需求进行设计,这里就不贴了,主要说几个关键的。1、在data中定义三个属性isShowMore:false, //控制展开更多的显示与隐藏textHeight:null, //框中内容的高度status:false, //内容状态是否打开2.计算内容是否

  7. 【动态规划】背包问题(详细总结,很全) - 2

    【动态规划】一、背包问题1.背包问题总结1)动规四部曲:2)递推公式总结:3)遍历顺序总结:2.01背包1)二维dp数组代码实现2)一维dp数组代码实现3.完全背包代码实现4.多重背包代码实现一、背包问题1.背包问题总结暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化!背包问题是动态规划(DynamicPlanning)里的非常重要的一部分,关于几种常见的背包,其关系如下:在解决背包问题的时候,我们通常都是按照如下五部来逐步分析,把这五部都搞透了,算是对动规来理解深入了。1)动规四部曲:(1)确定dp数组及其下标的含义(2)确定递推公式(3)dp数组的初始化(4)确定遍历顺

  8. c# - 与 C# 相比,您会强调 Ruby 的哪些语言特性? - 2

    我正在就Ruby语言和环境向.NET(C#)开发团队进行一系列演讲。我把它当作一个机会来强调Ruby相对于C#的优势。首先,我想在进入环境之前专注于语言本身(RoR与ASPMVC等)。你会介绍Ruby语言的哪些特性? 最佳答案 我刚才在一个.NET用户组做了一个关于IronRuby的演讲,遇到了类似的问题。我关注的事情是:鸭子打字。没有什么比ListstringList=newList()更愚蠢的了;表达力强,语法简洁。简单的事情,比如省略括号、数组和散列文字等(结合鸭子类型,你会得到string_list=[]这显然更好)。所有的

  9. vue3.0 + vite2.0+如何兼容低版本浏览器 - 2

    这里写自定义目录标题一、问题二、解决三、解决方案四、打包预览一、问题在使用vue3.2和vite2开发一个移动端或者钉钉端H5微服务iosapp内置浏览器打开没问题安卓app内置浏览器打开空白页面vconsole打印出现报错globalthisundefind二、解决内置浏览器版本比较低打印出来是63vue3代码不兼容低版本浏览器三、解决方案步骤一:vite.config.ts里build.target配置项指定构建目标为es2015或者步骤二:安装@vitejs/plugin-legacy安装完报错也还在指定版本可以解决“@vitejs/plugin-legacy”:“1.8.0”,步骤三:

  10. ruby - 你最喜欢 Ruby 的什么特性? - 2

    就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter为指导。9年前关闭。已向.NET提出类似问题和Java,但不适用于Ruby。所以,你最喜欢Ruby的什么特性?您可能还对hiddenfeaturesofRuby感兴趣.请具体说明,并为每个答案发布一项功能。解释或代码示例会很好。 最佳答案 块非常好:my_array.each{|element|printelement}#.

随机推荐