1. 实验目的

(1)熟练掌握 v-on 指令的用法,学会使用 v-on 指令监听 DOM 元素的事件,并通过该事件触发调用事件处理程序。

(2)掌握v-on 指令修饰符的基本用法

  1. 实验内容

实现购物车功能的拓展(商品数量的变化、总价变化)。要求:点击+、-按钮实现商品数量的变化,同时其总价和合计金额同步改变实验效果如图1所示。

图1

参考基础代码如下:

在此基础上完成代码编写及调试。

提示:(1)可以利用计算属性实现商品总价的合计;

(2)利用v-for指令实现表格行(<tr>...</tr>)的重复渲染;

(3)利用v-on指令监听按钮点击事件,处理商品数量的增、减操作。

  1. 实验原理或流程图

事件监听:通过 v-on 指令绑定 DOM 事件,当事件触发时调用指定的方法。

事件修饰符:使用 .stop、.prevent、.capture 等修饰符对事件进行更精细的控制。

按键修饰符:用于监听键盘事件,支持按键别名(如 .enter)。

计算属性:利用 Vue 的计算属性动态计算商品总价和合计金额。

循环渲染:使用 v-for 指令动态渲染表格行。

相关知识点

(1)事件监听使用v-on 指令、事件处理方法、使用内联 JS 语句

使用 v-on 指令监听 DOM 事件的基本格式示例如下:

<button v-on:click="show">显示</button>

其中,v-on指令后面为原生事件名称,如:click表示单击事件;通过v-on指令将click单击事件绑定到 show() 方法;当单击“显示”按钮时就会执行 show() 方法。

通常使用v-on指令的简写形式,即:

<button @click="show">显示</button>

与事件绑定的方法支持参数 event,即代表传入的原生 DOM 事件对象。

v-on 指令支持内联 js 语句,但只能使用一个js语句。

可以将一个特殊的变量 $event 传入方法之中,用于获取原生的 DOM 事件对象。

(2)v-on指令的修饰符:事件修饰符,按键修饰符

常用的事件修饰符有:.stop,.prevent,.capture,.self,.once,.passive。例如,.prevent用于阻止超链接的默认跳转行为,等于调用event.preventDefaut()。.stop修饰符的作用是阻止事件冒泡,等同于调用event.stopPropagation()。

按键修饰符用于监听键盘的按键事件。当触发键盘事件时,需要检测按键的keyCode值。示例:

<input type="text" v-on:keyup.13="insert()">

<input type="text" v-on:keyup.enter="insert()">

常用按键的keyCode值及其别名:见教材p79中的表6-2

  1. 实验过程或源代码

代码说明

数据结构:

cart 数组存储购物车中的商品信息,每个商品包含 name(名称)、price(单价)和 quantity(数量)。

计算属性:

totalPrice:动态计算每件商品的总价(price * quantity)。

totalAmount:动态计算购物车的合计金额(所有商品总价之和)。

事件处理:

increaseQuantity:增加商品数量。

decreaseQuantity:减少商品数量(数量不能小于1)。

removeItem:删除商品。

循环渲染:

使用 v-for 指令动态渲染购物车中的每一行数据。

事件绑定:

使用 v-on 或 @ 绑定按钮的点击事件。

实验过程

初始化项目:

创建 HTML 文件 shopping-cart.html,引入 Vue.js。

定义购物车数据结构,包括商品名称、单价和数量。

实现功能:

使用 v-for 指令动态渲染购物车表格。

使用 v-on 指令绑定按钮的点击事件,实现商品数量的增减和删除操作。

使用计算属性动态计算商品总价和合计金额。

调试与优化:

测试功能是否正常,确保商品数量和总价能够正确更新。

添加样式优化表格显示效果。

shopping-cart.html

<!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://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>

    <style>

        table {

            width: 100%;

            border-collapse: collapse;

        }

        th, td {

            border: 1px solid #ddd;

            padding: 8px;

            text-align: center;

        }

        th {

            background-color: #f2f2f2;

        }

    </style>

</head>

