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

news2024/10/27 13:12:12

今天从一本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;          //点击项赋值给from
          this.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;          //点击项赋值给from
          this.toList.find(arritem => arritem.currency === c).currency = f;  //from项赋值给点击项
        },
        exchange(from, amount, to){
          return (amount * rate[from][to]).toFixed(2)
        },
      },
      //计算兑换后的金额,例如 美元amount=exchange(人民币,1000,美元)
      watch:{  //监听from
        from: {
          handler(value){
            this.toList.forEach(item => {
              item.amount = this.exchange(this.from.currency, 
                this.from.amount, item.currency)});  
          },
          deep:true,      //监听from对象里的currency、amount,deep需设置为true
          immediate:true  //页面一打开的时候,就执行一次
        }
      }
    }).mount('#app')
  </script>
</body>
</html>

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

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

相关文章

WPF的触发器(Trigger)

WPF&#xff08;Windows Presentation Foundation&#xff09;是微软.NET框架的一部分&#xff0c;用于构建Windows客户端应用程序。在WPF中&#xff0c;触发器&#xff08;Triggers&#xff09;是一种强大的功能&#xff0c;允许开发者根据控件的状态或属性值来动态改变控件的…

Zabbix 监控自动化

一、网络自动发现 部署环境 zabbix server ZBX 192.168.27.152 CentOS7.9 zabbix server 6.4.8 zabbix agent agent01 192.168.27.154 CentOS7.9 zabbix agent 6.4.8 zabbix agent agent02 192.168.27.158 CentOS7.9 zabbix agent 6.4.8 1.搭建LNMP环境 2.安装配…

Http 状态码 301 Permanent Rediret 302 Temporary Redirect

HTTP状态码301和302是什么&#xff1f; 1、HTTP状态码301 HTTP状态码301表示永久性转移&#xff08;Permanent Redirect&#xff09;&#xff0c;这意味着请求的资源已经被分配了一个新的URI&#xff0c;以后的引用应该使用资源现在所指的URI。 HTTP 301状态码表示请求的资源…

力扣刷题(sql)--零散知识点(1)

通过一段时间的刷题&#xff0c;感觉自己的sql能力逐渐上去&#xff0c;所以不会像前三道题一样讲那么详细了&#xff0c;这里主要会讲到一些特殊的知识点和方法。另外&#xff0c;我的建议是做完一个题有好的想法赶紧记录下来&#xff0c;不要想着最后汇总&#xff0c;不然会懒…

STATCOM静止同步补偿器原理及MATLAB仿真模型

STATCOM原理简述 整个STATCOM 装置相当于一个电压大小可以控制的电压源。当控制 STATCOM 装置产生的电压小于系统电压即UI<US 时&#xff0c;STATCOM 装置向系统输出的无功功率Q<0&#xff0c;此时 STATCOM 装置相当于电感&#xff1b;当控制 STATCOM 装置产生的电压大于…

编写一个简单的Iinput_dev框架

往期内容 本专栏往期内容&#xff1a; input子系统的框架和重要数据结构详解-CSDN博客input device和input handler的注册以及匹配过程解析-CSDN博客input device和input handler的注册以及匹配过程解析-CSDN博客 I2C子系统专栏&#xff1a; 专栏地址&#xff1a;IIC子系统_憧憬…

理工科考研想考计算机,湖南大学、重大、哈工大威海、山东大学,该如何选择?

C哥专业提供——计软考研院校选择分析专业课备考指南规划 计算机对理工科同学来说&#xff0c;还是性价比很高的&#xff0c;具有很大的优势&#xff01; 一、就业前景广阔 高需求行业 在当今数字化时代&#xff0c;计算机技术几乎渗透到了各个领域&#xff0c;无论是互联网…

在MacOS玩RPG游戏 - RPGViewerPlus

背景知识 由于我一直使用Mac电脑&#xff0c;所以一直对Mac如何玩RPGMV/RPGMZ游戏的方式有进一步的想法。 网上能给出的方案都是自行启动一个HTTP服务进行&#xff0c;进行服务加载。这个方法有效&#xff0c;但兼容性较差。涉及到自定义功能模块的游戏&#xff0c;都会有报错…

十分钟Linux中的epoll机制

epoll机制 epoll是Linux内核提供的一种高效I/O事件通知机制&#xff0c;用于处理大量文件描述符的I/O操作。它适合高并发场景&#xff0c;如网络服务器、实时数据处理等&#xff0c;是select和poll的高效替代方案。 1. epoll的工作原理 epoll通过内核中的事件通知接口和文件…

