Vue: 事件修饰符, 键盘事件, 鼠标事件,计算属性

目录

事件修饰符

阻止默认事件

阻止冒泡

允许触发一次

捕获模式

self

passive

键盘事件

keyup & keydown

按键别名

注意tab

注意系统按键

自定义按键

鼠标事件 

简介

鼠标焦点事件

计算属性

差值语法实现

methods实现 

computed实现

get()

set()

总结 

计算属性简写


事件修饰符

        使用v-on, 表示即将发生的事件, 例如点击事件click, 下面是一个例子:

    <div id="app"><h5 v-on:click="showInfo">点击我</h5><a href="https://www.baidu.com" v-on:click="showInfo">点我</a></div>

        v-on 可以简写为: @

    <div id="app"><h5 @click="showInfo">点击我</h5><a href="https://www.baidu.com" @click="showInfo">点我</a></div>

阻止默认事件

        点击a标签, 会执行click中的showInfo方法, 随后还会执行a中的默认跳转行为, 如果不想这类行为事件发生, 可以使用事件修饰符prevent来阻止进行:

        <a href="https://www.baidu.com" @click.prevent="showInfo">点我</a>

        当然可以在Vue实例中定义方法的时候, 传入event, 然后调用event的preventDefault方法:

    new Vue({el : '#app',data : {name : '王者荣耀'},methods : {showInfo(e) {e.preventDefault()alert('你好')}}})

阻止冒泡

        既然是点击, 那么如果一个区域里面存在两个点击事件. 例如:

<body><div id="app"><div @click="testDiv" id="out"><a href="https://www.baidu.com" @click.prevent="showInfo">点我</a></div></div><style>#out {width: 200px;height: 200px;border: solid blue 1px;}</style>
</body>
<script>new Vue({el : '#app',data : {name : '王者荣耀'},methods : {showInfo(e) {e.preventDefault()alert('你好')},testDiv() {alert('这是最外层的div')}}})
</script>

 点击a标签那么就会出现:

        首先出现:

        然后出现:  

        发现, 本来我的本意只想点击这个a标签, 但是因为层叠关系(冒泡), 就导致点击了a的同时, 也点击了div标签, 所以为了阻止这种情况, 使用event方法: event.stopPropagation() >>>

    new Vue({el : '#app',data : {name : '王者荣耀'},methods : {showInfo(e) {e.preventDefault()e.stopPropagation();alert('你好')},testDiv(e) {alert('这是最外层的div')}}})

        简写, 在事件后面添加事件修饰符stop, 例如:

            <a href="https://www.baidu.com" @click.prevent.stop="showInfo">点我</a>

允许触发一次

        使用修饰符once :

            <a href="https://www.baidu.com" @click.once="showInfo">点我</a>

事件只触发一次

捕获模式

        事件执行, 先开始捕获, 由外到内, 捕获完之后开始执行, 从内到外执行, 也就是冒泡, 现在更改为捕获状态就执行, 也就是添加.capture, 例如@click.capture = "xxx"

self

        @click.self, 只有在event.target 是本身的时候, 才会触发点击事件

passive

        事件立即执行, 无序等待前置条件: .passive

键盘事件

keyup & keydown

  • @keyup
  • @keydown

这里使用keyup作为案例:

<body><div id="app"><p>欢迎来到{{name}}</p><input type="text" placeholder="按下回车提示输入" @keyup="showInfo"></div>
</body><script>new Vue({el :'#app',data : {name : 'world'},methods : {showInfo(e) {console.log(e.target.value);}}})
</script>

按下a建., 输入一个a, 这个时候控制台还没有输入, 但是松开a键之后, 控制台输出:

再按下一个a, 松开之后, 控制台输出 两个a :

keydown的用法类似, 这里不一一列举 

相同的keyup和keydown都有事件修饰符:

  • enter,  键盘输入之后并不会触发事件, 只有在键入的值是enter(回车)的时候, 才会触发事件, 例如:
        <div id="app"><p>欢迎来到{{name}}</p><input type="text" placeholder="按下回车提示输入" @keyup.enter="showInfo"></div>new Vue({el :'#app',data : {name : 'world'},methods : {showInfo(e) {console.log(e.target.value);}}})

    输入一个a并不会触发事件showInfo, 但是在输入a后,再按一个回车, 控制台就输出了一个a :

按键别名

  • 相同的还有很多其他的键盘事件修饰符, 这些别的修饰符是我们vue中常用的按键的别名:

    • 回车 : enter

    • 删除 : delete

    • 空格 : space

    • 退出 : esc

    • 换行 : tab

    • 上 : up

    • 下 : down

    • 左 : left

    • 右 : right

