事件处理v-on

用于事件交互。

语法:v-on:要绑定的事件=“事件触发时执行的函数” (函数这里可以写括号,也可以不写,没有影响)

简写:@:

事件触发时要执行的函数,在Vue配置参数中,通过methods:{}配置

<body><div id="root"><button v-on:click="consoleMessage">1</button><button @click="consoleMessage">2</button></div><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>let vm = new Vue({el: '#root',data:{},methods:{consoleMessage(){console.log('hello');}}})</script></body>

传参、this指向

传参:事件默认传递参数event(也可以不叫这个名字)。如果需要event之外的参数,可以在v-on设置绑定的函数时,以 要绑定的函数名(要传递的参数) 格式。和函数传参是一样的。

但要注意的是,当自己传递了某个参数时,可能无法在绑定的事件里获取event(取决于当前vue版本的语法)。如果无法获取event,在传参时,就要使用$event表示当前位置传递event。但如果语法支持,也可以直接使用event获取。

  <button @click="consoleMessage(100,$event)">2</button><button @click="consoleMessage(100)">2</button>

this指向:事件绑定的函数是普通函数的情况下,函数中的this为Vue实例,本例中也就是vm。

如果是写在Vue组件里,this指向组件。

事件绑定的函数是箭头函数的情况下,函数中的this为window。

推荐绑定的函数中使用普通函数,不要用箭头函数。

<body><div id="root"><button v-on:click="consoleMessage('catcat')">1</button><button @click="consoleMessage">2</button></div>...methods:{consoleMessage(name){console.log(`hello ${name}`);console.log(this);}}...

给methods设定的函数,实际上也会被添加到Vue实例上,但事件函数是没有数据代理的。

如果把事件函数写在data中,实际上代码也是可以生效的,但是data中的数据多了一层数据代理,对于不需要代理的数据,最好还是写在methods中。

事件修饰符

在绑定事件时,如果希望修改事件的某些默认设置,可以使用事件修饰符。

语法:@事件.事件修饰符

Vue中提供的事件修饰符:

.prevent

设置取消事件的默认行为的执行。

以a标签为例,a标签默认打开网页,可以使用click.prevent达成点击a标签不会新开网页的效果。

        ...<a href="www.baidu.com" @click.prevent="myEvent">goto baidu</a>...methods:{...myEvent(){alert('hello');}}...

.stop

阻止事件冒泡。

比如在一个div里有一个按钮,当点击按钮时,由于按钮在div内部,点击事件会同时发生在按钮和div身上,如果按钮绑定了click事件,div也绑定了click事件,两个click事件都会触发。如果只希望触发内部按钮的click事件,不触发外部div事件,可以使用click.stop。

<body><div id="root"><div class="outerDiv" @click="changeColor"><button class="innerButton" @click="change">click</button></div></div><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>let vm = new Vue({el: '#root',data:{},methods:{change(){console.log('change');},changeColor(){console.log('changeColor');}}})</script></body>

点击button会触发两个console。

如果设置click.stop,则只会触发一个:

如果是多层嵌套结构,有三层div,给内层事件设置.stop:

<body><div id="root"><div class="outerDiv" @click="outer"><div class="midDiv" @click="mid"><button class="innerButton" @click.stop="inner">click</button></div></div></div>...methods:{inner(){console.log('inner');},mid(){console.log('mid');},outer(){console.log('outer');}}})...

对于一个a标签,如果不希望点击标签后页面跳走,用click.stop是无法阻止页面跳走的:

虽然.stop可以阻止页面的冒泡行为,但当在a标签的click上设置stop时,页面仍然可以跳走,需要写click.stop.prevent。事件修饰符可以连写。

.once

事件只能触发一次。

设置之后,绑定的事件只有第一次触发时才生效。再点击不会生效。(比较好理解这里不写例子了)

.capture

使用事件捕获模式。

对于嵌套的div,如果两个div都绑定了相同的click事件,但每个事件的传参不一样。

当点击一个div时,先进行事件捕获,事件捕获由外向内,会先经过outerDiv,再经过innerDiv。捕获结束后,进行事件冒泡,事件冒泡由内向外,先经过innerDiv,再经过outerDiv。在事件冒泡的阶段处理事件。

设置事件捕获,则事件会在捕获阶段进行处理。

如果想先触发外层div,click.capture应该放在外层div上。

