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 相关文章推荐
JavaScript的面向对象(二)
Nov 09 Javascript
JQUERY dialog的用法详细解析
Dec 19 Javascript
jquery分页对象使用示例
Apr 01 Javascript
JS定义网页表单提交(submit)的方法
Mar 20 Javascript
js实现移动端轮播图效果
Dec 09 Javascript
webpack2.0配置postcss-loader的方法
Aug 17 Javascript
使用Fullpage插件快速开发整屏翻页的页面
Sep 13 Javascript
vue 之 .sync 修饰符示例详解
Apr 21 Javascript
Vue中使用ElementUI使用第三方图标库iconfont的示例
Oct 11 Javascript
Koa 使用小技巧(小结)
Oct 22 Javascript
jQuery实现的鼠标拖动画矩形框示例【可兼容IE8】
May 17 jQuery
JS数组及对象遍历方法代码汇总
Jun 16 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中获取系统信息的方法
2013/06/25 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
javascript RadioButtonList获取选中值
2009/04/09 Javascript
json格式化/压缩工具 Chrome插件扩展版
2010/05/25 Javascript
分享精心挑选的23款美轮美奂的jQuery 图片特效插件
2012/08/14 Javascript
jquery的冒泡事件的阻止与允许(三种实现方法)
2013/02/01 Javascript
文字溢出实现溢出的部分再放入一个新生成的div中具体代码
2013/05/17 Javascript
jquery组件使用中遇到的问题整理及解决
2014/02/21 Javascript
JS解析XML实例分析
2015/01/30 Javascript
Bootstrap CSS布局之代码
2016/12/17 Javascript
Javascript实现异步编程的过程
2018/06/18 Javascript
JavaScript事件冒泡机制原理实例解析
2020/01/14 Javascript
JavaScript经典案例之简易计算器
2020/08/24 Javascript
[16:21]教你分分钟做大人:圣堂刺客
2014/12/03 DOTA
python使用nntp读取新闻组内容的方法
2015/05/08 Python
Python中MySQLdb和torndb模块对MySQL的断连问题处理
2015/11/09 Python
Python 数据结构之队列的实现
2017/01/22 Python
Python使用re模块实现信息筛选的方法
2018/04/29 Python
Python学习_几种存取xls/xlsx文件的方法总结
2018/05/03 Python
Python走楼梯问题解决方法示例
2018/07/25 Python
Python语法分析之字符串格式化
2019/06/13 Python
给大家整理了19个pythonic的编程习惯(小结)
2019/09/25 Python
python使用建议技巧分享(三)
2020/08/18 Python
详解CSS的border边框属性及其在CSS3中的新特性
2016/05/10 HTML / CSS
小学生班会演讲稿
2014/01/09 职场文书
班主任工作经验材料
2014/02/02 职场文书
土地转让协议书
2014/04/15 职场文书
护理学专业求职信
2014/06/29 职场文书
英文演讲稿开场白
2014/08/25 职场文书
毕业实习计划书
2015/01/16 职场文书
老龙头导游词
2015/02/11 职场文书
罚款通知怎么写
2015/04/22 职场文书
2015年网管个人工作总结
2015/05/22 职场文书
电影小兵张嘎观后感
2015/06/03 职场文书
讲座新闻稿
2015/07/18 职场文书
Node.js实现爬取网站图片的示例代码
2022/04/04 NodeJs