vue暂时没有提供别的按键别名, 可以使用按键原始的key进行绑定

系统按键修饰符:

  • ctrl
  • alt
  • shift
  • meta (win)

        系统修饰键配合keyup使用, 按下修饰键的同时, 再按下其他键, 随后释放其他键, 事件才被触发 : 解释 >>  因为同时按下之后, keyup是属于松开才触发事件, 但是现在除了ctrl等键之外, 其他的一些按键同样被按下了, 那么他们之间就有一个释放的顺序, 所以现在只有其他键先释放, 这个keyup状态才结束, 事件执行

        配合keydown使用, 直接按下之后就可以正常触发事件

注意tab

        有下面的例子:

<body><div id="app"><p>欢迎来到{{name}}</p><input type="text" placeholder="按下回车提示输入" @keyup.tab="showInfo"></div>
</body><script>new Vue({el :'#app',data : {name : 'world'},methods : {showInfo(e) {console.log(e.target.value);}}})
</script>

        这是一个使用键盘事件, 并且使用tab修饰这个键盘事件 :

        我们输入aaa, 然后按下tab:

        发现这个玩意没有输出到控制台:

        多按几次就会发现, 他并不是没有作用, 反而像是被什么锁定了一样, 不能在input中输入, :

        多按下几次就会发现, 他会在浏览器上切换焦点

        这个焦点被切走了. 那为什么没有触发事件??

        分析: 细心的你一定会发现, 这个tab是按下立即就生效的, 但是我们定义的键盘事件是keyup, 按下tab之后, 焦点立即调走, 还没来得及松开焦点就已经从输入框中切走, 那么vm也就无法捕捉到这个键入tab的行为, 更加捕获不到tab松开.

        改进 : 所以这个时候, 我们就可以使用keydown事件

注意系统按键

        同按键别名中的说明, 如果直接使用@keyup.ctrl .....

        比如同时按下ctrl + y, 然后松开y之后, 触发事件

        还有一个需要注意的是, 你可以指定松开哪一个键执行事件:

        @keyup.ctrl.y, 这个时候, 只有同时按下ctrl + y, 然后松开y才有用, 按下ctrl + z或者是其他的除y之外的按键都是没有用的. 

自定义按键

Vue.config.keyCodes.huiche = 13;<input type="text" placeholder="按下回车提示输入" @keyup.huihce="showInfo">

鼠标事件 

简介

        除了键盘事件, 那么肯定有鼠标事件的啦, 看看下面这几个鼠标事件的例子:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script src="../js/vue.js"></script>