FlinkSQL之temporary join开发

在实时开发中&#xff0c;双流join获取目标对应时刻的属性时&#xff0c;经常使用temporary join。笔者在流量升级的实时迭代中&#xff0c;需要让流量日志精准的匹配上浏览时间里对应的商品属性&#xff0c;使用temporary join开发过程中踩坑不少&#xff0c;将一些经验沉淀在…

Flutter鸿蒙next 中如何实现 WebView【跳、显、适、反】等一些基础问题

✅近期推荐&#xff1a;求职神器 https://bbs.csdn.net/topics/619384540 &#x1f525;欢迎大家订阅系列专栏&#xff1a;flutter_鸿蒙next &#x1f4ac;淼学派语录&#xff1a;只有不断的否认自己和肯定自己&#xff0c;才能走出弯曲不平的泥泞路&#xff0c;因为平坦的大路…

使用C#学习Office文件的处理(pptx docx xlsx)

Office文件 是指PPT 、word、Excel 这些常用工具生成的文件 &#xff0c;例如 pptx docx xlsx。 这些文件的读取和生成有很多很多库 例如 NOPI 、DevExpress、C1、Aspose、Teleric 等等&#xff0c;各有各的优缺点。俺今天不讲这个&#xff0c;俺只是讲讲如何了解Office文件的…

css实现外层不换行,内层换行

css实现上图效果&#xff0c;内容A和B整体不换行&#xff0c;B内容中换行 <div className"description"> <div className"label">{formatMessage({id: description})}</Col> <divclassName"value"> &l…

Pr 视频效果:波形变形

视频效果/扭曲/波形变形 Distort/Wave Warp 波形变形 Wave Warp效果用于在剪辑上创建类似波浪的动态变形效果。 此效果会自动动画化&#xff0c;波形以恒定速度移动。要改变速度或停止波动&#xff0c;需要设置关键帧。 ◆ ◆ ◆ 效果选项说明 通过调整波形的类型、高度、宽度…

一分钟看懂死锁的概念

&#x1f449; 请点赞支持这款 全新设计的脚手架 &#xff0c;让 Java 再次伟大&#xff01; 什么是死锁 当线程 A 持有独占锁 a&#xff0c;并尝试去获取独占锁 b 的同时&#xff0c;线程 B 持有独占锁 b &#xff0c;并尝试获取独占锁 a 的情况下&#xff0c;就会发生 AB 两…

挂耳式耳机品牌排行榜前十名有哪些?平价开放式耳机品牌推荐!

可能我们经常能够看到不少小伙伴佩戴普通蓝牙耳机跑步健身&#xff0c;确实让人羡慕&#xff0c;但我始终觉得入耳式耳机并不适合长时间的运动佩戴。就以我个人为例&#xff0c;由于耳孔较大&#xff0c;普通入耳式耳机在运动中很难稳固地佩戴&#xff0c;经常发生耳机掉落甚至…

SMA-BP时序预测 | Matlab实现SMA-BP黏菌算法优化BP神经网络时间序列预测

SMA-BP时序预测 | Matlab实现SMA-BP黏菌算法优化BP神经网络时间序列预测 目录 SMA-BP时序预测 | Matlab实现SMA-BP黏菌算法优化BP神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现SMA-BP黏菌算法优化BP神经网络时间序列预测&#xff08;完…

[论文笔记]ColPali: Efficient Document Retrieval with Vision Language Models

引言 今天带来一篇多模态RAG的论文笔记&#xff1a;ColPali: Efficient Document Retrieval with Vision Language Models。 引入了一种利用视觉语言模型文档理解能力的检索模型架构ColPali&#xff0c;从文档页面图像上生成高质量的上下文嵌入&#xff0c;结合延迟交互匹配机…

算法刷题基础知识总结

文章目录 处理输入输出常用数据结构数学知识数论基础质数和合数因数/约数互为质数 阶乘排列与组合 排序字典序Comparator接口 处理输入输出 Scanner 类可以读取多种类型的数据&#xff0c;包括&#xff1a; nextInt()&#xff1a;读取整数。nextDouble()&#xff1a;读取双精…

vitepress一键push和发布到github部署网站脚本

文章目录 前言一、viteress基本结构二、脚本1、push2、dev 总结 前言 没啥可说的 脚本是bat文件&#xff0c;直接双击运行 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、viteress基本结构 创建完你的文档&#xff0c;目录如下 ---bin ---docs …