<body><div id="root"><div class="outter" @click="getData(1)"><div class="inner" @click="getData(2)"></div></div></div></div><style>.outter{background-color: aquamarine;padding: 5px;}.inner{background-color: chocolate;padding: 5px;}</style><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>let vm = new Vue({el: '#root',data:{},methods:{getData(data){console.log(data);}}})</script></body>

点击内部div,返回的顺序

给外部div设置捕获阶段触发,返回的顺序:

.self

只有event.target是当前操作的元素时才触发事件。也就是说,如果代码存在嵌套结构,事件触发时(通过冒泡或捕获触发),可能事件的触发并不是由直接对当前标签进行交互时触发,是冒泡或捕获上来的,这种情况下绑定的事件函数不会被触发。

.passive

事件的默认行为立即执行,无需等待事件回调执行完毕。

这里用一个滚动事件来说明,先回顾一下滚动事件:

overflow:auto。当元素溢出时,出现滚动条。

绑定滚动事件:

@scroll 页面上的滚动条滑动时触发,当滚动条到底时,再把滚动条往下拽,事件不会触发。

@wheel 滚动鼠标的滚轮时触发,当滑动条到底时,再滚动鼠标滚轮,也会触发事件。

当执行wheel滚动事件时,会先执行绑定事件内的逻辑,当绑定事件执行完毕后,才执行滚动事件的默认行为(滚动条移动)。因此当滚动事件内部的逻辑运算时间过长时,即使移动滚动条,滚动条也会出现不动的现象。

<body><div id="root"><ul @wheel="getData"><li></li><li></li><li></li></ul></div><style>ul{width: 200px;height: 200px;background-color: aqua;overflow: auto; }  li{width: 200px;height: 100px;}</style><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>let vm = new Vue({el: '#root',data:{},methods:{getData(){for(let i = 0;i < 1000000;++i){console.log('con');}}}})</script></body>

在这个例子中,由于滚轮滑动触发的事件内部要执行100万次,因此即使滑动滑动条,也很久不会有反应。

可以使用wheel.passive来让默认行为先触发,不用等绑定的事件执行完毕后再触发。

    <div id="root"><ul @wheel.passive="getData"><li></li><li></li><li></li></ul></div>

但并不是所有的事件都在绑定事件执行完成后才执行,大部分事件会先执行默认行为(滚动事件中,scroll就是先执行默认事件,因此scroll不需要设置修饰符,也可以正常执行)。

键盘事件

两个键盘事件

keydown 按下键盘就触发,不需要抬起来。

keyup 按下键盘再抬起来才触发。

键盘的名称和编码、如何设置按下特定按键时触发绑定事件

input框内的数据通过event.target.value获取。

设置按下特定按键时触发绑定事件:语法是keyup.按键别名,表示按对应的按键时才触发绑定事件。通过keyup/keydown.enter代表按下回车抬起时才触发绑定的事件。

<body><input @keydown.enter="getKeyDown" id="root" v-model:="code"><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>let vm = new Vue({el: '#root',data(){return {code : '',}},methods:{getKeyDown(){console.log(`enter ${this.code}`);},}})</script>
</body>

(按center键触发,输出当前输入框中的数据)

常见别名: enter 回车;delete 删除/退格;esc 退出;space 空格;tab 换行;up 上;down 下;left 左;right 右

如果想要给某个按键绑定事件,但是这个事件不在vue提供的别名里,可以使用按键本身的名字来指定只有按下某个特殊的键时,才触发绑定事件。键盘上每个按键都有自己的名字和编码。event.key会返回按键的名字。event.keyCode可以获得键盘事件按下的按键编码。

<body><input @keydown="getKeyDown" id="root" v-model="code"><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>let vm = new Vue({el: '#root',data(){return {code : '',}},methods:{getKeyDown(){console.log(event.key);console.log(event.keyCode);},}})</script>
</body>

对于驼峰形式的key,不能直接写key,应该把每个字母都变成小写,并且用-连接。

以PageDown为例,如果想设置按下PageDown触发事件:

    <input @keydown.page-down="getKeyDown" id="root" v-model="code">

而且,不是键盘上所有的按键都可以绑定事件。

在某些浏览器上,通过keyup/keydown.按键编码 也可以触发绑定的事件,但是这种方式现在不被推荐,这种方式在渐渐被移除,在一些浏览器上无法生效(对于不同的设备,每个按键的编码不完全一样,所以这种方法在被移除)。

特殊的按键

tab键在常见按键里比较特殊,tab会把焦点从当前元素上切走。当前事件如果设定了keyup.tap,按键按下之后,焦点已经从当前元素上移走了,因此当keyup时,绑定的事件无法触发(因为对于当前元素来说,当前元素已经不是之前的元素了,自然也没有keyup事件)。因此tap使用在keydown上。