<body>

    <div id="app">

        <h2>购物车</h2>

        <table>

            <thead>

                <tr>

                    <th>商品名称</th>

                    <th>单价</th>

                    <th>数量</th>

                    <th>总价</th>

                    <th>操作</th>

                </tr>

            </thead>

            <tbody>

                <tr v-for="(item, index) in cart" :key="index">

                    <td>{{ item.name }}</td>

                    <td>{{ item.price }}</td>

                    <td>

                        <button @click="decreaseQuantity(index)">-</button>

                        {{ item.quantity }}

                        <button @click="increaseQuantity(index)">+</button>

                    </td>

                    <td>{{ item.totalPrice }}</td>

                    <td>

                        <button @click="removeItem(index)">删除</button>

                    </td>

                </tr>

            </tbody>

            <tfoot>

                <tr>

                    <td colspan="3">合计金额</td>

                    <td>{{ totalAmount }}</td>

                    <td></td>

                </tr>

            </tfoot>

        </table>

    </div>

    <script>

        new Vue({

            el: '#app',

            data: {

                cart: [

                    { name: '双合成礼盒', price: 100, quantity: 2 },

                    { name: '脑白金', price: 200, quantity: 3 },

                    { name: '三只松鼠干果礼盒', price: 150, quantity: 5 }

                ]

            },

            computed: {

                // 计算属性:动态计算每件商品的总价

                totalPrice() {

                    return this.cart.map(item => item.price * item.quantity);

                },

                // 计算属性:动态计算购物车的合计金额

                totalAmount() {

                    return this.totalPrice.reduce((sum, price) => sum + price, 0);

                }

            },

            methods: {

                // 增加商品数量

                increaseQuantity(index) {

                    this.cart[index].quantity += 1;

                },

                // 减少商品数量

                decreaseQuantity(index) {

                    if (this.cart[index].quantity > 1) {

                        this.cart[index].quantity -= 1;

                    }

                },

                // 删除商品

                removeItem(index) {

                    this.cart.splice(index, 1);

                }

            }

        });

    </script>

</body>

</html>

  1. 实验心得

通过本次实验,我深入学习了 Vue.js 中事件处理的实现方式,包括 v-on 指令的使用、事件修饰符的作用以及计算属性的动态计算。在实现购物车功能的过程中,我掌握了如何通过事件绑定实现用户交互,并利用计算属性简化代码逻辑。实验中遇到的问题主要是数据更新时的同步问题,通过计算属性和 Vue 的响应式系统,我成功解决了这些问题。这次实验不仅巩固了我的理论知识,还提升了我的实际开发能力,让我对前端开发有了更深刻的理解。

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

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

相关文章

商品库存扣减方案

文章目录1. Lua脚本 Redis&#xff08;业界首选&#xff0c;综合最优&#xff09;2. Redis原子命令&#xff08;DECRBY 结果校验&#xff09;3. Redis事务&#xff08;MULTI/EXEC&#xff09;4. 分布式锁&#xff08;基于Redis实现&#xff09;5. Redisson客户端封装&#xf…

关于在阿里云DMS误操作后如何恢复数据的记录

前言 昨天因客户员工操作错误&#xff0c;导致快递单号和订单互换。客户员工那边让笔记修改数据。 于是笔者写下如下SQL来操作&#xff0c;导致了灾难性事故。 update t_order_fed_ex_record set tracking_number 884102170661, master_tracking_number 884102170661, push…

【操作系统核心知识梳理】线程(Thread)重点与易错点全面总结

在多任务操作系统中&#xff0c;线程是比进程更轻量的执行单元&#xff0c;理解线程的特性和实现方式是掌握并发编程的基础。本文系统梳理了线程相关的核心知识点和常见误区&#xff0c;助你夯实操作系统基础。一、线程的基本概念与引入目的 1.1 什么是线程&#xff1f; 线程是…

深入理解 Python 中的 `__call__` 方法

化身为可调用的对象&#xff1a;深入理解 Python 中的 __call__ 方法 引言&#xff1a;函数与对象的边界模糊化 在 Python 中&#xff0c;我们最熟悉的概念莫过于函数&#xff08;Function&#xff09; 和对象&#xff08;Object&#xff09;。函数是可调用的&#xff08;calla…

云服务器使用代理稳定与github通信方法

使用SSH反向隧道 (SSH Reverse Tunneling) 利用SSH连接在您的本地电脑和云服务器之间建立一个反向的加密通道。 原理&#xff1a; 从本地电脑发起一个SSH命令到您的云服务器&#xff0c;这个命令会告诉云服务器&#xff1a;“请监听您自己的某个端口&#xff08;例如&#xff1…

7.k8s四层代理service

Service的基本介绍 Cluster IP&#xff1a;每个 Service 都分配了一个Cluster IP&#xff0c;它是一个虚拟的内部IP地址&#xff0c;用于在集群内部进行访问。这个虚拟IP是由Kubernetes自动分配的&#xff0c;并且与Service对象一一对应。 端口映射&#xff1a;Service可以映射…

Qt 工程中 UI 文件在 Makefile 中的处理

Qt 工程中 UI 文件在 Makefile 中的处理 在 Qt 工程中&#xff0c;.ui 文件&#xff08;Qt Designer 界面文件&#xff09;需要通过 uic&#xff08;用户界面编译器&#xff09;工具转换为对应的头文件。以下是几种情况下如何处理 UI 文件&#xff1a;1. 使用 qmake 自动生成 M…

ZLMediaKit性能测试

一、环境 系统&#xff1a;虚拟机 Ubuntu22.04 64bit配置: 4核8G设置&#xff1a;ulimit -n 102400 二、安装 依赖安装sudo apt update sudo apt install ffmpeg sudo apt install nloadzlm服务安装参考&#xff1a;https://blog.csdn.net/hanbo622/article/details/149064939?…

