vue 购物车逻辑

这是一个关于Vue.js实现的购物车组件代码示例。组件包括输入框、复选框、加减按钮以及总价和数量的计算。通过v-for遍历商品列表,实现了商品的选择、数量增减以及总价和总数量的实时更新。同时,提供了全选和全不选的功能。
摘要由CSDN通过智能技术生成

<template>
    <view class="">
        <view class="" style="margin-top: 20px; border: solid 1px #c2bcff; width: 90%;
        margin-left: 50%;transform: translateX(-50%);">
            <input type="text" value="" v-model="input" />
        </view>
        <view class="inP" v-for="(item,index) in search" :key="index">
            <!-- <label>
                <checkbox :value="checkBOx" @click="check(index)"/><text></text>
            </label> -->
            <view class="onc " :class="{'check':item.select}" @click="select(item,index)">
                <!--  -->
                <!-- check -->

            </view>
            <text style="margin-left: 20rpx;">{{item.name}}</text>
            <view class="" style="margin-left: 20rpx;display: flex; align-items: center;">
                <button type="default" @click="KE(index)" :disabled="item.value <= 0">-</button>
                <text>{{item.value}}</text>
                <button @click="addNum(index)">+</button>
            </view>
            <view class="" style="margin-left: 20rpx ;">
                <text>{{item.prise | prisf(1) }}</text>
            </view>
            <view class="" style="margin-left: 20rpx ;">
                <text>{{item.value*item.prise | prisf(2) }}</text>
            </view>
        </view>
        <view class="" style="display: flex;">
            <view class="onc" style="margin-left: 40rpx;margin-top: 10rpx" @click="isPro(isSelectAll)"
                :class="{'check':isSelectAll}">

            </view>
            <text style="margin-left: 20rpx;">全选</text>
        </view>

        <view class="" style="margin-left:35rpx;margin-top: 10rpx">
            <text>总数量{{total}}件</text>
        </view>
        <view class="" style="margin-left:35rpx; margin-top: 10rpx">
            <text>总价格{{toprise | prisf(2)}}</text>
        </view>

        <view class="" style="margin-left:35rpx; margin-top: 10rpx ;display: flex;">
            <!-- <text>选中的{{getTotal.totalPrice | prisf(2)}}</text> -->
            <text>选中的{{ sumc | prisf(2)}}</text>
            <!-- <text style="margin-left: 20px;">选中{{getTotal.totalNum}}件商品</text> -->
            <text style="margin-left: 20px;">选中{{conut}}件商品</text>
        </view>

    </view>
</template>

<script>
    export default {
        data() {
            return {
                conut: 0,
                sumc: 0,
                input: '', //
                checkBOx: '',
                carNum: '',
                items: [{
                        id: 1,
                        name: "桃子",
                        prise: 22.55,
                        value: 1,
                        sum: '',

                    },
                    {
                        id: 2,
                        name: "粒子",
                        prise: 10.11,
                        value: 1,
                        sum: '',

                    },
                    {
                        id: 3,
                        name: "栗子",
                        prise: 15.09,
                        value: 1,
                        sum: '',

                    },
                ],
            }
        },

        // 过滤器
        filters: {
            // 局部
            prisf(data, n) {
                // 添加人民币符号以及2位小数点
                return '¥' + data.toFixed(n)
            }
        },

        mounted() {

            // 初始化选中
            this.items.forEach((item) => {
                // 让每一个item都增加一个属性为select 并且为 true 
                // $set item为设置的每一项 ,'select'为增加的属性,true为增加的值,
                this.$set(item, 'select', true)
            })

            this.sum();
        },

        // vue计算属性
        computed: {


            isSelectAll() {
                // 对items列表里面的select做判断,若全为真返回1,若有一项为假返回0
                return this.items.every(function(val) {
                    return val.select
                })
            },

            getTotal() {
                console.log(123);
                // 筛选被选中的商品    
                var _product = this.items.filter(function(val) {
                        return
                        val.select
                    }),
                    totalPrice = 0,
                    totalNum = 0
                _product.forEach((item) => {
                    console.log(item);
                    totalNum += item.value
                    totalPrice += item.value * item.prise
                })
                return {
                    totalNum,
                    totalPrice
                }

            },
            // 计算总数量
            total() {
                // var n = 0;
                // this.items.forEach(function(item){
                //     n+=item.value
                // });
                // return n;

                // reduce 累加器
                // total 计算结束后的返回值,cur 为当前值,为初始化
                return this.items.reduce((total, cur) => total + cur.value, 0);
            },

            toprise() {
                // 总价格为数量乘以价格,cur.value*cur.prise
                return this.items.reduce((total, cur) => total + cur.value * cur.prise, 0);
            },

            search() {
                // 模糊查询
                // includes 判断里面指定的值是否为真,有返回为真,无返回0
                return this.items.filter(item => item.name.includes(this.input));
            },

            checkIN() {

            }

        },

        onLoad() {},

        methods: {

            sum: function() {
                var sum = 0;
                var conut = 0;
                this.items.forEach((item, index) => { //3 
                    // console.log(item);
                    if (item.select) {
                        conut += item.value;
                        sum += item.prise * item.value;
                    }
                })
                this.sumc = sum;
                this.conut = conut;
            },

            select: function(item, index) {
                item.select = !item.select;
                this.sum(index);
            },

            // 全选操作
            isPro(isSelectAll) {
                this.items.forEach((item) => {
                    item.select = !isSelectAll
                })
                this.sum();
            },


            KE(index) {
                this.items[index].value--;
                this.sum();
            },

            addNum(index) {
                this.items[index].value++;
                this.sum();
            },

        }
    }
</script>

<style>
    .onc {
        width: 30rpx;
        height: 30rpx;
        border: solid 1px #007AFF;
        margin-top: 3px;
    }

    .check {
        background-color: #007AFF;
    }

    .inP {
        width: 90%;
        margin-left: 50%;
        transform: translateX(-50%);
        padding: 20rpx;
        display: flex;
        align-items: center;
    }
</style>
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值