Vue3学习:汇率计算器案例中event.target与event.currentTarget比较

今天从一本vue.js书中学习了《汇率计算器》的案例,这个案例的效果如下:
在这里插入图片描述
案例可以查询人民币、日元、港元、美元、欧元之间的汇率关系,代码中定义了一个汇率表rate,包含了每种货币对其他5种货币的汇率。其中还有一个功能是点击下方四种货币的任意一种货币,可以和最上面的一种货币实现互换。例如点击了欧元,欧元会到最上面,和人民币位置互换。
在这里插入图片描述
这是代码的html部分,下面4种货币使用v-for循环生成列表项<li>。

<div id="app"><h2 class="title">汇率计算器</h2> <ul><li><span>{{from.currency}}</span><input v-model="from.amount"></input></li><li v-for="item in toList":data-currency="item.currency"@click="changeCur"><span>{{item.currency}}</span><span>{{item.amount}}</span></li> </ul> <p class="intro">鼠标点击可以切换货币种类</p></div>

两种货币位置互换的功能,是在methods中定义了一个 changeCur(event) 方法来实现的,如下:

      methods: {changeCur(event){const c = event.currentTarget.dataset.currency;  //获取点击的项const f = this.from.currency;     //获取from项this.from.currency = c;          //点击项赋值给fromthis.toList.find(arritem => arritem.currency === c).currency = f;  //from项赋值给点击项},exchange(from, amount, to){return (amount * rate[from][to]).toFixed(2)},},

给我造成困扰的是event.currentTarget,我以前在javascript中学习过e.target和this的区别,e.target指触发事件的元素,this指绑定事件的元素,那这里出现的currentTarget又是怎么回事?
资料上说,target指的是触发事件的元素,currentTarget是指监听事件的元素。为了理解这句话的含义,我还写了一段代码来验证。设置了内外两个div,为了便于区分,给内外两个div加了不同的背景色。
在这里插入图片描述
测试案例完整代码如下。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>target与currentTarget</title><style>#outer {width: 200px;height: 200px;background-color: #339f63;}#inner {width: 120px;height: 120px;background-color: #23c6d9;}</style>
</head>
<body><div id="outer"><div id="inner"></div></div>
</body>
<script>var a = document.getElementById('outer')var b = document.getElementById('inner')function handler(e) {console.log(e.target);  //触发事件的元素console.log(e.currentTarget);  //监听事件的元素}a.addEventListener('click', handler);
</script>
</html>

点击内部蓝色区域,e.target和e.currentTarget分别输出如下。
console.log(e.target)输出

<div id="inner"></div>

console.log(e.currentTarget)输出

<div id="outer"><div id="inner"></div>
</div>

很明显,这个例子中监听是加在#outer上,而点击的是#inner,由此也直观地看到了e.target和e.currentTarget两者的区别,验证了e.currentTarget是监听事件的元素,e.target是触发事件的元素。
只是,这个汇率计算器困扰我的地方是,根据我最初的理解,在这个例子中,event.target指的是<li>元素,event.currentTarget也是<li>元素,两者应该是一致的,所以我把event.currentTarget换成了event.target。结果出乎意料,点击下方某种货币的时候,有时候正常,能够互换,有时候不正常,报错。我不明白造成这种现象的原因是什么,理论上说,要么对,要么不对,结果一会儿对,一会儿不对,这是什么状况?被这个问题困扰挺长时间。
后来仔细研究了一下<li>的结构,总算真相大白。

   <li v-for="item in toList":data-currency="item.currency"@click="changeCur"><span>{{item.currency}}</span><span>{{item.amount}}</span></li> 

<li>标记中有两个<span>标记,类似测试案例中的两个inner,我改成event.target后,在点击的时候,比较具有随意性,有时点击在<li>的空白处,有时点击在文字上,导致event.target有时候是<li>,有时候是<span>,所以就有时候正常,有时候不正常,总算想明白原因了。
总之,一番折腾后,发现这段代码中,必须使用event.currentTarget。
下面是实现汇率计算器的完整代码。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>汇率计算器</title><script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<!-- 人民币:CNY  港元:HKD  美元:USD  欧元:EUR 日元:JPY--><style>h2.title {text-align: center;font-size:18px;margin: 30px 0 10px 0;}p.intro {text-align: center;font-size:14px;}ul {margin:0 auto;width: 200px;list-style-type: none;border:2px solid #999;border-radius: 10px;padding: 0;font-size: 16px;font-weight: bold;font-family: 'Courier New', Courier, monospace;}li {padding:10px;}li:first-child {display: flex;border-bottom: 2px solid #999;}li:not(:first-child):hover {background-color: #ddd;}span:last-child {float:right;}input {text-align: right;border: none;font-size: 16px;width:100px;margin-left:auto;font-family: 'Courier New', Courier, monospace;outline:none;border-bottom: 1px solid #000;}</style>
</head>
<body><div id="app"><h2 class="title">汇率计算器</h2> <ul><li><span>{{from.currency}}</span><input v-model="from.amount"></input></li><!--data-currency 自定义属性,绑定货币名称,便于后期交换使用  --><li v-for="item in toList":data-currency="item.currency"@click="changeCur"><span>{{item.currency}}</span><span>{{item.amount}}</span></li> </ul> <p class="intro">鼠标点击可以切换货币种类</p></div><script>//汇率表let rate={'人民币':{'人民币':1     , '日元':16.876, '港元':1.1870, '美元':0.1526, '欧元':0.1294 },'日元':{'人民币':0.0595, '日元':1     , '港元':0.0702, '美元':0.0090, '欧元':0.0077 },'港元':{'人民币':0.8463, '日元':14.226, '港元':1     , '美元':0.1286, '欧元':0.10952},'美元':{'人民币':6.5813, '日元':110.62, '港元':7.7759, '美元':1     , '欧元':0.85164},'欧元':{'人民币':7.7278, '日元':129.89, '港元':9.1304, '美元':1.1742, '欧元':1      },}const app = Vue.createApp ({data() {return {from: {currency:'人民币', amount:100},toList:[{currency:'日元', amount:0}, {currency:'港元', amount:0}, {currency:'美元', amount:0}, {currency:'欧元', amount:0}]}},methods: {changeCur(event){const c = event.currentTarget.dataset.currency;  //获取点击的项的货币名称console.log(event.currentTarget);console.log(event.target);const f = this.from.currency;     //获取from项this.from.currency = c;          //点击项赋值给fromthis.toList.find(arritem => arritem.currency === c).currency = f;  //from项赋值给点击项},exchange(from, amount, to){return (amount * rate[from][to]).toFixed(2)},},//计算兑换后的金额,例如 美元amount=exchange(人民币,1000,美元)watch:{  //监听fromfrom: {handler(value){this.toList.forEach(item => {item.amount = this.exchange(this.from.currency, this.from.amount, item.currency)});  },deep:true,      //监听from对象里的currency、amount,deep需设置为trueimmediate:true  //页面一打开的时候,就执行一次}}}).mount('#app')</script>
</body>
</html>

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

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

相关文章

从零到一:如何使用直播美颜SDK开发视频美颜平台

今天&#xff0c;小编将为大家详细讲解如何从零开始&#xff0c;利用直播美颜SDK进行开发视频美颜平台。 一、了解直播美颜SDK 选择合适的SDK是开发视频美颜平台的第一步&#xff0c;市场上有多种SDK可供选择。选择时应考虑SDK的功能、性能、稳定性以及开发者社区的支持。 二…

STM32实现毫秒级时间同步

提起“时间同步”这个概念&#xff0c;大家可能很陌生。一时间搞不清楚是什么意思。 我理解“时间同步”可以解决多个传感器采集数据不同时的问题&#xff0c;让多个传感器同时采集数据。 打个比方。两个人走路&#xff0c;都是100毫秒走一步&#xff08;频率相同是前提&…

C++中红黑树的实现

目录 1.红黑树的概念 1.1红黑树的规则 ​1.2红黑树如何确保最长路径不超过最短路径的2倍 1.3红黑树的效率 2.红黑树的实现 2.1红黑树的结构 2.2红黑树的插入 2.2.1红黑树插入一个值的大概过程 2.2.2情况1&#xff1a;叔叔节点存在且为红 -- 变色 2.2.3情况2&#x…

若依部署上线遇到的问题

一、若依部署上线的用户头像模块不能回显&#xff1a; 首先是后端修改部署上线后若依存储图片的本地地址 其次将上线前端配置文件中的图片相关配置给删除 二、若依部署上线后验证码不显示问题 在确保前后端请求打通后还有这个问题就是磁盘缓存问题 三、若依部署上线遇到404页…

生成式 AI 与向量搜索如何扩大零售运营:巨大潜力尚待挖掘

在竞争日益激烈的零售领域&#xff0c;行业领导者始终在探索革新客户体验和优化运营的新途径&#xff0c;而生成式 AI 和向量搜索在这方面将大有可为。从个性化营销到高效库存管理&#xff0c;二者在零售领域的诸多应用场景中都展现出变革性潜力&#xff0c;已成为保持行业领先…

【前端】css样式

文章目录 1.常用样式记录 1.常用样式记录 支持文字换行 white-space:pre-wrap;

WPF+Mvvm案例实战(五)- 自定义雷达图实现

文章目录 1、项目准备1、创建文件2、用户控件库 2、功能实现1、用户控件库1、控件样式实现2、数据模型实现 2、应用程序代码实现1.UI层代码实现2、数据后台代码实现3、主界面菜单添加1、后台按钮方法改造&#xff1a;2、按钮添加&#xff1a;3、依赖注入 3、运行效果4、源代码获…

102. UE5 GAS RPG 实现范围技能奥术伤害

在上一篇文章里&#xff0c;我们在技能蓝图里实现了通过技能实现技能指示&#xff0c;再次触发按键后&#xff0c;将通过定时器触发技能效果表现&#xff0c;最多支持11个奥术个体效果的播放。 在这一篇里&#xff0c;我们将实现技能播放时&#xff0c;对目标敌人应用技能伤害。…

C++11新特性相关内容详细梳理

0. 引言 C11简介&#xff1a; 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)&#xff0c;使得C03这个名字已经取代了C98称为C11之前的最新C标准名称。不过由于C03(TC1)主要是对C98标准中的漏洞进行修复&#xff0c;语言的核心部分则没有改动&#xff0c;因此人们习惯性…

C#实现简单的文件夹对比程序

python版本的文件夹对比程序虽然简单&#xff0c;但可视化效果一般&#xff0c;不太好看。使用C#的Winform项目实现可视化对比文件夹内容&#xff0c;主要功能包括&#xff1a;   1&#xff09;采用Directory.GetDirectories获取子文件夹集合&#xff0c;Directory.GetFiles获…

C语言[求x的y次方]

C语言——求x的y次方 这段 C 代码的目的是从用户输入获取两个整数 x 和 y &#xff0c;然后计算 x 的 y 次幂&#xff08;不过这里有个小错误&#xff0c;实际计算的是 x 的 (y - 1) 次幂&#xff0c;后面会详细说&#xff09;&#xff0c;最后输出结果。 代码如下: #include…

8 个用于创建电商组件的 CSS 和 JS 代码片段

文章目录 前言正文1.自定义办公桌配置工具2.商品展示卡片3.Vue.js 支持的便捷购物体验4.简化的多步结账流程5.移动端优化的商品页面6.动态购物车效果7.React 支持的购物车页面8.尺码指南 总结 前言 优秀的电商网站&#xff0c;必须操作简便、注重细节&#xff0c;才能让用户留…

飞书文档解除复制限制

解除飞书文档没有编辑器权限限制复制功能方法 方法一&#xff1a;使用插件 方法二&#xff1a; 通过调试工具删除所有的copy事件 使用插件 缺点&#xff1a; 只有markdown格式&#xff0c;如果需要其他格式需要再通过Typora等markdown编辑器转pdf,word等格式 安装插件 Cloud Do…

OpenTelemetry 实际应用

介绍 OpenTelemetry“动手”指南适用于想要开始使用 OpenTelemetry 的人。 如果您是 OpenTelemetry 的新手&#xff0c;那么我建议您从OpenTelemetry 启动和运行帖子开始&#xff0c;我在其中详细介绍了 OpenTelemetry。 OpenTelemetry开始改变可观察性格局&#xff0c;它提供…

AAPL: Adding Attributes to Prompt Learning for Vision-Language Models

文章汇总 当前的问题 1.元标记未能捕获分类的关键语义特征 如下图(a)所示&#xff0c; π \pi π在类聚类方面没有显示出很大的差异&#xff0c;这表明元标记 π \pi π未能捕获分类的关键语义特征。我们进行简单的数据增强后&#xff0c;如图(b)所示&#xff0c;效果也是如…

RestHighLevelClient操作es查询文档

目录 利用RestHighLevelClient客户端操作es查询文档 查询match_all dsl语句&#xff1a; ​编辑 java代码 小结 match字段全文检索查询 dsl语句 java代码 multi_match多字段全文检索查询 dsl语句 java代码 term精确查询 dsl语句 java代码 range范围查询 dsl语句 j…

鸿蒙是必经之路

少了大嘴的发布会&#xff0c;老实讲有点让人昏昏入睡。关于技术本身的东西&#xff0c;放在后面。 我想想来加把油~ 鸿蒙发布后褒贬不一&#xff0c;其中很多人不太看好鸿蒙&#xff0c;一方面是开源性、一方面是南向北向的利益问题。 不说技术的领先点&#xff0c;我只扯扯…

破解API加密逆向接口分析,看这篇就够了

破解API加密逆向接口分析&#xff0c;看这篇就够了 每日一练&#xff1a;API接口数据逆向&#xff0c;看完这篇&#xff0c;就能学会找到逆向的入口函数、调试js代码、分析js代码、还原加解密算法&#xff01;为了能及时获取后续的爬虫及逆向的技术分享文章&#xff0c;请先关注…

qt EventFilter用途详解

一、概述 EventFilter是QObject类的一个事件过滤器&#xff0c;当使用installEventFilter方法为某个对象安装事件过滤器时&#xff0c;该对象的eventFilter函数就会被调用。通过重写eventFilter方法&#xff0c;开发者可以在事件处理过程中进行拦截和处理&#xff0c;实现对事…

代码随想录算法训练营第46期

class Solution { public: // 决定dp[i]的因素就是第i房间偷还是不偷。 // 偷第i房间&#xff0c;那么dp[i] dp[i - 2] nums[i] 即&#xff1a;第i-1房一定是不考虑的&#xff0c;找出 下标i-2&#xff08;包括i-2&#xff09;以内的房屋&#xff0c;最多可以偷窃的金额为dp[…