Vue计算属性与监听器

news2024/11/26 0:00:09

文章目录

  • 计算属性配置项 computed
    • HTML 结构
    • Vue 实例
    • 数据
    • 方法
    • 计算属性
    • 绑定数据和方法
    • 完整代码
  • 监听器配置项 watch
    • 简单类型写法
    • 深度监听写法


计算属性配置项 computed

使用 Vue 实现一个商品价格计算器,设置一个初始单价,初始数量为 1,用户可以通过加减按钮修改数量,并实时计算出总价。

下面将一步步详细解释上述代码的实现过程

HTML 结构

首先,我们需要在 HTML 文件中添加一个 div 元素作为 Vue 应用的根元素,并给其一个 id 值作为挂载点:

<div id="app">
  <!-- 在这里添加商品价格计算器的 HTML 结构 -->
</div>

在这个 div 元素中,我们可以添加一个标题标签、三个段落标签,前两个段落标签显示单价和数量,第三个段落标签用于显示计算出来的总价,其中加减按钮用于增加或减少数量:

<h1>商品价格计算器</h1>
<p>单价:{{ price }}</p>
<p>数量: <button v-show="num>0" @click="minus">-</button>{{num}}<button @click="plus">+</button></p>
<p>总价:{{ total }}</p>

这里我们使用了 Vue 的模板语法,通过 {{ }} 将数据绑定到 HTML 中。

Vue 实例

接下来,在 JavaScript 文件中创建一个 Vue 实例,将其挂载到 HTML 页面中的 div#app 元素上:

<script src="../js/vue3.js"></script>
<script>
  let vm = Vue.createApp({
    data() {
      return {
        price: 998,
        num: 1
      }
    },
    methods: {
      minus(){
        this.num--
      },
      plus(){
        this.num++
      }
    },
    // 计算属性配置项 实际应用中 某个数据是需要使用data中其他数据计算得到
    computed:{
      // 计算属性的具体配置是函数形式
      total(){
        // 必须返回一个数据
        return this.num*this.price
      }
    }
  })
  vm.mount('#app')
</script>

在 Vue 实例的选项中,我们需要先定义一些数据和方法。

数据

首先,我们需要设置一个初始单价、初始数量和总价的值,这里我们设置单价为 998 元,数量为 1,总价为 998 元:

data() {
  return {
    price: 998,
    num: 1
  }
},

这里使用了 Vue 实例的 data 选项,用于定义数据和变量。

方法

接着,我们需要定义两个方法 plusminus,用于增加或减少商品数量,并且实时计算出总价:

methods: {
  minus(){
    this.num--
  },
  plus(){
    this.num++
  }
}

这里我们使用了 Vue 实例的 methods 选项,用于定义方法。

计算属性

使用 computed 选项定义一个计算属性 total,用于计算商品的总价,其中计算方法是将 num 值乘以 price 值:

computed:{
  // 计算属性的具体配置是函数形式
  total(){
    // 必须返回一个数据
    return this.num*this.price
  }
}

绑定数据和方法

最后,我们需要将定义好的数据和方法绑定到 HTML 页面中的模板语法中:

<p>单价:{{ price }}</p>
<p>数量: <button v-show="num>0" @click="minus">-</button>{{num}}<button @click="plus">+</button></p>
<p>总价:{{ total }}</p>

这里使用了 Vue 的模板语法,通过 {{ }} 将数据绑定到 HTML 中,通过 v-show@click 将方法绑定到按钮的点击事件上。

完整代码

综上,以下是完整的商品价格计算器代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>商品价格计算器</title>
</head>
<body>
  <div id="app">
    <h1>商品价格计算器</h1>
    <p>单价:{{ price }}</p>
    <p>数量: <button v-show="num>0" @click="minus">-</button>{{num}}<button @click="plus">+</button></p>
    <p>总价:{{ total }}</p>
    <!-- 计算属性的使用直接通过插值语法使用 -->
  </div>

  <script src="../js/vue3.js"></script>
  <script>
    let vm = Vue.createApp({
      data() {
        return {
          price: 998,
          num: 1
        }
      },
      methods: {
        minus(){
          this.num--
        },
        plus(){
          this.num++
        }
      },
      // 计算属性配置项 实际应用中 某个数据是需要使用data中其他数据计算得到
      computed:{
        // 计算属性的具体配置是函数形式
        total(){
          // 必须返回一个数据
          return this.num*this.price
        }
      }
    })
    vm.mount('#app')
  </script>