</head>
<body><div id="app"><div id="testDiv" @click="testClick" @dblclick="testDBClick" @mouseenter="testMouseEnter" @mouseleave="testMouseLeave" @mousedown="testMouseDown"@mouseup="testMouseUp"@mousemove="testMouseMove">{{content}}</div>  <br><hr></div>
</body>
<script>var vue = new Vue({el : '#app',data : {content: '',value : null},methods : {testClick() { // 单机this.content =  '鼠标单击';},testDBClick() { // 鼠标双击this.content = '鼠标双击';},testMouseEnter() { // 鼠标进入事件this.content = '鼠标进入';},testMouseLeave() { // 鼠标离开事件this.content = '鼠标离开';}, testMouseDown() { // 鼠标按下事件this.content = '鼠标按下';}, testMouseUp() {this.content = '鼠标弹起';}, testMouseMove(event) { // 任何事件都可以添加事件event对象this.content = event.offsetX + '---' + event.offsetY; // 只要是@的事件都可以使用event}, testFocus() {this.value ='获得焦点'}, testBlur() {this.value = '失去焦点'}}});
</script>
<style>#testDiv {width: 150px;height: 150px;border: 2px solid green;text-align: center;line-height: 100%;}
</style>
</html>

 单击

双击

离开div

 这里不一一展示

总结鼠标点击事件 :

鼠标事件所表示触发的前置条件
@click鼠标单机触发
@dblclick鼠标双击
@mouseenter鼠标进入
@mouseleave鼠标离开
@mousedown鼠标按下
@mouseup鼠标弹起
@mousemove鼠标移动

鼠标焦点事件

  • @focus : 鼠标聚焦目标以触发事件
  • @blur : 鼠标聚焦跳出目标, 触发事件

案例: 

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script src="../js/vue.js"></script>
</head>
<body><div id="app"><input type="text" @focus="testFocus" @blur="testBlur" v-model="value"></div>
</body>
<script>var vue = new Vue({el : '#app',data : {content: '',value : null},methods : { testFocus() {this.value ='获得焦点'}, testBlur() {this.value = '失去焦点'}}});
</script>
</html>

首先不进行任何操作:

点击这个输入框, 触发聚焦事件 :

鼠标点击输入框之外的内容:

单词解释: 

        blur也就是鼠标模糊不清, 也就是失去焦点. 

计算属性

差值语法实现

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script src="../js/vue.js"></script>
</head>
<body><div id="root">姓 : <input type="text" v-model="firstName"><br>名 : <input type="text" v-model="lastName"> <br>姓名 : <span>{{firstName}}{{lastName}}</span></div>
</body>
<script>new Vue({el :'#root',data : {firstName : '张',lastName : '三'}})
</script>
</html>

methods实现 

        {{}}的里面写的是差值表达式, 所以这里直接使用方法名 + ()的形式, 表示调用这个函数的返回值

<body><div id="root">姓 : <input type="text" v-model="firstName"><br>名 : <input type="text" v-model="lastName"> <br>姓名 : <span>{{fullName()}}</span></div>
</body>
<script>new Vue({el: '#root',data: {firstName: '张',lastName: '三'},methods  :{fullName() {return '博子妹妹';}}})
</script>

        这里将'博子妹妹' 修改为 this.firstName + '-' + lastName的形式, 即可联动显示, 因为是双向绑定, 修改 姓 之后, 就会修改data中的值, 然后vm捕捉到这个修改, 然后用到这个name的地方就会更新 . 以后任何修改data的数据操作之后, vm都会重新解析一次.

computed实现

get()

        不用方法, 也不使用插值语法来表示, 那么就使用vm实例中的computed字段来实现,

        computed, 本就有计算的意思:

       在computed的字段中定义fullName, 然后使用这个fullName去计算出 全名, 使用的时候, 可以像data中的数据那样去访问这个fullName, 例如: {{fullName}}, 访问这个fullName, vm会调用computed中的fullName的get()方法, 然后将其返回值最为fullName的值.

    new Vue({el: '#root',data: {firstName: '张',lastName: '三'},computed : {fullName : { // 这个fullName依然在vm身上// get() : 当有人读取fullName的时候, 就会调用get方法, 返回值就会被当做fullName的值get() {return this.firstName + this.lastName;}}}})

         但是这个get方法中不能直接 return firstName + lastName,因为他访问不到data中的数据,但是可以通过vm实例对象来访问.

<body><div id="root">姓 : <input type="text" v-model="firstName"><br>名 : <input type="text" v-model="lastName"> <br>姓名 : <span>{{fullName}}</span></div>
</body>
<script>new Vue({el: '#root',data: {firstName: '张',lastName: '三'},computed : {fullName : { // 这个fullName依然在vm身上// get() : 当有人读取fullName的时候, 就会调用get方法, 返回值就会被当做fullName的值get() {return this.firstName + this.lastName;}}}})
</script>

思考> computed中的属性的get 会被调用??

        解释: 初次读取computed中的属性的时候,对应的get方法会被调用, 由于调用之后, 其返回值被缓存, 下次读取就不会调用get方法, 其次就是所依赖的数据被修改的时候, 就上面例子而言, 如果输入框中的姓被修改的时候, get方法就会被重新调用.

        fullName虽然是个对象, 但是不能直接使用: {{fullName.get()}}. 

set()

        有get, 那么必然有set() :

computed : {fullName : { // 这个fullName依然在vm身上// get() : 当有人读取fullName的时候, 就会调用get方法, 返回值就会被当做fullName的值get() {return this.firstName + this.lastName;},set (value) {const arr = value.split('-');this.firstName = arr[0];this.lastName = arr[1];}}}

        我们讲到, 如果调用了set方法, 那么就会修改firstName和lastName属性, 那么vm就会捕获到这个修改, 从而重新更新使用到这两个属性的地方, 同时set方法也捕获到了这个修改, 然后将引用这个fullName的地方进行更新:

总结 

计算属性:
        1.定义:要用的属性不存在,要通过已有属性计算得来。

如果计算属性中存在在vm外部定义的变量, 那么确实是可以像已有的属性那样显示出来, 但是vm无法捕捉到这个外部定义的变量的变化.

        2.原理: 底层借助了objcet.defineproperty方法提供的getter和setter。
        3.get函数什么时候执行?
                (1).初次读取时会执行一次。
                (2).当依赖的数据发生改变时会被再次调用。
        4.优势:与methods实现相比,内部有缓存机制 (复用) ,效率更高,调试方便。
        5.备注:
                1.计算属性最终会出现在vm上,直接读取使用即可。
                2.如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发生变化

计算属性简写

计算属性中的每一个属性都是当做对象处理:

        对象中的每个方法使用逗号分割, 但是实际上这个set方法一般都用不到, 所以直接将这个fullName定义为一个方法 :

    const vm = new  Vue({el: '#root',data: {firstName: '张',lastName: '三'},computed : {fullName : function(){ // 这个fullName依然在vm身上return this.firstName + this.lastName;}}})

         更甚将其改为:

            fullName(){ // 这个fullName依然在vm身上return this.firstName + this.lastName;}

        注意这里简写的前置条件是, 我不会去调用set方法, 如果调用set方法:

[vue警告]:计算属性, “FulName”分配给了它,但它没有set方法. 

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

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

相关文章

PLC-IoT 网关开发札记(1):存档和分发 Android App

开篇记 PLC-IoT 网关是作者开发的产品&#xff0c;根据客户需求&#xff0c;立项开发手机 App&#xff0c;为用户提供一种方便、直观、友好的设备操控方式。网关运行的是嵌入式 Linux 操作系统&#xff0c;计划通过某一种通信协议&#xff08;例如 HTTP&#xff0c;MQTT或者 T…

KMP算法的理解+板子

对kmp算法的理解中&#xff0c;很重要的一点就是next数组。 很多人不理解next数组的含义&#xff0c;是因为它同时具有两个意思&#xff0c;而且这两个意思在不同的环境下不同。 现在给你两个字符串&#xff1a; 一个是文本串 text 一个是模板串 pattern 然后定义两个指针…

react+redux+antd-mobile 之 记账本案例

1.环境搭建 //使用CRA创建项目&#xff0c;并安装必要依赖&#xff0c;包括下列基础包 //1. Redux状态管理 - reduxjs/toolkit 、 react-redux //2. 路由 - react-router-dom //3. 时间处理 - dayjs //4. class类名处理 - classnames //5. 移动端组件库 - antd-mobile //6. 请…

偏好对齐RLHF-OpenAI·DeepMind·Anthropic对比分析

OpenAI paper: InstructGPT, Training language models to follow instructions with human feedback paper: Learning to summarize from human feedback Introducing ChatGPT 解密Prompt系列4介绍了InstructGPT指令微调的部分&#xff0c;这里只看偏好对齐的部分 样本构建…

竞赛保研 基于机器学习与大数据的糖尿病预测

文章目录 1 前言1 课题背景2 数据导入处理3 数据可视化分析4 特征选择4.1 通过相关性进行筛选4.2 多重共线性4.3 RFE&#xff08;递归特征消除法&#xff09;4.4 正则化 5 机器学习模型建立与评价5.1 评价方式的选择5.2 模型的建立与评价5.3 模型参数调优5.4 将调参过后的模型重…

12.21自动售货机,单物品,多物品

自动售货机 if朴素方法 一种思路是用寄存器cnt记录已有的最小单位货币量&#xff0c;这里就是0.5 当d1时&#xff0c;cnt1;d2时&#xff0c;cnt2;d3时&#xff0c;cnt4; timescale 1ns/1ns module seller1(input wire clk ,input wire rst ,input wire d1 ,input wire d2 …

苹果CMS超级播放器专业版无授权全开源,附带安装教程

源码介绍 超级播放器专业版v1.0.8&#xff0c;内置六大主流播放器&#xff0c;支持各种格式的视频播放&#xff0c;支持主要功能在每一个播放器内核中都相同效果。 搭建教程 1.不兼容IE浏览器 2.php版本推荐7.4 支持7.1~7.4 3.框架引入不支持同时引入多个播放器 json对接教…

mfc100u.dll文件丢失了要怎么解决?修复mfc100u.dll详细指南

mfc100u.dll文件丢失了要怎么解决?首先让我们扒一扒什么是 mfc100u.dll。这玩意儿是 Microsoft Visual Studio 2010 的一部分&#xff0c;它就像一款程序生活中不可或缺的零件&#xff0c;没了它&#xff0c;程序肯定跑不起来。想想看&#xff0c;没有一个重要的零件&#xff…

【UE5蓝图】读取本地json文件修改窗口大小

效果 插件 蓝图 1.判断文件存在 2.1文件不存在&#xff0c;生成文件 {"ResolutionX":540, "ResolutionY":960} 2.2文件存在&#xff0c;直接读取 3.设置窗口大小 遇到的坑 1.分辨率太大&#xff0c;导致效果不理想&#xff0c;建议先往小填写。 2.选对…

Java核心知识点1-java和c++区别、隐式和显示类型转换

java和c区别 java通过虚拟机实现跨平台特性&#xff0c;但c依赖于特定的平台。java没有指针&#xff0c;它的引用可以理解为安全指针&#xff0c;而c和c一样具有指针。java支持自动垃圾回收&#xff0c;而c需要手动回收。java不支持多重继承&#xff0c;只能通过实现多个接口来…

TCP/IP的五层网络模型

目录 封装&#xff08;打包快递&#xff09; 6.1应用层 6.2传输层 6.3网络层 6.4数据链路层 6.5物理层 分用&#xff08;拆快递&#xff09; 6.5物理层 6.4数据链路层 6.3网络层 6.2传输层 6.1应用层 封装&#xff08;打包快递&#xff09; 6.1应用层 此时做的数据…

程序的编译、链接

目录 前言&#xff1a; 前置知识回顾 宏 宏定义常量 宏定义语句 宏定义函数 条件编译 应用场景 编译过程概览 预编译阶段 编译阶段 汇编阶段 链接阶段 前言&#xff1a; 在ANSI C的任何一种实现中&#xff0c;存在两种不同的环境&#xff0c;第1种是翻译环境&#x…

12.30 二叉树中等题

236. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff…

yolov8实战第四天——yolov8图像分类 ResNet50图像分类(保姆式教程)

yolov8实战第一天——yolov8部署并训练自己的数据集&#xff08;保姆式教程&#xff09;_yolov8训练自己的数据集-CSDN博客在前几天&#xff0c;我们使用yolov8进行了部署&#xff0c;并在目标检测方向上进行自己数据集的训练与测试&#xff0c;今天我们训练下yolov8的图像分类…

【滑动窗口】C++算法:K 个不同整数的子数组

作者推荐 动态规划 多源路径 字典树 LeetCode2977:转换字符串的最小成本 本题涉及知识点 滑动窗口 LeetCoe992 K 个不同整数的子数组 给定一个正整数数组 nums和一个整数 k&#xff0c;返回 nums 中 「好子数组」 的数目。 如果 nums 的某个子数组中不同整数的个数恰好为 …

【AI导师】利用Coding Agent完成AIGC编程

利用Coding Agent完成AIGC编程 一、前言二、Coding Agent三、1024code四、AI导师README项目初版功能定义代码结构设计方案函数方法设计方案迭代记录 一、前言 AI产品的发展确实在过去两年年中取得了显著进展&#xff0c;尤其是在编程领域。一开始&#xff0c;ChatGPT和类似的语…

前后端分离架构的特点以及优缺点

文章目录 一、前后端不分离架构(传统单体结构)1.1 什么是前后端不分离1.2 工作原理1.3 前后端不分离的优缺点1.4 应用场景 二、前后端分离架构2.1 为什么要前后端分离2.2 什么是前后端分离2.3 工作原理2.4 前后端分离的优缺点 参考资料 一、前后端不分离架构(传统单体结构) 首…

阿里后端实习二面

阿里后端实习二面 记录面试题目&#xff0c;希望可以帮助到大家 类加载的流程&#xff1f; 类加载分为三个部分&#xff1a;加载、连接、初始化 加载 类的加载主要的职责为将.class文件的二进制字节流读入内存(JDK1.7及之前为JVM内存&#xff0c;JDK1.8及之后为本地内存)&…

EBU7140 Security and Authentication(一)常见加密算法

前言 主要根据 EBU7140 课程内容整理&#xff0c;比较偏向应试~ Block1&#xff1a;介绍课程&#xff0c;传统加密方式。 Block2&#xff1a;公钥加密的原理和应用。 Block3&#xff1a;一些特定安全协议技术&#xff08;如防火墙 Kerberos身份验证协议等&#xff09;。 B…

【教学类-43-03】20231229 N宫格数独3.0(n=1、2、3、4、6、8、9) (ChatGPT AI对话大师生成 回溯算法)

作品展示&#xff1a; 背景需求&#xff1a; 大4班20号说&#xff1a;我不会做这种&#xff08;九宫格&#xff09;&#xff0c;我做的是小格子的&#xff0c; 他把手工纸翻过来&#xff0c;在反面自己画了矩阵格子。向我展示&#xff1a;“我会做这种&#xff01;” 原来他会…