Vuex实现购物车功能(附:效果视频),供大家参考,具体内容如下
功能描述:
- 加购
- 删除
- 加减
- 全选反选
- 选中计算总价
- 存储
整体演示效果如下:
首先介绍一下Vuex:
Vuex 实例对象属性 主要有下面5个核心属性:
state : 全局访问的state对象,存放要设置的初始状态名及值(必须要有)
mutations : 里面可以存放改变 state 的初始值的方法 ( 同步操作–必须要有 )
getters: 实时监听state值的变化可对状态进行处理,返回一个新的状态,相当于store的计算属性(不是必须的)
actions : 里面可以存放用来异步触发 mutations 里面的方法的方法 ( 异步操作–不是必须的 )
modules : 存放模块化的数据(不是必须的)
一、主页面Home:
<template> <div id="app"> <div class="nav-top"> <!-- 标签栏--> <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: [], // 商品列表数据 } }, // 请求商品列表数据 mounted() { // 接口不予展示,有需要请自行下载 this.$axios.get('api接口').then(res => { this.goodsList = res.data.data.data // console.log(this.goodsList) }) }, methods: { // 添加商品 调用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> <!-- 标签栏--> <van-nav-bar title="购物车" left-arrow @click-left="back" /> <!-- 购物车box --> <div class="car-box" v-for="(item,index) in list" :key="index"> <!-- 左侧复选框布局--> <div class="car-box-left"> <van-checkbox v-model="item.ckd"></van-checkbox> </div> <!-- 右侧商品卡片布局--> <div class="car-box-right"> <van-swipe-cell> <van-card :price="item.item.actualPrice" :title="item.item.dtitle" :thumb="item.item.mainPic" > <!-- 步进器--> <template #num> <van-stepper v-model="item.num" theme="round" button-size="22" disable-input @change="changeNum(item.num)"/> </template> </van-card> <!-- 右侧滑动删除--> <template #right> <van-button square text="删除" type="danger" class="delete-button" @click="del(index)"/> </template> </van-swipe-cell> </div> </div> <!-- 空状态 没数据显示 有数据隐藏--> <van-empty v-show="$store.state.cartList.length==0" class="custom-image" image="https://img.yzcdn.cn/vant/custom-empty-image.png" description="购物车是空的哟!" /> <!-- 商品导航--> <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, //购物车数据 } }, computed: { // 计算属性checkAll 和全选按钮双向数据绑定,别人可以控制它 它也可以控制别人 // 别人控制它 给他一个值的时候是 get , 它控制别人 给别人设置值的时候 是set // 在set中newVal参数是这个计算属性改变后的值 checkAll: { //可以看作一个事件 get() { // 判断购物车里商品的长度为0 return false if (this.list.length == 0) { return false } return this.$store.state.cartList.every(item => { return item.ckd == true // 返回结果复选框为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: [], // 购物车数据 }, 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, // 添加数量默认为1 item, // 添加购物车商品数据 ckd: false, // 添加复选框初始化状态为false }) } // console.log(state.cartList) }, // 删除商品 del(state, index) { state.cartList.splice(index, 1) // state. }, // 改变数量------加减综合法 !!! 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 => { // 如果复选框选中 计算总价 if (item.ckd == true) { sum += item.item.actualPrice * item.num } }) return sum } }, actions: {}, modules: {}, // Vuex存储插件 plugins: [ new VuexPersist({ storage: window.localStorage, }).plugin, ] })
关于vue.js组件的教程,请大家点击专题vue.js组件学习教程进行学习。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
vuex,购物车
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】
- 谭咏麟.2022-倾·听【环球】【WAV+CUE】
- 4complete《丛生》[320K/MP3][85.26MB]
- 4complete《丛生》[FLAC/分轨][218.01MB]