</body>
</html>

输出效果:
在这里插入图片描述


监听器配置项 watch

提示:这里可以添加本文要记录的大概内容:

监听器配置项:监听某个数据的变化
定义函数:函数名必须是监听的数据名
Vue 调用此函数时会传入两个参:新值、旧值

Vue3 的监听器可以监听 Vue 实例中某个数据的变化,当这个数据变化时,就会自动执行相应的函数,这样可以实现一些自动更新页面、数据校验等功能。

具体来说,监听器主要有以下作用:

  1. 自动更新页面:当 Vue 实例的某个数据变化时,监听器可以自动更新相关的页面内容,而不需要手动修改 DOM。

  2. 数据校验:当 Vue 实例中的某个数据变化时,可通过监听器对输入的数据进行校验,保证数据的有效性。

  3. 数据同步:当 Vue 实例中的某个数据绑定到多个组件中时,可通过监听器实现数据的同步,保证数据的一致性。

  4. 监控数据变化:当 Vue 实例中的某个数据发生变化时,通过监听器可以获取到新旧值,从而实现数据的监控和统计。

Vue3 监听器是 Vue3 中非常重要的一个特性,它可以让我们的开发变得更加高效和灵活,使得我们能够更好地处理和管理数据。

简单类型写法

【示例代码】:
让数据减到零不再往下减

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <button @click="minus">-</button>{{num}}
    </div>
</body>
<script src="../js/vue3.js"></script>
<script>
    let vm = Vue.createApp({
        data() {
            return {
                num: 1
            }
        },
        methods: {
            minus(){
                this.num--
            }
        },
    })
    vm.mount('#app')
</script>
</html>

这段代码使用了 Vue3 的 createApp 方法创建了一个 Vue 实例 vm,实现了一个简单的计数器功能,点击按钮可以将 num 值递减。具体解释如下:

  1. 首先,使用 createApp 方法创建了一个 Vue 实例 vm,这个实例包含了 data、methods 等选项。

  2. 在 data 中定义了 num 属性,初始值为 1。

  3. 在 methods 中定义了一个 minus 方法,当按钮被点击时,会将 num 的值减 1。

  4. 最后,使用 vm.mount 方法将 Vue 实例挂载到页面上的 #app 元素上,使其生效。

但是现在可以减到负数

接下来加上监听器,用这种方式控制num的数量,到零就不在让他往下减

        // 监听器配置项:监听某个数据的变化
        watch: {
            // 定义函数 函数名必须是监听的数据名
            // Vue 调用此函数时会传入两个参 新值 旧值
            num(a,b){
                this.num = a<0?0:a
                // a<0吗?如果小于0正常赋值
            }
        }

深度监听写法

如果监听的事件在对象中,那么监听器的写法必须是深度监听写法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <button @click="minus">-</button>{{goods.num}}
    </div>
</body>
<script src="../js/vue3.js"></script>
<script>
    let vm = Vue.createApp({
        data() {
            return {
                goods: {
                    num: 1
                }
            }
        },
        methods: {
            minus(){
                this.goods.num--
            }
        },
        // 监听器配置项:监听某个数据的变化
        watch: {
            // 如果监听的事件在对象中,那么监听器的写法必须是深度监听写法
            goods:{
                deep:true,
                handler(a,b){
                    this.goods.num = a.num<0?0:a.num
                }
            }
        }
    })
    vm.mount('#app')
</script>
</html>

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

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

相关文章

开源外卖点餐系统源码:提升餐饮行业数字化转型

