当前位置: 首页 > news >正文

Vue基础之事件机制、事件修饰符以及双向数据绑定

目录

一、事件机制

二、事件修饰符

三、双向数据绑定 


一、事件机制

Vue使用 v-on 指令监听DOM 事件,并在触发时运行一些 JavaScript 代码, 还可以接收一个需要调用的方法名称,我们可以在方法中通过$event参数传递原生事件对象,同时也可以传递其他参数。可以将v-on:事件名缩写为@事件名

<body>
	<div id="app">
		<!-- 直接运行一些 JavaScript 代码 -->
		<button v-on:click="console.log('我被点击了')">点击我</button>
		<!-- 接收一个需要调用的方法名称,即函数名,函数实现写在methods中 -->
		<button v-on:click="handler">点击我</button>
		<!-- 传递参数 -->
		<button v-on:click="handler1($event,'Hi')">点击我</button>
		<!-- 简写 -->
		<button @click="handler1($event,'Hi')">点击我</button>
	</div>
	<script>
		new Vue({
			el:"#app",
			methods:{
				handler(){
					console.log('hello vue');
				},
				handler1(e,n){
					console.log(e,n);
				}
			}
		})
	</script>
</body>

二、事件修饰符

在JavaScript事件处理程序中调用 event.preventDefault() 或 event.stopPropagation() 是非常常见的需求。Vue提供了更好的方式:事件处理函数只有纯粹的数据逻辑,而不是去处理 DOM 事件细节,通过事件修饰符来完成这些细节。

常见修饰符如下:

.stop 停止事件冒泡

.prevent 阻止事件默认行为

.capture 在事件捕获阶段执行事件处理函数

.self 只当在 event.target 是当前元素自身时触发处理函数

.once 事件处理函数执行一次后解绑

