vuex实现的简单购物车功能示例


Posted in Javascript onFebruary 13, 2019

本文实例讲述了vuex实现的简单购物车功能。分享给大家供大家参考,具体如下:

购物车组件

<template>
  <div>
    <h1>vuex-shopCart</h1>
    <div class="shop-listbox">
      <shop-list/>
    </div>
    <h2>已选商品</h2>
    <div class="shop-cartbox">
      <shop-cart/>
    </div>
  </div>
</template>
<script>
  import shopList from "./shop-list";
  import shopCart from './shop-cart';
  export default{
    name:'shop',
    components:{
      'shop-list':shopList,
      'shop-cart':shopCart
    }
  }
</script>

商品列表

<template>
  <div class="shop-list">
    <table>
      <tr class="shop-listtitle">
        <td>id</td>
        <td>名称</td>
        <td>价格</td>
        <td>操作</td>
      </tr>
      <tr v-for="item in shopList" class="shop-listinfo">
        <td>{{item.id}}</td>
        <td>{{item.name}}</td>
        <td>{{item.price}}</td>
        <td><button @click="addToCart(item)">加入购物车</button></td>
      </tr>
    </table>
  </div>
</template>
<script>
  import{mapActions} from "vuex";
  export default{
    name:'shopList',
    data(){
      return{
      }
    },
    computed:{
      shopList(){
        return this.$store.getters.getShopList
      }
    },
    methods:{
      ...mapActions(['addToCart'])
    }
  }
</script>
<style lang="less" scoped>
  @import url('../../static/public.less');
</style>

选中商品列表

<template>
  <div class="shop-list">
    <table>
      <tr class="shop-listtitle">
        <td>id</td>
        <td>名称</td>
        <td>价格</td>
        <td>数量</td>
        <td>操作</td>
      </tr>
      <tr v-for="item in cartData" class="shop-listinfo">
        <td>{{item.id}}</td>
        <td>{{item.name}}</td>
        <td>{{item.price}}</td>
        <td>{{item.num}}</td>
        <td><button class="shop-dele dele-btn" @click="deletShop(item)">删除</button></td>
      </tr>
      <tr v-if="cartData.length<=0">
        <td colspan="5">暂无数据</td>
      </tr>
      <tr>
        <td colspan="2">总数:{{totalNum}}</td>
        <td colspan="2">总价格:{{totalPrice}}</td>
        <td><button class="dele-cart dele-btn" @click="clearCart">清空购物车</button></td>
      </tr>
    </table>
  </div>
</template>
<script>
  import {mapGetters,mapActions} from "vuex";
  export default{
    name:'shopCart',
    data(){
      return{
      }
    },
    computed:{
      ...mapGetters({
        cartData:'addShopList',
        totalNum:'totalNum',
        totalPrice:'totalPrice'
      })
    },
    methods:{
      ...mapActions({
        clearCart:'clearToCart',
        deletShop:'deletToShop'
      })
    }
  }
</script>
<style lang="less" scoped>
  @import url('../../static/public.less');
  .dele-btn{
    background-color: red !important;
  }
  .dele-btn:hover{
    background-color: #bd0000 !important;
  }
</style>

vuex 创建

npm install vuex --save,创建vuex文件夹,在文件夹中创建store.js,引入vuex;

import Vue from "vue";
import Vuex from 'vuex';
import cart from "./modules/cart";
Vue.use(Vuex);
export default new Vuex.Store({
  modules:{
    cart
  }
})

建立一个模块文件夹modules,里面创建创建当个store模块,然后默认输出,在store.js中引入;

const state = {
  shop_list: [{
    id: 11,
    name: '鱼香肉丝',
    price: 12,
  }, {
    id: 22,
    name: '宫保鸡丁',
    price: 14
  }, {
    id: 34,
    name: '土豆丝',
    price: 10
  }, {
    id: 47,
    name: '米饭',
    price: 2
  },{
    id: 49,
    name: '蚂蚁上树',
    price: 13
  },
  {
    id: 50,
    name: '腊肉炒蒜薹',
    price: 15
  }],
  add:[]
}
const getters ={
  //获取商品列表
  getShopList:state => state.shop_list,
  //获取购物车列表
  addShopList:state => {
    return state.add.map(({id,num})=>{
      let product = state.shop_list.find(n => n.id == id);
      if(product){
        return{
          ...product,
          num
        }
      }
    })
  },
  //获取总数量
  totalNum:(state,getters) =>{
    let total =0;
    getters.addShopList.map(n=>{
      total += n.num;
    })
    return total;
  },
  //计算总价格
  totalPrice:(state,getters)=>{
    let total=0;
    getters.addShopList.map(n=>{
      total += n.num*n.price
    })
    return total;
  },
}
const actions={
  //加入购物车
  addToCart({commit},product){
    commit('addCart',{
      id:product.id
    })
  },
  //清空购物车
  clearToCart({commit}){
    commit('clearCart')
  },
  //删除单个物品
  deletToShop({commit},product){
    commit('deletShop',product)
  }
}
const mutations ={
  //加入购物车
  addCart(state,{id}){
    let record = state.add.find(n => n.id == id);
    if(!record){
      state.add.push({
        id,
        num:1
      })
    }else{
      record.num++;
    }
  },
  //删除单个物品
  deletShop(state,product){
    state.add.forEach((item,i)=>{
      if(item.id == product.id){
        state.add.splice(i,1)
      }
    })
  },
  //清空购物车
  clearCart(state){
    state.add=[];
  }
}
export default{
  state,
  getters,
  actions,
  mutations
}

