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

作者:东边的小山 时间:2024-05-08 10:43:19 

本文实例讲述了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程序设计有所帮助。

来源:https://blog.csdn.net/yelin042/article/details/80216821

标签:vuex,购物车
0
投稿

猜你喜欢

  • 模仿PHP写的ASP分页函数

    2008-04-13 06:11:00
  • Python实现二维数组输出为图片

    2022-10-07 21:49:55
  • 非集成环境的php运行环境(Apache配置、Mysql)搭建安装图文教程

    2023-07-21 16:21:41
  • linux 后台日志 mysql 错误异常的解释(推荐)

    2024-01-26 06:01:42
  • 以实例全面讲解PHP中多进程编程的相关函数的使用

    2023-10-18 12:21:55
  • python 使用值来排序一个字典的方法

    2022-02-05 00:25:05
  • np.hstack()和np.dstack()的使用

    2021-02-03 12:52:15
  • Python中torch.norm()用法解析

    2021-12-01 09:42:43
  • Javascript学习第一季 二

    2008-06-24 18:20:00
  • 详解Go语言中make和new的区别

    2024-04-27 15:37:11
  • kali最新国内更新源sources

    2022-03-25 02:53:37
  • python用Pygal如何生成漂亮的SVG图像详解

    2022-12-12 21:45:22
  • 深入了解Go语言中web框架的中间件运行机制

    2024-04-26 17:24:33
  • 用Python实现一个模仿UP主弹幕控制的直播间功能

    2023-02-24 18:13:27
  • python global关键字的用法详解

    2023-12-30 03:32:02
  • SQL Server 置疑、可疑、正在恢复等情况分析

    2012-01-05 18:51:59
  • golang grpc配置使用实战

    2024-02-06 01:17:09
  • 分享PHP header函数使用教程

    2023-09-04 12:07:14
  • js禁止Backspace键使浏览器后退的实现方法

    2024-04-17 09:54:05
  • php 不能连接数据库 php error Can't connect to local MySQL server

    2023-11-07 10:43:50
  • asp之家 网络编程 m.aspxhome.com