随着数字化时代的到来&#xff0c;餐饮行业正积极寻求数字化转型的方式来适应市场需求。开源外卖点餐系统源码成为推动餐饮行业数字化转型的有力工具。本文将介绍一个开源外卖点餐系统的源码&#xff0c;并解析其中的关键代码&#xff0c;展示如何利用开源源码来提升餐饮行业的…

漏洞攻击 --- TCP -- 半开攻击、RST攻击

TCP半开攻击&#xff08;半连接攻击&#xff09; --- syn攻击 &#xff08;1&#xff09;定义&#xff1a; sys 攻击数据是DOS攻击的一种&#xff0c;利用TCP协议缺陷&#xff0c;发送大量的半连接请求&#xff0c;耗费CPU和内存资源&#xff0c;发生在TCP三次握手中。 A向B…

2023年为何最卷的IT行业仍是很多人的首选?

最近这段时间&#xff0c;“IT行业崩盘了”、“前端已死&#xff0c;后端已亡”这些言论在网络中甚嚣尘上&#xff0c;引起了激烈的讨论。 对此&#xff0c;小编只想说&#xff1a;别再看了&#xff01;这不妥妥的传播焦虑吗&#xff1f;他们怎么只告诉你IT行业完了&#xff…

前端预览pdf文件

在前端开发中&#xff0c;很多时候我们需要进行pdf文件的预览操作&#xff0c;下面给出几种常见的预览pdf文件的方法&#xff1a; 一&#xff1a;直接浏览器打开 如果项目对pdf的预览功能要求不高&#xff0c;只是要求能够看的话&#xff0c;可以直接在浏览器上打开pdf文件的…

浅谈 java 虚拟机 JVM

前言 小亭子正在努力的学习编程&#xff0c;接下来将开启JavaEE的学习~~ 分享的文章都是学习的笔记和感悟&#xff0c;如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话&#xff0c;烦请点赞关注支持一波, 感激不尽~~ 目录 前言 JVM中的内存划分 JVM的类加载机制…

今天我们要向您介绍的是一款来自厂家的劲道半干面 - 味尚拉面

尊敬的顾客您好&#xff0c;感谢您选择我们的电商平台。今天我们要向您介绍的是一款来自厂家的劲道半干面 - 味尚拉面。 味尚拉面是一款经典的面食品牌&#xff0c;以选用高品质面粉和精选优质食材为特点&#xff0c;采用独特工艺制作而成。其中&#xff0c;味尚拉面的半干面更…

ChatGPT 最佳实践指南之:给 GPT 足够的时间“思考”

Give GPTs time to "think" 给予 GPT 足够的时间“思考” If asked to multiply 17 by 28, you might not know it instantly, but can still work it out with time. Similarly, GPTs make more reasoning errors when trying to answer right away, rather than ta…

Modbus TCP/BACnet IP/MQTT物联网网关IOT-810介绍及其典型应用

伴随着计算机技术以及互联网的发展&#xff0c;物联网这个概念已经逐渐进入我们的日常生活&#xff0c;例如智能泊车&#xff0c;智能家居&#xff0c;智能照明&#xff0c;智能楼宇等。智能楼宇是将传统的楼宇自控系统与物联网技术相融合&#xff0c;把系统中常见的传感器、设…

克服 ClickHouse 运维难题:ByteHouse 水平扩容功能上线

前言 对于分析型数据库产品&#xff0c;通过增加服务节点实现集群水平扩容&#xff0c;并提升集群性能和容量&#xff0c;是运维的必要手段。 但是对于熟悉 ClickHouse 的工程师而言&#xff0c;听到“扩容”二字一定会头疼不已。开源 ClickHouse 的 MPP 架构导致扩容成本高&…

【前缀和优化DP】ABC 222D

虽然很简单&#xff0c;但是统一一下板子&#xff0c;以防写错 D - Between Two Arrays (atcoder.jp) 题意&#xff1a; 思路&#xff1a; 直接DP即可 Code&#xff1a; #include <bits/stdc.h>#define int long longusing namespace std;const int mxn3e310; const…

ASP.NET Website 项目 .NET Framework 4.0 ~ .NET Framework 4.8支持c#哪些版本(Website)