ctrl、alt、shift、meta(windows标志键)键也比较特殊。这些按键叫做系统修饰键。当这些按键配合keyup使用时,按下修饰键的同时,需要再按下其他键,当释放其他按键时,keyup事件才会被触发。当这些按键配合keydown使用时,不需要按下其他按键,只按按键本身就能触发事件。

如果想设置键盘按下ctrl+y时才触发,可以使用keyup.系统修饰键.另一个按键,用keyup.ctrl.y就可以实现这种效果。

vue自定义键盘名称和编码

Vue.config.keyCodes.自定义别名 = 按键编码

比如Vue.config.keyCodes.myEnter = 13,可以定义一个叫myEnter的按键,他在按键编码为13的键被按下或抬起时被识别。但这种方法也不太推荐。

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

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

相关文章

变换域通讯系统CCSK的matlab仿真

CCSK&#xff08;Cyclic Code Shift Keying&#xff09;通信系统的MATLAB仿真。实现完整的CCSK调制、AWGN信道传输和解调过程&#xff0c;并计算了误码率&#xff08;BER&#xff09;。 % CCSK通信系统仿真 clear; clc; close all;% 参数设置 L 31; % m序列…

技术演进中的开发沉思-40 MFC系列:多线程协作

今天说说MFC的线程&#xff0c;当年用它实现中间件消息得心应手之时&#xff0c;可以实现一边实时接收数据&#xff0c;一边更新界面图表图文信息&#xff0c;顺滑得让人想吹声口哨。 MFC 多线程它像给程序装上了分身术&#xff0c;让原本只能 “单任务跑腿” 的代码&#xff0…

高速公路自动化安全监测主要内容

近年来&#xff0c;随着社会经济的快速发展&#xff0c;高速公路的通车里程不断增加&#xff0c;交通流量日益增大。与此同时&#xff0c;高速公路交通事故数量也呈现出一定的增长趋势。这些事故不仅造成了大量的人员伤亡和财产损失&#xff0c;还严重影响了社会的稳定和经济的…

完美解决 Ubuntu 中自定义启动器图标重复的问题(以 MATLAB 为例)

如果你在 Ubuntu 上为 MATLAB、PyCharm、Android Studio 或其他第三方应用创建了自定义启动器&#xff0c;并把它固定到了左侧的 Dock 栏&#xff0c;你很可能遇到过这个令人抓狂的场景&#xff1a; 当你满心欢喜地点击固定的图标启动程序后&#xff0c;Dock 栏上竟然“凭空”冒…

一文读懂深度模型优化器,掌握炼丹工具

深度模型优化器是训练神经网络的核心工具&#xff0c;其目标是高效地找到损失函数的最小值。从基础的随机梯度下降&#xff08;SGD&#xff09;到结合一阶动量修正与两阶段更新的Ranger&#xff0c;优化器的发展始终围绕着加速收敛、提升稳定性、适应参数差异和增强泛化能力四大…

关于虚拟机部署的k8s集群calico组件在开机恢复快照时的问题

在恢复虚拟机开机快照的时候总会出现各种的网络问题&#xff0c;连接不到自己的443端口&#xff0c;集群状态异常等等&#xff0c;绕一圈都发现不了问题&#xff0c;其实根本就没问题。虚拟机环境再现&#xff0c;恢复快照后的k8s环境&#xff0c;nfs莫名宕掉提示此报错&#x…

从感知到决策:虚拟仿真系统与视觉算法融合下的多路RTSP视频接入技术探究

1️⃣ 背景概述 随着国防信息化和智能化进程的不断加快&#xff0c;虚拟仿真系统 与 智能视觉算法平台 正逐步成为现代化装备研发、测试验证与战术训练的重要技术支撑。相比传统的静态建模或离线推演&#xff0c;新一代作战仿真与智能系统更强调 实时性、感知能力与动态交互&a…

Android app如果不适配Android 15会怎么样

深度思考完成 用时49秒 首先&#xff0c;用户的问题是&#xff1a;“Android app如果不适配Android 15会怎么样&#xff1f;”我需要基于搜索结果来回答。 让我回顾搜索结果&#xff1a; ‌1&#xff1a;标题是“Android 15应用适配指南”&#xff0c;内容强调了不适配Androi…

Vue-21-利用Vue3的axios+Python的flask实现前后端交互功能

