Vuex實現(xiàn)購物車小功能
Vuex實現(xiàn)購物車功能(附:效果視頻),供大家參考,具體內(nèi)容如下
功能描述:
- 加購
- 刪除
- 加減
- 全選反選
- 選中計算總價
- 存儲
整體演示效果如下:
首先介紹一下Vuex:
Vuex 實例對象屬性 主要有下面5個核心屬性:
state : 全局訪問的state對象,存放要設(shè)置的初始狀態(tài)名及值(必須要有)
mutations : 里面可以存放改變 state 的初始值的方法 ( 同步操作–必須要有 )
getters: 實時監(jiān)聽state值的變化可對狀態(tài)進(jìn)行處理,返回一個新的狀態(tài),相當(dāng)于store的計算屬性(不是必須的)
actions : 里面可以存放用來異步觸發(fā) mutations 里面的方法的方法 ( 異步操作–不是必須的 )
modules : 存放模塊化的數(shù)據(jù)(不是必須的)
一、主頁面Home:
<template> <div id="app"> <div class="nav-top"> <!-- 標(biāo)簽欄--> <van-nav-bar title="商品列表頁" left-arrow /> </div> <div class="nav-bottom"> <!-- 商品卡片--> <van-card v-for="item in goodsList" :price="item.actualPrice" :desc="item.desc" :title="item.dtitle" :thumb="item.mainPic" > <template #num> <van-icon name="shopping-cart-o" color="red" size="24px" @click="add(item)"/> </template> </van-card> </div> </div> </template> <script> export default { data() { return { goodsList: [], // 商品列表數(shù)據(jù) } }, // 請求商品列表數(shù)據(jù) mounted() { // 接口不予展示,有需要請自行下載 this.$axios.get('api接口').then(res => { this.goodsList = res.data.data.data // console.log(this.goodsList) }) }, methods: { // 添加商品 調(diào)用vuex中的add方法 add(item) { this.$store.commit('add', item) } } } </script> <style lang="scss" scoped> #app { .nav-top { width: 100%; position: fixed; top: 0; left: 0; z-index: 9; } .nav-bottom { margin-top: 50px; } } </style>
二、購物車頁面ShopCart:
<template> <div> <!-- 標(biāo)簽欄--> <van-nav-bar title="購物車" left-arrow @click-left="back" /> <!-- 購物車box --> <div class="car-box" v-for="(item,index) in list" :key="index"> <!-- 左側(cè)復(fù)選框布局--> <div class="car-box-left"> <van-checkbox v-model="item.ckd"></van-checkbox> </div> <!-- 右側(cè)商品卡片布局--> <div class="car-box-right"> <van-swipe-cell> <van-card :price="item.item.actualPrice" :title="item.item.dtitle" :thumb="item.item.mainPic" > <!-- 步進(jìn)器--> <template #num> <van-stepper v-model="item.num" theme="round" button-size="22" disable-input @change="changeNum(item.num)"/> </template> </van-card> <!-- 右側(cè)滑動刪除--> <template #right> <van-button square text="刪除" type="danger" class="delete-button" @click="del(index)"/> </template> </van-swipe-cell> </div> </div> <!-- 空狀態(tài) 沒數(shù)據(jù)顯示 有數(shù)據(jù)隱藏--> <van-empty v-show="$store.state.cartList.length==0" class="custom-image" image="https://img.yzcdn.cn/vant/custom-empty-image.png" description="購物車是空的喲!" /> <!-- 商品導(dǎo)航--> <van-submit-bar :price="$store.getters.total*100" button-text="提交訂單"> <van-checkbox v-model="checkAll">全選</van-checkbox> </van-submit-bar> </div> </template> <script> import {mapMutations} from 'vuex' export default { data() { return { list: this.$store.state.cartList, //購物車數(shù)據(jù) } }, computed: { // 計算屬性checkAll 和全選按鈕雙向數(shù)據(jù)綁定,別人可以控制它 它也可以控制別人 // 別人控制它 給他一個值的時候是 get , 它控制別人 給別人設(shè)置值的時候 是set // 在set中newVal參數(shù)是這個計算屬性改變后的值 checkAll: { //可以看作一個事件 get() { // 判斷購物車?yán)锷唐返拈L度為0 return false if (this.list.length == 0) { return false } return this.$store.state.cartList.every(item => { return item.ckd == true // 返回結(jié)果復(fù)選框為true }) }, set(newVal) { this.$store.commit('ckd', newVal) }, } }, methods: { // 返回商品列表頁 back() { this.$router.push({ path: '/' }) }, //方法集合 ...mapMutations(['del', 'changeNum',]) }, } </script> <style lang="scss" scoped> .goods-card { margin: 0; background-color: white; } .delete-button { height: 100%; } .car-box { width: 100%; margin-bottom: 5px; display: flex; flex-wrap: nowrap; align-items: center; .car-box-left { flex: 1; padding-left: 10px; } .car-box-right { flex: 12; } } </style>
三、Vuex代碼:
import Vue from 'vue' import Vuex from 'vuex' import VuexPersist from 'vuex-persist' Vue.use(Vuex); export default new Vuex.Store({ state: { cartList: [], // 購物車數(shù)據(jù) }, mutations: { // 添加商品 add(state, item) { // console.log(item) let flag = false; // 加購去重(通過id判斷) state.cartList.forEach(i => { if (i.item.id == item.id) { i.num++; flag = true; } }) if (flag == false) { state.cartList.push({ num: 1, // 添加數(shù)量默認(rèn)為1 item, // 添加購物車商品數(shù)據(jù) ckd: false, // 添加復(fù)選框初始化狀態(tài)為false }) } // console.log(state.cartList) }, // 刪除商品 del(state, index) { state.cartList.splice(index, 1) // state. }, // 改變數(shù)量------加減綜合法 !??! changeNum(state, index) { state.cartList.num = index }, // 全選全不選 ckd(state, newAll) { state.cartList.forEach(item => { item.ckd = newAll }) } }, // 計算 getters getters: { // 總價 total(state) { let sum = 0; state.cartList.forEach(item => { // 如果復(fù)選框選中 計算總價 if (item.ckd == true) { sum += item.item.actualPrice * item.num } }) return sum } }, actions: {}, modules: {}, // Vuex存儲插件 plugins: [ new VuexPersist({ storage: window.localStorage, }).plugin, ] })
關(guān)于vue.js組件的教程,請大家點擊專題vue.js組件學(xué)習(xí)教程進(jìn)行學(xué)習(xí)。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue項目啟動后,js-base64依賴報錯Cannot read properties
這篇文章主要介紹了vue項目啟動后,js-base64依賴報錯Cannot read properties of null(reading ‘replace’)問題,2024-05-05Vue-axios-post數(shù)據(jù)后端接不到問題解決
這篇文章主要介紹了Vue-axios-post數(shù)據(jù)后端接不到問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01Vue實現(xiàn)登錄功能全套超詳細(xì)講解(含封裝axios)
這篇文章主要給大家介紹了關(guān)于Vue實現(xiàn)登錄功能(含封裝axios)的相關(guān)資料,Vue是現(xiàn)在前端最流行的框架之一,作為前端開發(fā)人員應(yīng)該要熟練的掌握它,需要的朋友可以參考下2023-10-10Electron主進(jìn)程(Main?Process)與渲染進(jìn)程(Renderer?Process)通信詳解
這篇文章主要介紹了Electron主進(jìn)程(Main?Process)與渲染進(jìn)程(Renderer?Process)通信,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03詳解vue-cli 本地開發(fā)mock數(shù)據(jù)使用方法
這篇文章主要介紹了詳解vue-cli 本地開發(fā)mock數(shù)據(jù)使用方法,如果后端接口尚未開發(fā)完成,前端開發(fā)一般使用mock數(shù)據(jù)。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05