【vue3】04-vue基础语法补充及阶段案例

news/2024/5/5 15:32:59/文章来源:https://blog.csdn.net/SevgiliD/article/details/130136590

文章目录

  • vue基础语法补充
    • vue的computed
    • vue的watch侦听
  • 书籍购物车案例

vue基础语法补充

vue的computed

computed:用于声明要在组件实例上暴露的计算属性。(官方文档描述)

我们已经知道,在模板中可以直接通过插值语法显示一些data中的数据

但是在某些情况,我们可能需要对数据进行一些转化后再显示,或者需要将多个数据结合起来进行显示

  • 比如我们需要对多个data数据进行运算、三元运算符来决定结果、数据进行某种转化后显示;
  • 在模板中使用表达式,可以非常方便的实现,但是设计它们的初衷是用于简单的运算;
  • 在模板中放入太多的逻辑会模板过重难以维护;

而且因为多个地方都使用到,所以会有大量重复的代码,那么我们可以将逻辑抽离出去:

  • 比如直接逻辑抽取到一个method中,放到methods的options中;
  • 但是,这种做法有一个直观的弊端,就是所有的data使用过程都会变成了一个方法的调用,所以正确的做法应该是抽离出来后放入计算属性computed中

用法示例:

    <div id="app"><h2>{{fullName}}</h2><!-- 2.显示分数等级 --><h2>{{getScorelevel}}</h2><!-- 3.反转单词显示文本 --><h2>{{reverseMessage}}</h2></div><script>const app = Vue.createApp({data() {return {// 1.姓名firstName: "kobe",lastName: "byrant",// 2.分数及不及格score: 65,// 3.一串文本:对文本中的单词进行反转显示message: "my name is sevgilid"}},methods: {},computed: {// 计算属性对应的是一个函数(经过响应式复杂逻辑转化的都应写在computed里)// 计算属性是有缓存的fullName() {return this.firstName + "" + this.lastName},getScorelevel() {return this.score > 60 ? '及格' : '不及格'},reverseMessage() {return this.message.split("").reverse().join("")}}})app.mount('#app')</script>

vue的watch侦听

watch:用于声明在数据更改时调用的侦听回调。(官方文档描述

什么是侦听器呢?

  • 开发中我们在data返回的对象中定义了数据,这个数据通过插值语法等方式绑定到template中;
  • 当数据变化时,template会自动进行更新来显示最新的数据;
  • 但是在某些情况下,我们希望在代码逻辑中监听某个数据的变化,这个时候就需要用侦听器watch来完成了;

用法:{ [key: string]: string | Function [ Object | Array}

如下示例:

点击按钮后message就会修改,且控制台打印’‘message发生了改变’’

    <div id="app"><h2>{{message}}</h2><button @click="changeMessage">修改message</button></div><script>const app = Vue.createApp({data() {return {message: 'hello vue'}},methods: {changeMessage() {this.message = "你好啊,李二狗"}},watch: {message() {console.log("message发生了改变");}}})app.mount('#app')</script>

通过以上例子发现其实就是想监听谁在里面写谁,但这样使用的话只知道数据发生了改变,并不知道改变是什么。

  1. 其实回调函数里默认是有传过来两个参数的:分别是newvalue,oldvalue,像下面这样修改代码后就可以看到前后数据发生的改变:
    watch: {message(newValue,oldValue) {console.log("message已发生改变", newValue, oldValue);}

打印结果:

在这里插入图片描述

  1. 如果是监听的是一个对象类型,那么拿到的是代理对象,可以通过newValue.name这样去拿值
 <div id="app"><h2>{{info}}</h2><button @click="changeInfo">改变info</button></div><script>const app = Vue.createApp({data() {return {info:{name:"daa",age:15}}},methods: {changeInfo(){this.info={name:"kkk",age:25}}},watch: {info(newValue,oldValue){console.log("info数据发生了变化", newValue,oldValue);console.log(newValue.name,oldValue.name);![在这里插入图片描述](https://img-blog.csdnimg.cn/9a9764dc762549caa4d9e4905b6336ea.png)}}})app.mount('#app')</script>

控制台打印结果:

在这里插入图片描述

  • 如果想拿到原生对象:Vue.toRaw(newValue)在这里插入图片描述
  1. watch的侦听选项配置:
  • deep:true:为true时进行深度监听
  • immediate:true:为true时第一次渲染直接执行一次监听器

其实默认是不进行深度监听的,像下面的例子:

  • 如果修改的是整个info是可以监听到的
  • 但是只修改info对象中的一个属性是监听不到
 <script>const app = Vue.createApp({data() {return {info: {name:"kkk", age:25}}},methods:{changeInfo(){// 1.修改原对象,可以监听// this.info = {name:"wxx", age:52}// 2.直接修改原对象的一个属性this.info.name = "sevgilid"}},watch:{// 默认watch监听不会进行深度监听(所以只改变属性时未监听到)// info(newValue,oldValue){//     console.log("info数据发生了改变", newValue,oldValue);// }// 进行深度监听info:{handler(newValue,oldValue){console.log("info一发生改变",newValue, oldValue);},// 监听器选项://info进行深度监听:加上以下配置后即可监听到属性改变deep:true,// 第一次渲染直接执行一次监听器immediate:true}}})app.mount('#app')</script>

书籍购物车案例

一个相对综合的案例,可以对前面几篇博客知识进行练习(完整代码在文末

在这里插入图片描述

案例说明:
1.在界面上以表格的形式,显示一些书籍的数据;
2.在底部显示书籍的总价格;
3.点击+或者-可以增加或减少书籍数量(如果为1,那么不能继续-);
4.点击移除按钮,可以将书籍移除(当所有的书籍移除完毕时,显示:购物车为空);
5.点击行变色

案例步骤:
1.搭建界面内容:做出表格,调整基本样式
2.获取数据:可以从后台拿数据,这里选择自己在data中模拟数据
3.分析实现逻辑:

  • 使用v-for遍历数据配合插值语法实现界面的动态填充
  • 为按钮绑定methods中的方法,使用v-if判断为1时不能继续
  • 在computed计算属性中实现对价格及数量的逻辑抽取
  • 使用split方法移出
  • 为点击行动态绑定active样式

步骤代码详解:

遍历数据及加减:

在这里插入图片描述
在这里插入图片描述

注意事项:

  1. 遍历时外层使用template包裹
  2. v-for就要写key(自己写的时候忘记了)
  3. 因为绑定按钮的时候是动态绑定:所以点击事件的时候要传入参数,即拿到索引才能知道你点击的是哪一个按钮)
  4. 小于1不可再点击-1按钮时应:disabled={item<=1}

总价响应式:

在这里插入图片描述

注意事项:

  1. 抽取后写入computed计算属性,而非放入methods中进行方法的调用
  2. 遍历时内部不要忘记加上const

移出操作:

在这里插入图片描述
注意事项:

  1. 绑定事件时传递index参数来判断移出的是第几行
  2. slice()的使用

行变色:

  1. 通过点击获取索引index来判断点击的第几行
  2. 在data中定义currentIndex
  3. 点击事件中将获取到的index赋值给currentIndex
  4. tr动态绑定active时使用对象语法,通过判断index === currentIndex的布尔值来动态绑定

案例完整代码:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script src="../Vue3.js"></script><style>table {border-collapse: collapse;color: brown;text-align: center;}table,th,td {border: 1px solid black;}.active {background-color: aqua;}</style></head><body><div id="app"><div class="shopCurt"><table><thead><tr><th>序号</th><th>商品名字</th><th>价格</th><th>数量</th><th>商品描述</th><th>操作</th></tr></thead><tbody><template v-for="( item,index ) in infos"><tr :class="{active:index === currentIndex}" @click="rowClick(index)"><td>{{ index+1 }}</td><td>{{ item.name }}</td><td>{{ item.price }}</td><td><button @click="decrement(index)" :disabled="item.count<=1">-1</button>{{ item.count }}<button @click="increment(index)">+1</button></td><td>{{ item.dec }}</td><td><button @click="removeBook(index)">{{ item.caozuo }}</button></td></tr></template></tbody></table></div><h2>AllPrice:{{ allPrice }}</h2></div>
</body><script src="./Vue3.js"></script>
<script>const app = Vue.createApp({data() {return {currentIndex: -1,infos: [{ sort: 0, name: "华为电脑", price: 9.9, count: 1, dec: "9.9秒杀快来抢购", caozuo: "移除" },{ sort: 0, name: "iphoneX", price: 12.8, count: 1, dec: "苹果X最新出炉", caozuo: "移除" },{ sort: 0, name: "小米11Plus", price: 13.1, count: 1, dec: "速度来抢", caozuo: "移除" },{ sort: 0, name: "外星人电脑", price: 56, count: 1, dec: "真的便宜", caozuo: "移除" },{ sort: 0, name: "OPPOR11", price: 100, count: 1, dec: "好用不贵", caozuo: "移除" }]}},computed: {allPrice() {let price = 0;for (const item of this.infos) {price += item.price * item.count}return price}},methods: {// 监听加减按钮increment(index) {this.infos[index].count++},decrement(index) {this.infos[index].count--},// 监听行点击变色rowClick(index) {this.currentIndex = index;},// 移出操作removeBook(index) {this.infos.splice(index, 1)}}})app.mount('#app')
</script></html>

实现效果:

在这里插入图片描述

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

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

相关文章

智能网卡相关知识(smart nic 、DPU)

网卡作为穿行在网络与计算之间的桥梁&#xff0c;是可以解决计算瓶颈的关键硬件。 随着CPU 密度和数据中心网络带宽的进一步提升&#xff0c;用户对预期性能的需求&#xff0c;系统运行平稳性都会有更高的要求。云厂商一方面面临巨大的成本压力&#xff0c;另一方面面临巨大的…

新一代异步IO框架 io_uring | 得物技术

1.Linux IO 模型分类 相比于kernel bypass 模式需要结合具体的硬件支撑来讲&#xff0c;native IO是日常工作中接触到比较多的一种&#xff0c;其中同步IO在较长一段时间内被广泛使用&#xff0c;通常我们接触到的IO操作主要分为网络IO和存储IO。在大流量高并发的今天&#xff…

光伏电池片技术N型迭代,机器视觉检测赋能完成产量“弯道超车”

电池片是光伏发电的核心部件&#xff0c;其技术路线和工艺水平直接影响光伏组件的发电效率和使用寿命。随着硅料、硅片技术逐渐接近其升级迭代空间的瓶颈&#xff0c;电池片环节正处于技术变革期&#xff0c;是光伏产业链中迭代最快的部分。P型中PERC电池片是现阶段市场的主流产…

C/C++每日一练(20230413)

目录 1. 与浮点数A最接近的分数B/C &#x1f31f; 2. 比较版本号 &#x1f31f;&#x1f31f; 3. 无重复字符的最长子串 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每…

Multi-modal Alignment using Representation Codebook

Multi-modal Alignment using Representation Codebook 题目Multi-modal Alignment using Representation Codebook译题使用表示代码集的多模态对齐期刊/会议CVPR 摘要&#xff1a;对齐来自不同模态的信号是视觉语言表征学习&#xff08;representation learning&#xff09;的…

Vue2_02_指令

模板语法 — Vue.js (vuejs.org) 指令 (Directives) 是带有 v- 前缀的特殊 attribute 参数 一些指令能够接收一个“参数”&#xff0c;在指令名称之后以冒号表示 <a v-bind:href"url">...</a> 动态参数 可以用方括号括起来的 JavaScript 表达式作为一…

JWT与Token详解

前言&#xff1a;JWT全称“JSON Web Token”&#xff0c;是实现Token的机制。官网&#xff1a;https://jwt.io/ JWT的应用 JWT用于登录身份验证。用户登录成功后&#xff0c;后端通过JWT机制生成一个token&#xff0c;返回给客户端。客户端后续的每次请求都需要携带token&…

常用加密算法

目录 常见的加密算法可以分成三种&#xff1a; 对称加密算法 DES 3DES AES 非对称加密 RSA ECC Hash算法 MD5 SHA1 算法对比 算法选择 常见的加密算法可以分成三种&#xff1a; 对称加密算法&#xff1b;非对称加密算法&#xff1b;Hash算法&#xff1b;接下来我们…

面试手撕堆排序

堆排序代码如下&#xff08;注释见下&#xff09;&#xff1a; 首先将待排序的数组构造成一个大根堆&#xff0c;此时&#xff0c;整个数组的最大值就是堆结构的堆顶 将堆顶的数与末尾的数交换&#xff0c;此时&#xff0c;末尾的数为最大值&#xff0c;剩余待排序数组个数为n…

Linux设备驱动开发 - 块设备驱动ramdisk实例

By: fulinux E-mail: fulinuxsina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅&#xff01; 你的喜欢就是我写作的动力&#xff01; 目录理论来源源码编译测试理论来源 ramdisk驱动&#xff0c;区别在与使用最新的内核版本&#xff0c;比如linux-4.15。…

MySQL数据库:聚合函数、分组查询、约束、默认值设置、自增属性

一、聚合函数 1.聚合函数 在MySQL数据库中预定义好的一些数据统计函数。 2.count(*) 功能&#xff1a;统计结果条数。 3.sum(字段名) 功能&#xff1a;对指定字段的数据求和。 4.avg(字段名) 功能&#xff1a;对指定字段的数据求平均值。 5.max(字段名) 和 min(字段名) …

答疑——20年国赛题(JAVA解法)

题目链接&#xff1a;用户登录https://www.lanqiao.cn/problems/1025/learning/?page3&first_category_id1&sortstudents_count 题目描述 有 n 位同学同时找老师答疑。每位同学都预先估计了自己答疑的时间。 老师可以安排答疑的顺序&#xff0c;同学们要依次进入老…

sqoop数据导出、脚本使用

目录 准备表与数据 数据导出 脚本调用 准备表与数据 mysql表 CREATE TABLE user (id int(20),name varchar(20) )ENGINEINNODB DEFAULT CHARSETutf8; hive表 create table users( id bigint, name string ) row format delimited fields terminated by "\t";…

软考初级程序员--学习

1、十进制 转 二进制 十进制87 转换为 二进制为 1010111 2、二进制 转 十进制 二进制1010111 转换为 十进制 3、循环队列 计算长度通用公式&#xff1a; front&#xff1a;表示队首 rear&#xff1a;表示队尾 M&#xff1a;表示队列容量 队列长度 &#xff08;rear - fr…

Verilog | 二进制与格雷码

一、格雷码简介 格雷码是一个叫弗兰克格雷的人在 1953 年发明的&#xff0c;最初用于通信。格雷码是一种循环二进制码或者叫作反射二进制码。格雷码的特点是从一个数变为相邻的一个数时&#xff0c;只有一个数据位发生跳变&#xff0c;由于这种特点&#xff0c;就可以避免二进…

进销存管理系统能为企业带来哪些实际效益?

随着互联网的不断发展&#xff0c;如今的商业世界已经越来越向数字化转型。拥有一套完整的数字化的进销存管理能够极大地提升公司货物进出库存情况的效率和准确性&#xff0c;避免过程中出现不必要的错误和漏洞&#xff0c;从而帮助企业更加稳健地自我发展。那么&#xff0c;一…

3.7.2数据库系统-数据库控制技术:数据库的安全性、数据库备份与恢复技术、数据备份、数据库故障与恢复

3.7.2数据库系统-数据库控制技术&#xff1a;数据库的安全性、数据库备份与恢复技术、数据备份、数据库故障与恢复数据库的安全性数据库备份与恢复技术数据备份数据库故障与恢复数据库的安全性 在做信息系统开发的过程当中&#xff0c;数据库是其中很大的占比&#xff0c;信息…

【MySQL入门指南】数据库基本操作

文章目录MySQL库操作一、SQL语句二、创建数据库1.语法2.案例3.极其不推荐的方式三、查看数据库1.语法四、修改数据库五、删除数据库六、字符集与校验规则1.是什么2.相关指令3.校验规则的影响七、备份数据库1.基本语法2.注意事项MySQL库操作 一、SQL语句 DDL(data definition l…

Visual Studio Code跳转到CSS定义

Visual Studio Code 快速跳转到 VUE文件 或 CSS文件的定义位置&#xff08;跳转到class定义&#xff0c;跳转到css定义&#xff09;&#xff0c;插件Css Peek、Vue Peek 对提升开发效率上&#xff0c;事半功倍。 目录 1、跳转到CSS定义 1.1、CSS Peek 1.2、Vue Peek 2、其他…

全国青少年软件编程(Scratch)等级考试一级考试真题2023年3月——持续更新.....

一、单选题(共25题&#xff0c;共50分) 1. 下列说法不正确的是&#xff1f;&#xff08; &#xff09; A.可以从声音库中随机导入声音 B.可以录制自己的声音上传 C.可以修改声音的大小 D.不能修改声音的速度 试题解析&#xff1a;针对声音可以进行导入&#xff0c;上传&…