Vuex实现购物车小功能


Posted in Javascript onAugust 17, 2020

Vuex实现购物车功能(附:效果视频),供大家参考,具体内容如下

功能描述:

  • 加购
  • 删除
  • 加减
  • 全选反选
  • 选中计算总价
  • 存储

整体演示效果如下:

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组件学习教程进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery 1.2.x 升? 1.3.x 注意事项
May 06 Javascript
JQuery拖动表头边框线调整表格列宽效果代码
Sep 10 Javascript
JavaScript中使用Math.floor()方法对数字取整
Jun 15 Javascript
javascript实现给定半径求出圆的面积
Jun 26 Javascript
Javascript基于对象三大特性(封装性、继承性、多态性)
Jan 04 Javascript
js实现抽奖效果
Mar 27 Javascript
JavaScript变量类型以及变量作用域详解
Aug 14 Javascript
浅谈express 中间件机制及实现原理
Aug 31 Javascript
详解webpack4多入口、多页面项目构建案例
May 25 Javascript
微信小程序实现下拉菜单切换效果
Mar 30 Javascript
element-ui中dialog弹窗关闭按钮失效的解决
Sep 22 Javascript
原生JavaScript实现留言板
Jan 10 Javascript
jquery+ajax实现异步上传文件显示进度条
Aug 17 #jQuery
jQuery实现异步上传一个或多个文件
Aug 17 #jQuery
vue项目里面引用svg文件并给svg里面的元素赋值
Aug 17 #Javascript
vue动态加载SVG文件并修改节点数据的操作代码
Aug 17 #Javascript
Vue如何将页面导出成PDF文件
Aug 17 #Javascript
Vue实现腾讯云点播视频上传功能的实现代码
Aug 17 #Javascript
javascript实现贪吃蛇游戏(娱乐版)
Aug 17 #Javascript
You might like
PHP 危险函数全解析
2009/09/09 PHP
PHP设计模式之结构模式的深入解析
2013/06/13 PHP
php控制文件下载速度的方法
2015/03/24 PHP
php设计模式之策略模式应用案例详解
2019/06/17 PHP
在JavaScript中监听IME键盘输入事件
2011/05/29 Javascript
Javascript 面向对象(三)接口代码
2012/05/23 Javascript
JavaScript闭包函数访问外部变量的方法
2014/08/27 Javascript
JS实现图片产生波纹一样flash效果的方法
2015/02/27 Javascript
JavaScript返回网页中锚点数目的方法
2015/04/03 Javascript
详解JavaScript for循环中发送AJAX请求问题
2020/06/23 Javascript
探讨AngularJs中ui.route的简单应用
2016/11/16 Javascript
jQuery获取随机颜色的实例代码
2018/05/21 jQuery
基于Bootstrap和JQuery实现动态打开和关闭tab页的实例代码
2019/06/10 jQuery
Vue 2.0 侦听器 watch属性代码详解
2019/06/19 Javascript
在VUE中实现文件下载并判断状态的方法
2019/11/08 Javascript
vue 插槽简介及使用示例
2020/11/19 Vue.js
Linux(Redhat)安装python3.6虚拟环境(推荐)
2018/05/05 Python
python smtplib发送带附件邮件小程序
2018/05/22 Python
pip install urllib2不能安装的解决方法
2018/06/12 Python
python判断字符串或者集合是否为空的实例
2019/01/23 Python
Python利用heapq实现一个优先级队列的方法
2019/02/03 Python
python通过paramiko复制远程文件及文件目录到本地
2019/04/30 Python
python range实例用法分享
2020/02/06 Python
Python Selenium截图功能实现代码
2020/04/26 Python
canvas实现圆绘制的示例代码
2019/09/11 HTML / CSS
浅谈three.js中的needsUpdate的应用
2012/11/12 HTML / CSS
使用HTML5的Notification API制作web通知的教程
2015/05/08 HTML / CSS
canvas实现漂亮的下雨效果的示例
2018/04/18 HTML / CSS
东南亚排名第一的服务市场:kaodim
2019/03/28 全球购物
意大利奢侈品购物网站:Deliberti
2019/10/08 全球购物
Java里面StringBuilder和StringBuffer有什么区别
2016/06/06 面试题
Java如何读取CLOB字段
2013/10/10 面试题
开水果连锁店创业计划书
2013/12/29 职场文书
初三学生语文考试作弊检讨书
2014/12/14 职场文书
大学生求职自荐信
2015/03/24 职场文书
2015年“世界无车日”活动方案
2015/05/06 职场文书