智能文档处理业务,应该选择大模型还是OCR专用小模型?

智能文档处理业务中&#xff0c;最佳策略不是二选一&#xff0c;而是“大小模型协同”。用专用小模型处理高频、标准化的核心文档流&#xff0c;实现极致效率与成本控制&#xff1b;用大模型赋能非标、长尾文档的灵活处理&#xff0c;加速业务创新。 OCR小模型会被大模型取代吗…

android 如何判定底部导航栏显示时 不是键盘显示

在 Android 中判定底部导航栏是否显示时&#xff0c;核心痛点是 区分 “导航栏的底部 Insets” 和 “软键盘弹出的底部 Insets”—— 两者都会导致 getSystemWindowInsetBottom() 返回非零值&#xff0c;直接判断会误将键盘弹出当成导航栏显示。以下是基于 WindowInsets 类型区…

你知道服务器和电脑主机的区别吗?

我们都知道服务器和台式主机有着不同之处&#xff0c;但具体说出个一二三来很多人还是一头雾水&#xff0c;也就是知其然不知其所以然&#xff0c;都是CPU主板 内存 硬盘 电源&#xff0c;撑死就差一个显卡不同&#xff0c;但其实服务器和我们正常使用的台式主机差距很大&#…

什么是包装类

什么是包装类 在Java中&#xff0c;包装类&#xff08;Wrapper Class&#xff09;是为基本数据类型提供的对应的引用类型。Java中的基本数据类型&#xff08;如int、char、boolean等&#xff09;不是对象&#xff0c;为了在需要对象的场景中使用基本数据类型&#xff08;如集合…

用Python打造专业级老照片修复工具:让时光倒流的数字魔法

在这个数字化时代&#xff0c;我们手中珍藏着许多泛黄、模糊、甚至有划痕的老照片。这些照片承载着珍贵的回忆&#xff0c;但时间的侵蚀让它们失去了往日的光彩。今天&#xff0c;我将带您一起用Python开发一个专业级的老照片修复工具&#xff0c;让这些珍贵的记忆重现光彩。为…

linux中查找包含xxx内容的文件

linux中怎么查找哪个文件包含xxx内容 在Linux中查找包含特定内容的文件 在Linux系统中&#xff0c;有几种常用方法来查找包含特定内容的文件。以下是几种最有效的方法&#xff1a;1. 使用 grep 命令&#xff08;最常用&#xff09; 基本语法&#xff1a;bash grep -r "搜索…

sklearn 加州房价数据集 fetch_california_housing 出错 403: Forbidden 修复方案

问题 加载加州房价数据时出现 403 错误 HTTP Error 403: Forbidden from sklearn.datasets import fetch_california_housingcalifornia fetch_california_housing() print(california.target.shape) 解决方案 运行下述代码&#xff0c;然后再运行上述的 fetch_california_hou…

嵌入式学习---(硬件)

1、在LED实验中&#xff0c;在对Soc引脚配置时都做了哪些工作&#xff1f;复用功能配置操作寄存器&#xff1a;IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03将引脚的低 4 位设置为 0101&#xff0c;将引脚复用为 GPIO 功能电气特性配置操作寄存器&#xff1a;IOMUXC_SW_PAD_CTL_PAD_GPIO1…

微信小程序开发教程(十一)

目录&#xff1a;1.上拉触底案例-初步实现上拉触底效果2.上拉触底案例-添加loading效果3.上拉触底案例-节流处理4.扩展-自定义编译模式1.上拉触底案例-初步实现上拉触底效果页面加载的时候调用这个方法&#xff1a;设置样式&#xff1a;下拉触底后继续调用获取颜色的方法2.上拉…

Android相机API2,基于GLSurfaceView+SurfaceTexture实现相机预览,集成的相机算法采用GPU方案,简要说明

Android相机API2&#xff0c;基于GLSurfaceViewSurfaceTexture实现相机预览&#xff0c;集成的相机算法采用GPU方案&#xff0c;简要流程如下(不叠加相机算法的预览显示流程也大体如此&#xff0c;只是去掉了算法部分)&#xff1a;进入相机&#xff1a;1&#xff0c;新建实现了…

[code-review] 日志机制 | `LOG_LEVEL`

第6章&#xff1a;日志机制&#xff08;调试&#xff09; 欢迎来到我们了解ChatGPT-CodeReview项目的最后一章 在第5章&#xff1a;文件过滤逻辑&#xff08;范围管理器&#xff09;中&#xff0c;我们学习了机器人如何智能地决定哪些文件需要发送给AI审查。 但一旦机器人开…

n8n工作流平台入门学习指南

目录 1、基础背景 2、核心概念 2.1 节点(Nodes) 2.2 连接(Connections) 2.3 工作流(Workflows) 3、常用节点说明 4、基于Docker快速部署 5、学习资料 6、常见问题 强烈推荐&#xff0c;大家不懂的直接问&#xff1a;N8N大师&#xff08;GPT&#xff09;&#xff0c;科…