.passive 滚动事件的默认行为 (即滚动行为) 将会立即触发 ,一般与scroll连用,能够提升移动端的性能 (因为每次事件产生,浏览器都会去查询一下是否有preventDefault阻止该次事件的默认动作。我们加上.passive就是为了告诉浏览器,不用查询了,我们没用preventDefault阻止默认动作。passive和prevent冲突,不能同时绑定在一个监听器上。

按键修饰符 (一般与keyup事件类型配合使用):

.enter.tab.delete.esc.space.up.down.left.right 、.ctrl.alt.shift.meta

鼠标修饰符(mouseup事件):

.left.right.middle

<style>
	.outer{
		width: 400px;
		height: 400px;
		background-color: rgb(233, 47, 202);
		display: flex;
		justify-content: center;
		align-items: center;
	}
	.outer1{
		overflow: scroll;
		height: 100px;
	}
	.inner{
		width: 200px;
		height: 200px;
		background-color: rgb(237, 143, 20);
	}
</style>
</head>
<body>
	<div id="app">
		<!-- 按下回车执行 enter 或者 13 (13表示回车键)-->
		<!-- <input type="text" @keyup.enter="console.log('键盘按下了')"> -->
		<input type="text" @keyup.13="console.log('键盘按下了')">
		<!-- 按下鼠标执行 mouseup middle 中间滚轮 left right -->
		<input type="text" @mouseup.middle="console.log('鼠标按下了')">
		<br>-------------------------------------------------------
		<!-- .stop 阻止事件冒泡 -->
		<div class="outer" @click="outer">
			<div class="inner" @click.stop="inner">stop 阻止事件冒泡</div>
		</div>
		<br>-------------------------------------------------------
		<!-- .captrue 事件捕获阶段执行 -->
		<div class="outer" @click.capture="outer">
			<div class="inner" @click="inner">.captrue 事件捕获阶段执行</div>
		</div>
		<!-- 阻止事件的默认行为 prevent -->
		<a @click.prevent="toJump" href="https://www.baidu.com">百度一下</a>
		<!-- 事件修饰符 passive 一般与scroll连用 表示直接使用事件默认行为-->
		<div class="outer outer1" @scroll="outer">
			<div class="inner" @click="inner"></div>
		</div>
	</div>
	<script>
		new Vue({
			el:"#app",
			data:{
			},
			methods:{
				outer(){
					console.log('outer被点击了');
				},
				inner(event){
					console.log('inner被点击了');
					// 原生阻止事件冒泡
					// event.stopPropagation()
				},
				toJump(event){
					// 原生阻止事件默认行为
					// event.preventDefault()
				}
			}
		})
	</script>
</body>

三、双向数据绑定 

可以用 v-model 指令在表单 <input><textarea><select> 元素上创建双向数据绑定。 它会根据控件类型自动选取正确的方法来更新元素。尽管有些神奇,但 v-model 本质上不过是语法糖。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。使用v-model绑定了值, 那么name属性就可以不用写了。

<body>
	<div id="app">
		<!-- v-model  数据改变 v-model 视图也会更新-->
		{{stu}}
		<!-- lazy修饰符 懒加载,按下回车后才更新数据 -->
		<!-- 用户名: <input type="text" v-model.lazy="stu.username"> -->
		<!-- trim修饰符 去除前后空格 -->
		<br>
		<br>
		用户名: <input type="text" v-model.trim="stu.username">
		<!-- number修饰符 将输入的值转成数字类型-->
		密码: <input type="password" v-model.number="stu.password">
		<!-- 单选按钮 -->
		<br>
		男:<input type="radio" value="male" v-model="stu.gender">
		女:<input type="radio" value="female" v-model="stu.gender">
		<br>
		<!-- 复选框 -->
		游泳<input type="checkbox" value="swimming" v-model="stu.hobbies">
		篮球<input type="checkbox" value="basketball"  v-model="stu.hobbies">
		足球<input type="checkbox" value="football" v-model="stu.hobbies">
		<br>
		<!-- 多行文本框 -->
		<textarea v-model="stu.introduce"></textarea>
		<br>
		<!-- 下拉框 -->
		<select v-model="stu.city">
			<option value="beijing">北京</option>
			<option value="shanghai">上海</option>
			<option value="liuzhou">柳州</option>
		</select>
	</div>
	<script>
		new Vue({
			el:"#app",
			data:{
				// 表单对象 
				stu:{
					hobbies:[]
				}
			},
			methods:{}
		})
	</script>
</body>

相关文章:

  • linux socket:接收时阻塞与非阻塞的设置
  • 9月23日计算机视觉基础学习笔记——经典机器学习
  • leetcode 并查集整理
  • 前端 | 50天50个前端项目把握基础知识 - 持续更新中
  • 【智能优化算法-凌日搜索算法】基于凌日搜索算法求解单目标优化问题附matlab代码
  • C++11重写muduo网络库5——Thread,EventLoopThread,EventLoopThreadPool
  • NISP的渗透测试怎么操作的
  • 安装Nginx教程
  • Java_接口基本介绍
  • 16、Java——QuickHit游戏
  • SpringBoot--Controller获取HttpServletRequest
  • 牛客刷题笔记
  • 我把华为云的Ubuntu 18.04升级到了Ubuntu 22.04
  • Google Earth Engine-02(主界面介绍)
  • 5.java数据结构与算法 ---- 第七章 八大排序(冒泡;选择;插入/希尔;快排;归并;基数)
  • 分享的文章《人生如棋》
  • “大数据应用场景”之隔壁老王(连载四)
  • 【Linux系统编程】快速查找errno错误码信息
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • HTTP 简介
  • java2019面试题北京
  • java8 Stream Pipelines 浅析
  • PAT A1050
  • React-flux杂记
  • underscore源码剖析之整体架构
  • Vue.js 移动端适配之 vw 解决方案
  • 飞驰在Mesos的涡轮引擎上
  • 关于字符编码你应该知道的事情
  • 汉诺塔算法
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 将回调地狱按在地上摩擦的Promise
  • 利用DataURL技术在网页上显示图片
  • 我看到的前端
  • 怎样选择前端框架
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • PostgreSQL之连接数修改
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • # 达梦数据库知识点
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (js)循环条件满足时终止循环
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (第二周)效能测试
  • (二十三)Flask之高频面试点
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (三)Honghu Cloud云架构一定时调度平台
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (转) Face-Resources
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • .net core 6 集成和使用 mongodb