文章目录 1 任务需求 2 前端 2.1 模板template 2.2 JS代码script 2.3 Calculate.vue(子组件) 2.4 App.vue(根组件) 3 后端 3.1 导入模块 3.2 创建应用实例 3.3 配置CORS 3.4 定义路由 3.5 处理请求 3.6 main.py 4 附录 4.1 CORS 4.1.1 全局启用CORS 4.1.2 限制允许的域名(更安…

动态规划之最长回文子串

题目&#xff1a;最长回文子串 给你一个字符串 s&#xff0c;找到 s 中最长的 回文 子串。 示例 1&#xff1a; 输入&#xff1a;s “babad” 输出&#xff1a;“bab” 解释&#xff1a;“aba” 同样是符合题意的答案。 示例 2&#xff1a; 输入&#xff1a;s “cbbd” 输…

Linux 编程中的错误处理机制详解 —— `errno` 全解析

文章目录Linux 编程中的错误处理机制详解 —— errno 全解析一、什么是 errno&#xff1f;❓为什么需要 errno&#xff1f;✅ 它在哪里定义&#xff1f;二、errno 的设置与读取规则⚠️ errno 不是总是有效&#xff01;❗使用 errno 的正确步骤&#xff1a;三、与 errno 配套使…

力扣-最长递增子序列

简单记录学习~给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。示例…

公司内部网址怎么在外网打开?如何让外网访问内网的网站呢?

很多公司内部本地会部署有中小型的服务器&#xff0c;可以很好的方便用于一些办公业务系统&#xff0c;或测试开发需要。在数字化办公和生活场景中&#xff0c;除了公司内部局域网内访问公司系统外&#xff0c;经常会遇到需要让外网访问内网网站的情况。比如企业员工远程办公时…

有趣的css - 多选立体标签按钮

&#x1f36d; 大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是一个交互较完整的多选立体标签按钮。 最新文章通过公众号「设计师工作日常」发布。 目录整体效果核心代码html 代码css 部分代码完整代码如下html 页面css 样式页面渲…

C++中byte*和char*的区别

在C中&#xff0c;byte*&#xff08;通常指 std::byte*&#xff09;和 char* 都是指针类型&#xff0c;但它们在语义和用途上有重要区别&#xff1a;1. 类型定义char* char 是C内置的基本类型&#xff0c;表示字符&#xff08;通常是1字节&#xff09;。 char* 常用于&#xff…

【node】npm包本地开发与调试

npm link 进入本地的 babel-plugin-function-try-catch 这个 npm 包的根目录执行&#xff1a; npm link上面的命令可以将当前的这个包安装在全局&#xff08;mac 中的路径是 /usr/local/bin&#xff09;&#xff0c;也就是 npm i -g 安装包的目录。 执行后结果如图&#xff…

突破量子仿真瓶颈:微算法科技MLGO量子算法的算术化与核操作迭代模型

近年来&#xff0c;量子计算机的迅速发展和潜在的强大计算能力吸引了全球科研机构和企业的广泛关注。量子计算机利用量子力学的特性来处理复杂的计算任务&#xff0c;具有在某些方面远超经典计算机的潜力。然而&#xff0c;真正实用的量子计算机尚未大规模普及&#xff0c;因此…

python中读取 Excel 表格数据

在pandas中读取 Excel 表格后&#xff0c;有多种方式可以按列、按行提取数据&#xff0c;下面我将详细介绍常见的方法。 0.声明 在本文中我使用的excel表内容如下&#xff1a;1. 读取 Excel 文件 首先&#xff0c;我们需要使用 pandas 的 read_excel 函数读取 Excel 文件&#…

算法训练营day28 贪心算法②122.买卖股票的最佳时机II、55. 跳跃游戏、 45.跳跃游戏II 、1005.K次取反后最大化的数组和

贪心算法第二篇博客&#xff01;感觉这篇博客中的算法都很巧妙&#xff0c;需要动动脑筋 122.买卖股票的最佳时机II &#xff08;这道题可以遍历数组&#xff0c;如果不能遍历的话&#xff0c;就不能做了&#xff0c;需要注意的是&#xff1a; 只有一只股票&#xff01;当前只…

NumPy核心操作全攻略

NumPy&#xff08;Numerical Python&#xff09;是 Python 生态中用于科学计算的核心库&#xff0c;提供高性能的多维数组对象&#xff08;ndarray&#xff09;及相关的数学运算工具。其核心功能围绕数组操作、线性代数、随机数生成等&#xff0c;是数据科学、机器学习等领域的…