本文讲的是Website网站项目&#xff0c;由于维护老项目Website .net framework4.0&#xff0c;遇到c#6.0语法不支持。便做了点记录 ASP.NET Website 项目 .NET Framework 4.0、 .NET Framework 4.5、 .NET Framework 4.6、 .NET Framework 4.8都支持c#哪些版本&#xff1f; 下面…

使用一行css实现黑白色主题皮肤的切换

很多网站都有切换主题的效果 比如如下所示 示例代码 <template><div class"css-switch-theme"><el-switchchange"hanldeSwitchTheme"v-model"themValue"active-text"暗黑"inactive-text"白色"active-color&q…

文件传输越来越频繁,如何选择高速文件传输解决方案

随着云计算、大数据等技术的发展和人们对文件传输速度的要求不断提高&#xff0c;高速文件传输成为个人和企业之间必不可少的需求。在这个背景下&#xff0c;如何实现安全、稳定、高效的文件传输就成为了一个热门话题。本文将从以下几个方面&#xff0c;详细介绍 高速文件传输解…

SpringBoot 集成 Mybatis

SpringBoot 集成 Mybatis 详细教程 &#xff08;只有操作&#xff0c;没有理论&#xff0c;仅供参考学习&#xff09; 一、操作部分 1. 准备数据库 1.1 数据库版本&#xff1a; C:\WINDOWS\system32>mysql -V mysql Ver 8.0.25 for Win64 on x86_64 (MySQL Community …

深入解读:多人语音聊天室源码开发搭建社交分享功能

在生活中&#xff0c;流传着这么一句谚语&#xff0c;叫“赠人玫瑰&#xff0c;手有余香”&#xff0c;这句谚语大致意思就是劝导人们&#xff0c;分享给别人好的东西&#xff0c;自己也会有好处&#xff0c;收获到快乐。分享也是我们日常生活中社交的一种方式&#xff0c;当我…

【技能实训】DMS数据挖掘项目-Day08

文章目录 任务8【任务8.1.1】对IDataAnalyse类方法返回值使用泛型集合升级【任务8.1.2】对DataFilter类成员属性使用泛型集合升级&#xff0c;类型参数是有界的&#xff08;DataBase的子类&#xff09;【任务8.2】对LogRecAnalyse类成员属性使用泛型集合升级,相关数据集合进行泛…

SaaS私有云智慧校园电子班牌系统源码

智慧校园APP源码人脸识别系统 电子班牌云平台源码 SaaS私有云部署模式 电子班牌又称智慧班牌&#xff0c;是打造智慧校园的必需品&#xff0c;它可以展示班级信息、时间天气、班容班貌、通知公告、考勤签到、课程安排、值日安排等信息&#xff0c;无纸化电子设备&#xff0c;后…

剑指Offer-学习计划(二)链表篇

剑指 Offer 06. 从尾到头打印链表https://leetcode.cn/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/ 剑指 Offer 35. 复杂链表的复制https://leetcode.cn/problems/fu-za-lian-biao-de-fu-zhi-lcof/剑指 Offer 24. 反转链表https://leetcode.cn/problems/fan-zhuan-lian…

(37)安全开关

文章目录 前言 37.1 LED的含义 37.2 配置安全开关 37.3 使用安全开关强制更新I/O板固件 前言 一个安全开关可以用来启用/禁用电机和伺服的输出。该开关控制飞行器的"安全"状态。当处于这种状态时&#xff0c;电机被阻止运行&#xff08;除了在 Planes MANUAL 模…

2023年9月山东/厦门/南宁/深圳DAMA-CDGA/CDGP认证考试报名

据DAMA中国官方网站消息&#xff0c;2023年度第三期DAMA中国CDGA和CDGP认证考试定于2023年9月23日举行。 报名通道现已开启&#xff0c;相关事宜通知如下&#xff1a; 考试科目: 数据治理工程师(CertifiedDataGovernanceAssociate,CDGA) 数据治理专家(CertifiedDataGovernanc…