微信小程序實戰案例 - 餐館點餐系統 階段 2 – 購物車

階段?2 – 購物車(超詳細版)

目標

  1. 把“加入購物車”做成 全局狀態,任何頁面都能讀寫
  2. 在本地 持久化(關閉小程序后購物車仍在)
  3. 新建 購物車頁:數量增減、總價實時計算、去結算入口
  4. 打 Git?Tag v2.0?cart

1. 學到的核心技術

技術/概念關鍵 API/組件為什么要學
全局狀態App.globalData / 簡易 store.js小項目先不引入第三方狀態庫,足夠用
本地持久化wx.setStorageSync / wx.getStorageSync保證用戶切后臺、重進小程序后數據不丟
UI 組件(彈出購物車)
?(底部結算條)
?(數量加減)
快速完成電商式交互
TabBar Badgewx.setTabBarBadge在底部“購物車”圖標上顯示件數

2. 項目結構新增

miniprogram/├─ store/          # 新增│   └─ cart.js├─ pages/│   ├─ index/      # 首頁已存在│   └─ cart/       # 新建購物車頁面

3. 編寫輕量級全局 Store

路徑miniprogram/store/cart.js

const CART_KEY = 'CART_V1'
const store = {data: { items: {} },load() {this.data.items = wx.getStorageSync(CART_KEY) || {}},save() {wx.setStorageSync(CART_KEY, this.data.items)},add(dish) {const { _id } = dishif (this.data.items[_id]) {this.data.items[_id].count += 1} else {this.data.items[_id] = { ...dish, count: 1 }}this.save()},totalCount() {return Object.values(this.data.items).reduce((s, i) => s + i.count, 0)},totalPrice() {return Object.values(this.data.items).reduce((s, i) => s + i.count * i.price, 0).toFixed(2)}}
module.exports = store

4. 在 app.js 中加載購物車

// miniprogram/app.js
App({onLaunch() {const cart = require('./store/cart')cart.load()this.globalData = { cart }}
})

5. 修改首頁:加入購物車 & 更新角標

文件pages/index/index.js

只需要把之前的 onAddCart 改成:

import cart from '../../store/cart'onAddCart(e) {const dish = e.currentTarget.dataset.dishcart.add(dish)wx.setTabBarBadge({ index: 1, text: String(cart.totalCount()) })wx.showToast({ title: '已加入購物車', icon: 'success' })}
}

提示:在 app.jsontabBar 數組里,把第二項頁面路徑設成 "pages/cart/index",這樣角標才會顯示在購物車圖標上。


6. 新建購物車頁面