希望本文所述对大家vue.js程序设计有所帮助。

Javascript 相关文章推荐
Eval and new funciton not the same thing
Dec 27 Javascript
jquery重复提交请求的原因浅析
May 23 Javascript
微信内置浏览器私有接口WeixinJSBridge介绍
May 25 Javascript
javascript学习总结之js使用技巧
Sep 02 Javascript
Bootstrap每天必学之前端开发框架
Nov 19 Javascript
jQuery easyui刷新当前tabs的方法
Sep 23 Javascript
video.js使用改变ui过程
Mar 05 Javascript
vue-hook-form使用详解
Apr 07 Javascript
大转盘抽奖小程序版 转盘抽奖网页版
Apr 16 Javascript
微信小程序实现渐入渐出动画效果
Jun 13 Javascript
layui实现tab的添加拒绝重复的方法
Sep 04 Javascript
微信小程序云函数添加数据到数据库的方法
Mar 04 Javascript
jquery无缝图片轮播组件封装
Nov 25 #jQuery
Vue中多个元素、组件的过渡及列表过渡的方法示例
Feb 13 #Javascript
vue写h5页面的方法总结
Feb 12 #Javascript
如何将百度地图包装成Vue的组件的方法步骤
Feb 12 #Javascript
微信小程序websocket聊天室的实现示例代码
Feb 12 #Javascript
深入探讨JavaScript的最基本部分之执行上下文
Feb 12 #Javascript
图文详解vue框架安装步骤
Feb 12 #Javascript
You might like
让PHP更快的提供文件下载的代码
2012/06/13 PHP
简单的php缓存类分享     php缓存机制
2014/01/22 PHP
php中使用Ajax时出现Error(c00ce56e)的详细解决方案
2014/11/03 PHP
PHP响应post请求上传文件的方法
2015/12/17 PHP
编写PHP程序检查字符串中的中文字符个数的实例分享
2016/03/17 PHP
php通过文件头判断格式的方法
2016/05/28 PHP
PHP设计模式之状态模式定义与用法详解
2018/04/02 PHP
jQuery ajax dataType值为text json探索分享
2013/09/23 Javascript
JavaScript四种调用模式和this示例介绍
2014/01/02 Javascript
jQuery实现表格展开与折叠的方法
2015/05/04 Javascript
ECMAScript6函数默认参数
2015/06/12 Javascript
AngularJS中的Directive自定义一个表格
2016/01/25 Javascript
JavaScript的ExtJS框架中表格的编写教程
2016/05/21 Javascript
Angular利用trackBy提升性能的方法
2018/01/26 Javascript
使用vue-aplayer插件时出现的问题的解决
2018/03/02 Javascript
解决qrcode.js生成二维码时必须定义一个空div的问题
2020/07/09 Javascript
AJAX XMLHttpRequest对象创建使用详解
2020/08/20 Javascript
[01:20]DOTA2 2017国际邀请赛冠军之路无止竞
2017/06/19 DOTA
从零学Python之hello world
2014/05/21 Python
Python学习笔记之常用函数及说明
2014/05/23 Python
python中format()函数的简单使用教程
2018/03/14 Python
Python实现base64编码的图片保存到本地功能示例
2018/06/22 Python
Python线程池模块ThreadPoolExecutor用法分析
2018/12/28 Python
python openpyxl使用方法详解
2019/07/18 Python
pycharm 安装JPype的教程
2019/08/08 Python
django2.2安装错误最全的解决方案(小结)
2019/09/24 Python
关于Flask项目无法使用公网IP访问的解决方式
2019/11/19 Python
python有序查找算法 二分法实例解析
2020/02/18 Python
PySide2出现“ImportError: DLL load failed: 找不到指定的模块”的问题及解决方法
2020/06/10 Python
手工制作的音乐盒:Music Box Attic
2019/09/05 全球购物
写一个在SQL Server创建表的SQL语句
2012/03/10 面试题
倡议书范文格式
2014/05/12 职场文书
党员查摆四风问题思想汇报
2014/10/25 职场文书
公务员年度考核评语
2014/12/31 职场文书
党小组考察意见
2015/06/02 职场文书
python如何利用cv2.rectangle()绘制矩形框
2022/12/24 Python