vuex实现简单的购物车功能

 更新时间:2022年04月26日 16:59:24   作者:UIEngineer  
这篇文章主要为大家详细介绍了vuex实现简单的购物车功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了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 shoList from './shop-list'
import shopCart from './shop-cart'

export default {
  name: 'shop',
  components: {
      'shop-list' : shoList,
      'shop-cart' : shopCart
  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>

商品列表

<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" :key="item.id">
                <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 {mapGetters,mapActions} from "vuex";
export default {
    name : 'shopList',
    computed: {
        ...mapGetters({
                shopList:'getShopList',
            })
    },
    methods: {
        ...mapActions(['addToCart'])
    },
}
</script>

选中商品列表

<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" :key="item.id">
                <td>{{item.id}}</td>
                <td>{{item.name}}</td>
                <td>{{item.price}}</td>
                <td>{{item.num}}</td>
                <td><button class="shop-dele dele-btn" @click="deleteShop(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',
            deleteShop:"deletToShop"
        })
    }
}
</script>

vuex 创建

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

store.js

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中引入;

cart.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 => {
        // map()方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值
        return state.add.map(({ id, num }) => {
            let product = state.shop_list.find(n => n.id == id)// find()方法返回通过测试(函数内判断)的数组的第一个元素的值,如果没有符合条件的元素返回undefined
            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组件父子间通信详解(三)

    vue组件父子间通信详解(三)

    这篇文章主要为大家详细介绍了vue组件父子间通信的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • vue实现用户登录切换

    vue实现用户登录切换

    这篇文章主要为大家详细介绍了vue实现用户登录切换,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • Vue 简单实现前端权限控制的示例

    Vue 简单实现前端权限控制的示例

    这篇文章主要介绍了Vue 简单实现前端权限控制的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • vue.js input框之间赋值方法

    vue.js input框之间赋值方法

    今天小编就为大家分享一篇vue.js input框之间赋值方法具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • vue循环数组改变点击文字的颜色

    vue循环数组改变点击文字的颜色

    这篇文章主要为大家详细介绍了vue循环数组改变点击文字的颜色,非常实用的切换效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • vue antd Form表单的使用及说明

    vue antd Form表单的使用及说明

    这篇文章主要介绍了vue antd Form表单的使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • vant 时间选择器--开始时间和结束时间实例

    vant 时间选择器--开始时间和结束时间实例

    这篇文章主要介绍了vant 时间选择器--开始时间和结束时间实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • 关于vue v-for循环解决img标签的src动态绑定问题

    关于vue v-for循环解决img标签的src动态绑定问题

    今天小编就为大家分享一篇关于vue v-for循环解决img标签的src动态绑定问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • vue中radio单选框如何实现取消选中状态问题

    vue中radio单选框如何实现取消选中状态问题

    这篇文章主要介绍了vue中radio单选框如何实现取消选中状态问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • 解决vue多层弹框时存在遮挡问题

    解决vue多层弹框时存在遮挡问题

    本文给大家介绍vue多层弹框时存在遮挡问题,解决思路首先想到的是找到对应的遮挡层的css标签,然后修改z-index值,但是本思路只能解决首次问题,再次打开还会存在相同的问题,故该思路错误,下面给大家带来一种正确的思路,一起看看吧
    2022-03-03

最新评论