6.1 組件聲明 pages/cart/index.json
{"navigationBarTitleText": "購物車"
}
6.2 頁面布局 index.wxml
<view class="page"><block wx:for="{{list}}" wx:key="_id"><view class="cart-item"><image class="thumb" src="{{item.img}}" mode="aspectFill" /><view class="info"><text class="name">{{item.name}}</text><text class="price">¥{{item.price}}</text><text class="count">x {{item.count}}</text></view></view></block><view class="bottom-bar"><text>共 {{totalCount}} 件</text><text>合計:¥{{totalPrice}}</text><button type="primary" bindtap="onCheckout">去結算</button></view>
</view>
6.3 頁面邏輯 index.js
const cart = require('../../store/cart')Page({data: {list: [],totalCount: 0,totalPrice: '0.00'},onShow() {cart.load()this.refresh()},refresh() {const items = Object.values(cart.data.items)const totalCount = cart.totalCount()const totalPrice = cart.totalPrice()this.setData({list: items,totalCount,totalPrice})},onCheckout() {if (!this.data.totalCount) {wx.showToast({ title: '購物車為空', icon: 'none' })return}wx.navigateTo({ url: '/pages/confirm/index' }) // 下一階段頁}
})
6.4 簡單樣式 index.wxss
.page {padding: 20rpx;
}.cart-item {display: flex;background: #fff;padding: 20rpx;margin-bottom: 20rpx;border-radius: 16rpx;box-shadow: 0 4rpx 12rpx rgba(0,0,0,0.05);
}.thumb {width: 100rpx;height: 100rpx;border-radius: 8rpx;margin-right: 20rpx;
}.info {display: flex;flex-direction: column;justify-content: space-around;
}.name {font-weight: bold;font-size: 32rpx;
}.price {color: #fa541c;
}.count {font-size: 28rpx;color: #888;
}.bottom-bar {position: fixed;bottom: 0;left: 0;width: 100%;background: #fff;padding: 20rpx;display: flex;justify-content: space-between;box-shadow: 0 -2rpx 12rpx rgba(0,0,0,0.1);
}

7. TabBar 配置示例

// app.json(節選)
"tabBar": {"list": [{ "pagePath": "pages/index/index", "text": "菜單", "iconPath": "images/icons/home.png", "selectedIconPath": "images/icons/home-active.png" },{ "pagePath": "pages/cart/index",  "text": "購物車", "iconPath": "images/icons/business.png", "selectedIconPath": "images/icons/business-active.png" }]}

在這里插入圖片描述

8. 自測清單 & Git?Tag

  1. 首頁點兩道菜 → 角標顯示 2
  2. 進入購物車頁
    • 看得到兩條記錄
  3. 關閉小程序再打開 → 數據依舊存在
  4. 一切通過后:
git add .
git commit -m "feat: shopping cart"
git tag v2.0-cart
git push --tags

9. 練習(進階挑戰)

難度練習內容
?cart.js 增加 clear() 方法,在購物車頁提供“一鍵清空”。
??在首頁卡片上顯示當前已選數量(小圓角徽標)。
???把 Store 升級為 PiniaRemax Recoil,體驗響應式自動刷新。

階段小結

  • 你已擁有 加入購物車 → 全局狀態 → 本地持久化 → 購物車 UI 的完整鏈路。
  • 代碼量 ≈?250 行,但邏輯清晰、易維護。
  • 接下來進入 階段?3 – 下單 & 云數據庫:把購物車內容寫入 orders 集合,實現真正的下單流程。

繼續加油,愉快編碼!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/901741.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901741.shtml
英文地址,請注明出處:http://en.pswp.cn/news/901741.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從紅黑樹到哈希表:原理對比與典型場景應用解析(分布式以及布隆過濾器)

在數據結構的世界里&#xff0c;紅黑樹一直以「自平衡二叉查找樹」的身份備受贊譽。憑借紅黑節點的精妙設計&#xff0c;它能將插入、刪除、查找的時間復雜度穩定控制在 ( log ? n ) (\log n) (logn)&#xff0c;成為處理有序數據的經典方案。然而&#xff0c;當業務場景對「…

游戲報錯?MFC140.dll怎么安裝才能解決問題?提供多種MFC140.dll丟失修復方案

MFC140.dll 是 Microsoft Visual C 2015 運行庫的重要組成部分&#xff0c;許多軟件和游戲依賴它才能正常運行。如果你的電腦提示 "MFC140.dll 丟失" 或 "MFC140.dll 未找到"&#xff0c;說明系統缺少該文件&#xff0c;導致程序無法啟動。本文將詳細介紹 …

《電子類專業:通往科技未來的鑰匙》

一、電子類專業全景概覽 在當今科技飛速發展的時代,電子類專業無疑占據著現代科技體系中基礎與核心的重要地位。從我們日常生活中不可或缺的智能手機、電腦,到推動社會進步的人工智能、大數據技術,再到探索宇宙奧秘的航天航空設備,電子類專業的身影無處不在。它就像一把萬…

Java--批量刪除

前端部分 前端代碼主要負責收集用戶選擇的學生記錄的 id&#xff0c;并將這些 id 發送給后端的 DeleteMoreServlet 進行處理。 批量刪除按鈕綁定點擊事件 $(".deleteMore").on("click",function(){// ... }); 當用戶點擊 “批量刪除” 按鈕時&#xff…

2025年4月份生活有感

今天在5000B培訓的下午&#xff0c;一起入所來的小伙伴&#xff0c;有個申請了深圳大學的博士&#xff0c;已錄取。哎&#xff0c;想起了當年申博時候信心和決心不足&#xff0c;導致后面匆匆的拿了offer去工作。看到同事的選擇還是非常羨慕&#xff0c;想到自己5月份的婚禮&am…

數學建模學習資料免費分享:歷年賽題與優秀論文、算法課程、數學軟件等

本文介紹并分享自己當初準備數學建模比賽時&#xff0c;收集的所有資料&#xff0c;包括歷年賽題與論文、排版模板、算法講解課程與書籍、評分標準、數學建模軟件等各類資料。 最近&#xff0c;準備將自己在學習過程中&#xff0c;到處收集到的各類資料都整理一下&#xff0c;并…

關于 微服務負載均衡 的詳細說明,涵蓋主流框架/解決方案的對比、核心功能、配置示例及總結表格

以下是關于 微服務負載均衡 的詳細說明&#xff0c;涵蓋主流框架/解決方案的對比、核心功能、配置示例及總結表格&#xff1a; 1. 負載均衡的核心概念 負載均衡在微服務中用于將請求分發到多個服務實例&#xff0c;以實現&#xff1a; 高可用性&#xff1a;避免單點故障。性…

個人博客搭建過程

嘗試博客搭建,前面注冊部分很簡單&#xff0c;就不寫了&#xff0c;以我看到的一個博客為基礎&#xff0c;加上我自己的測試結束 1.官網 https://dash.infinityfree.com 前半部分參考&#xff1a; 使用Infinityfree免費虛擬主機搭建一個wordpress網站 2.創建賬戶或登錄您的…

Proxmox VE 網絡配置命令大全

如果對 Proxmox VE 全棧管理感興趣&#xff0c;可以關注“Proxmox VE 全棧管理”專欄&#xff0c;后續文章將圍繞該體系&#xff0c;從多個維度深入展開。 概要&#xff1a;Proxmox VE 網絡配置靈活&#xff0c;滿足虛擬化組網需求。基礎靠橋接實現虛擬機與物理網絡互聯&#x…

【QT入門到晉級】QT打動態庫包及引入動態庫包

前言 本篇為持續更新狀態&#xff0c;內容包含window、Linux下打動態庫包&#xff0c;以及引入動態庫包的方式。 一、window 1、動態庫打包 以百度的OCR接口調用打dll庫為例&#xff0c;以下為qtcreator創建動態庫過程&#xff1a; 1.1Qtcreator創建lib項目 創建成功后&…

Uniapp: 大綱

目錄 一、基礎鞏固1.1、Uniapp:下拉選擇框ba-tree-picker1.2、Uniapp&#xff1a;確認框1.3、Uniapp&#xff1a;消息提示框1.4、Uniapp&#xff1a;列表提示框1.5、Uniapp&#xff1a;獲取當前定位坐標 二、項目配置2.1、Uniapp&#xff1a;修改端口號2.2、Uniapp&#xff1a;…

WPF 從Main()方法啟動

1.去掉App.xaml StartupUri“MainWindow.xaml” 只會讓App.g.cs 不生成這行代碼&#xff0c;但是還是會生成的App.g.cs文件中生成Main方法 this.StartupUri new System.Uri("MainWindow.xaml", System.UriKind.Relative);默認的App.xaml的生成操作是 應用程序定義…

ADB的安裝及抓取日志(2)

三、ADB抓取日志 在使用ADB抓取日志前&#xff0c;首先要保證電腦已經安裝并配置ADB&#xff0c;在上一節已經驗證完成。連接設備&#xff1a;可通過USB或者WI-FI&#xff0c;將安卓設備與電腦連接&#xff0c;并啟用USB調試模式&#xff0c;此處我選擇的是通過電腦與安卓設備…

opencv 灰度實驗

opencv 灰度實驗 1. 最大值法2. 平均值法3. 加權均值法4(直接讀取灰度圖)cv2.IMREAD_GRAYSCALE5內置將原圖轉換為灰度圖cv2.cvtColor()6 兩個極端的灰度值 灰度圖與彩色圖最大的不同就是&#xff1a;彩色圖是由R、G、B三個通道組成&#xff0c;而灰度圖只有一個通道&#xff0c…

『Kubernetes(K8S) 入門進階實戰』實戰入門 - Pod 詳解

『Kubernetes(K8S) 入門進階實戰』實戰入門 - Pod 詳解 Pod 結構 每個 Pod 中都可以包含一個或者多個容器&#xff0c;這些容器可以分為兩類 用戶程序所在的容器&#xff0c;數量可多可少Pause 容器&#xff0c;這是每個 Pod 都會有的一個根容器&#xff0c;它的作用有兩個 可…

用 Vue 3 實現一個拖拽排序表格組件(支持列/行重排、列寬調整)

文章目錄 一、項目初始化1.1 技術棧說明1.2 項目結構圖&#xff08;Mermaid&#xff09; 二、構建基礎表格組件2.1 創建基本表格結構 三、實現行拖拽排序3.1 安裝依賴3.2 使用 vuedraggable 實現拖拽 四、實現列寬拖拽調整4.1 基本樣式設置4.2 添加拖拽邏輯 五、實現列拖拽排序…

Python異常處理全面指南

目錄 一、異常處理概述 1.1 什么是異常&#xff1f; 1.2 常見異常類型示例 二、基礎異常捕獲 2.1 簡單異常捕獲語法 2.2 特定異常類型捕獲 三、高級異常處理技術 3.1 完整異常處理語法 3.2 異常傳遞機制 四、主動拋出異常 4.1 自定義異常拋出 4.2 創建自定義異常類 …

基于混沌映射的LDPC信道編譯碼matlab性能仿真,對比LDPC

目錄 1.算法仿真效果 2.算法涉及理論知識概要 2.1 混沌映射 2.2 基于混沌映射的LDPC編譯碼 3.MATLAB核心程序 4.完整算法代碼文件獲得 1.算法仿真效果 matlab2022a仿真結果如下&#xff08;完整代碼運行后無水印&#xff09;&#xff1a; 仿真操作步驟可參考程序配套的操…

學點概率論,打破認識誤區

概率論是統計分析和機器學習的核心。掌握概率論對于理解和開發穩健的模型至關重要&#xff0c;因為數據科學家需要掌握概率論。本博客將帶您了解概率論中的關鍵概念&#xff0c;從集合論的基礎知識到高級貝葉斯推理&#xff0c;并提供詳細的解釋和實際示例。 目錄 簡介 基本集合…

【數據結構_9】棧和隊列

隊列 Queue 一個方向進&#xff0c;一個方向出 Queue隊列提供的核心方法&#xff1a; 入隊列&#xff1a;offer add 出隊列&#xff1a;poll remove 取隊首元素&#xff1a; peek element 前面一列發生錯誤是返回null 后面一列發生錯誤時拋出異常 Queue是否能夠使用isEm…