實驗3:事件處理(2學時)

  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;科…