由elemnent-ui模拟一个全选、反选效果想到的购物车逻辑案例

本文参考 https://blog.csdn.net/sumimg/article/details/137508302?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22137508302%22%2C%22source%22%3A%22sumimg%22%7D
我遇到的问题
在这里插入图片描述

点击店铺二级的时候,checkedCities的值已经在数组里面了 ,但是页面却没有更新
重新赋值,使用$set解决
在这里插入图片描述
数据类型
在这里插入图片描述

全部代码

<template>
    <div class="container">
        <div class="manageSearch" style="margin-top: 10px">
            <div class="yanchang" style="font-size: 12px;
    color: #555555;
    margin-bottom: 10px;">我的购物车</div>
        </div>
        <!-- :style="{ height: tableHeight + 'px' }" -->
        <div class="orderTable" ref="marsTable">
            <div class="shopCar">
                <div class="carTop">
                    <ul flex>
                        <li>
                            <div>
                                <el-checkbox :indeterminate="indeterminateAll" v-model="checkAll"
                                    @change="handleCheckAllChange">全选</el-checkbox>

                            </div>

                        </li>
                        <li style="margin-left: 111px;">
                            商品信息

                        </li>
                        <li style="margin-left: 300px;">
                            规格

                        </li>
                        <li style="margin-left: 110px;">
                            单价

                        </li>
                        <li style="margin-left: 141px;">
                            数量

                        </li>
                        <li style="margin-left: 150px;">
                            小计

                        </li>
                        <li style="margin-left: 116px;">

                            操作
                        </li>
                    </ul>
                </div>
                <div class="carBot">
                    <ul class="carBotUl">
                        <li class="carBotLi" v-for="(item, index) in shopcarList" :key="index">
                            <div class="dptitle">
                                <el-checkbox v-model="item.checkGroupStatus" :indeterminate="item.isIndeterminate"
                                    @change="(val) => handleCheckGroup(val, item, index)">
                                    <!-- {{ item.name }} -->
                                </el-checkbox>
                                <span style="font-size: 12px;color: #AAAAAA;margin-left: 20px;">店铺:</span>
                                <span style="font-size: 12px;color: #333;">
                                    {{ item.ShopName }}
                                </span>
                                <span style="color: #666666;">></span>
                            </div>
                            <div class="box1">



                                <ul class="box1Ul" flex="cross:center" v-for="(g, i) in item.Goods" :key="i">
                                    <li class="box1Li">
                                        
                                        <el-checkbox-group v-model="item.checkedCities"
                                            @change="(val) => handleCheckedCitiesChange(val, item, g)">
                                            <el-checkbox :key="i" :label="g">{{ }}</el-checkbox>
                                        </el-checkbox-group>

                                        


                                    </li>
                                    <li flex style="margin-left: 25px;">
                                        <div>
                                            <img style="width: 70px;height: 71px;" :src="g.Img" alt="">
                                        </div>
                                        <div style="margin-left: 8px;">
                                            <div style="width: 262px; font-size: 12px;color: #333333;"
                                                class="ellipsis-multiline">
                                                {{ g.Name }}</div>
                                            <div style="margin-top: 16px; width: 80px;height: 18px;border-radius: 2px;border: 1px solid #FAA07D;
                                            line-height: 18px;text-align: center;font-size: 12px;
color: #FAA07D;">48小时发货</div>
                                        </div>
                                    </li>
                                    <li style="width: 243px; font-size: 12px; text-align: center;
color: #333333;">
                                        颜色:{{ g.SubName }} 规格:{{ g.MainName }}
                                    </li>
                                    <li style="width: 120px; font-size: 12px;color: #E92927;text-align: center;">
                                        {{ g.Price }}
                                    </li>
                                    <li style="width: 200px; text-align: center;">
                                        <el-input-number v-model="g.Amount" :min="1" size="mini"
                                            label="描述文字"></el-input-number>
                                    </li>
                                    <li style="width: 174px; font-size: 12px;color: #333333; text-align: center;">
                                        {{ g.Price * g.Amount }}
                                    </li>
                                    <li @click="shanchuyige(g)"
                                        style="width: 100px; font-size: 12px;color: #999999; text-align: center;cursor: pointer;">
                                        删除
                                    </li>
                                </ul>



                            </div>
                        </li>
                    </ul>

                </div>
            </div>

        </div>
        <div class="jiesuanlan" flex="main:justify cross:center">
            <div flex="cross:center">
            
                <div @click="shanchuSingle()" style="margin-left: 20px; width: 99px;height: 28px;background: #FFFFFF;border-radius: 4px;border: 1px solid #DDDDDD;font-size: 12px;
color: #666666;line-height: 28px;text-align: center;cursor: pointer;">删除选中商品</div>
                <div @click="qingkongShop()" style="margin-left: 20px; width: 87px;height: 28px;background: #FFFFFF;border-radius: 4px;border: 1px solid #DDDDDD;font-size: 12px;
color: #666666;line-height: 28px;text-align: center;cursor: pointer;">清空购物车</div>
            </div>
            <div flex="cross:center">
                <span style="font-size: 14px;color: #666666;">应付总额(不含运费):</span>
                <span style="font-size: 18px;color: #DF3627;">{{ zongjia }}</span>
                <div @click="shouhuodizhi()" style="margin-left: 15px; width: 168px;height: 48px;background: #DF3627;border-radius: 4px;font-size: 16px;
color: #FFFFFF;line-height: 48px;text-align: center;cursor: pointer;">
                    去结算
                </div>
            </div>
        </div>

    </div>
</template>

<script>
import { VShoppingCartList, ShoppingCartDele } from '@/api/api'




export default {
    components: { },
    data() {
        return {
            form: {},
            
            compPama: {
                "pageSize": 15,
                "pageIndex": 1,
                "enablePager": true,
                strJson: {
                    UserInfo_ID: JSON.parse(localStorage.getItem('loginInfo')).Users.ID
                }
            },
            newForm: {
                name: ''
            },
            model: {},
            tableData: [],

            total: 0,
            
            tableHeight: 0,
            searchName: '',
            shopcarList: [],
            checkAll: false,
            indeterminateAll: false,
            testArr: [],
            zongjia: 0,
            


        };
    },
    computed: {},
    watch: {},
    methods: {
        shanchuyige(g) {
            this.$confirm('确定删除该商品?', '提示', {
                confirmButtonText: '确定',
                cancelButtonText: '取消',
                type: 'warning'
            }).then(() => {
                let params = {
                    "SysRow": g.SysRow
                }
                ShoppingCartDele(params).then(res => {
                    const { ReturnCode, Data } = res
                    if (ReturnCode == 200) {
                        this.$message.success('删除成功!');
                        this.getVShoppingCartList();
                    }
                })
            }).catch(() => {


            });
        },
        // 删除选中
        shanchuSingle() {

            this.$confirm('确定删除该商品?', '提示', {
                confirmButtonText: '确定',
                cancelButtonText: '取消',
                type: 'warning'
            }).then(() => {
                this.xuanzhong = []
                this.testArr.forEach((e, i) => {
                    e.Goods.forEach((m, j) => {

                        if (m.checked) {
                            this.xuanzhong.push(m.SysRow)
                        }
                    })
                })
                
                this.xuanzhong.forEach((e) => {
                    this.shanchu(e)
                })
                setTimeout(() => {
                    // 刷新列表
                    this.getVShoppingCartList();
                }, 500)


            }).catch(() => {


            });
            
        },
        shanchu(e) {
            let params = {
                "SysRow": e
            }
            ShoppingCartDele(params).then(res => {
                const { ReturnCode, Data } = res
                if (ReturnCode == 200) {
                    // this.$message.success('删除成功!');
                }
            })
        },
        // 清空购物车
        qingkongShop() {
            this.$confirm('确定清空购物车?', '提示', {
                confirmButtonText: '确定',
                cancelButtonText: '取消',
                type: 'warning'
            }).then(() => {
                this.xuanzhong = []
                this.testArr.forEach((e, i) => {
                    e.Goods.forEach((m, j) => {

                        
                        this.xuanzhong.push(m.SysRow)
                        
                    })
                })
                console.log(this.xuanzhong, '==this.xuanzhong');

                
                this.xuanzhong.forEach((e) => {
                    this.shanchu(e)
                })

                setTimeout(() => {
                    // 刷新列表
                    this.getVShoppingCartList();
                }, 500)

            }).catch(() => {


            });
        },
        handleCheckAllChange(val) {

            
            console.log(this.testArr, 'this.testArr==');
            if (this.checkAll) {
                this.testArr.forEach(group => {
                    group.checkedCities = group.Goods;
                    group.checkGroupStatus = true
                    group.Goods.forEach(k => k.checked = true)
                })
            } else {
                this.testArr.forEach(group => {
                    group.checkedCities = [];
                    group.checkGroupStatus = false
                    group.Goods.forEach(k => k.checked = false)
                })
            }


            this.zongjia = 0
            
            this.testArr.forEach((e, i) => {
                
                e.Goods.forEach((m, j) => {

                    if (m.checked) {
                        this.zongjia += (m.Price * m.Amount)
                    }
                })
                
            })
        },

        //勾选group的复选项选择当前组
        handleCheckGroup(val, group, index) {
            this.$forceUpdate()
            console.log(val, group, index, '二级');
            if (val) {
                console.log('001');
                let xiznhi = []
                group.Goods.forEach(ele => {
                    console.log(ele, '--ele=');
                    group.checkedCities.push(ele)
                    xiznhi.push(ele)

                })
                
                group.checkGroupStatus = true
                group.Goods.forEach(k => k.checked = true)

                
                this.$set(group, 'checkedCities', xiznhi)
                this.$set(this.shopcarList, index, Object.assign({}, group));
                this.$forceUpdate()

                // 算价格

                console.log('算价格1 ');
                this.zongjia = 0
                
                this.testArr.forEach((e, i) => {
                    
                    e.Goods.forEach((m, j) => {

                        if (m.checked) {
                            this.zongjia += (m.Price * m.Amount)
                        }
                    })
                    
                })
                console.log(this.testArr, '===this.testArr');


            } else {
                if (!val) {
                    console.log('002');
                    group.checkedCities = []
                    group.Goods.forEach(k => k.checked = false)
                    this.$forceUpdate()


                    console.log('算价格2 ');
                    this.zongjia = 0
                    
                    this.testArr.forEach((e, i) => {
                        
                        e.Goods.forEach((m, j) => {

                            if (m.checked) {
                                this.zongjia += (m.Price * m.Amount)
                            }
                        })
                        
                    })
                    console.log(this.testArr, '===this.testArr');
                }
            }

            //影响整体
            this.checkAllStatus()
            group.isIndeterminate = false;
            this.$forceUpdate()
        },
        handleCheckedCitiesChange(value, item, g) {
            console.log(value, item, g, 'value, item三级');
            
            item.checkGroupStatus = item.checkedCities.length === item.Goods.length ? true : false;
            item.isIndeterminate = item.checkedCities.length > 0 && item.checkedCities.length < item.Goods.length

            
            this.testArr.forEach((e, i) => {
                e.Goods.forEach((m, j) => {

                    if (m.SysRow == g.SysRow) {
                        m.checked ? m.checked = false : m.checked = true
                        this.$forceUpdate()
                    }

                })
            })
            
            //影响整体全选
            this.checkAllStatus()
            this.$forceUpdate()
            console.log('算价格 ');
            this.zongjia = 0
            // checkGroupStatus
            this.testArr.forEach((e, i) => {
                e.Goods.forEach((m, j) => {

                    if (m.checked) {
                        this.zongjia += (m.Price * m.Amount)
                    }
                })
            })
            console.log(this.testArr, '===this.testArr');
            console.log(this.zongjia, 'this.zongjia---');
        },

        checkAllStatus() {
            console.log(this.testArr, 'this.testArr---');
            
            let isAll = this.testArr.every(group => group.checkedCities.length == group.Goods.length) ? true : false;
            if (isAll) {
                console.log('003');
                this.checkAll = true
                this.indeterminateAll = false
            } else {
                console.log('004');

                this.checkAll = false
                this.indeterminateAll = true
            }
            this.$forceUpdate()
        },
        shouhuodizhi() {
            let testArr1 = JSON.stringify(this.testArr)
            let testArr = JSON.parse(testArr1)
            testArr.forEach((e, i) => {
                e.weiGoods = []
                e.Goods.forEach((m, j) => {

                    if (m.checked) {
                        // this.xuanzhong.push(m.SysRow)
                        e.weiGoods.push(m)
                    }
                })
            })
            console.log(testArr, 'testArr===');
            let jiesuanList = []
            testArr.forEach((e, i) => {
                if (e.weiGoods.length > 0) {
                    jiesuanList.push(e)
                }

            })

            jiesuanList.forEach((e, i) => {
                e.Goods = e.weiGoods

            })
            console.log(jiesuanList, '===--this.jiesuanList');
            if (jiesuanList.length < 0 || jiesuanList == 0) {
                this.$message.warning('请选择需要结算的商品')
                return
            }
            localStorage.removeItem('jiesuanList')

            this.$router.push({
                path: '/shouhuodizhi',
                query: {
                    shoppingList: JSON.stringify(jiesuanList)
                }
            })
            localStorage.setItem('jiesuanList', JSON.stringify(jiesuanList))

        },
       
       
        handleSizeChange(val) {

            this.compPama.pageSize = val;

            this.getSourcingList();
        },
        handleCurrentChange(val) {

            this.compPama.pageIndex = val;

            this.getSourcingList();
        },
        //查询
        selectBtn() {
            this.getSourcingList();
        },
        //清空
        emptyBtn() {
            this.form.Name = '';
            this.getSourcingList();
        },
        
        getVShoppingCartList() {
        
            let params = {
                "pageSize": 15,
                "pageIndex": 1,
                "enablePager": false,
                "strJson": {
                    "UserInfo": JSON.parse(localStorage.getItem('loginInfo')).Users.ID
                }
            }

            VShoppingCartList(params).then(res => {
                const { Data, ReturnCode } = res
                if (ReturnCode == 200) {
                    
                    console.log(Data, '---');
                    this.shopcarList = Data
                    // 首先填充值
                    this.shopcarList.forEach((e, i) => {
                        e.checkGroupStatus = false
                        e.isIndeterminate = false
                        e.checkedCities = []

                        e.Goods.forEach((m, j) => {
                            m.checked = false
                            
                        })
                        


                    })

                    this.testArr = this.shopcarList
                    
                }
            })
        },


    },
    created() {
        this.$nextTick(() => {
            var isMac = /macintosh|mac os x/i.test(navigator.userAgent);
            if (isMac) {
                //your code
                // 根据浏览器高度设置初始高度
                this.tableHeight = window.innerHeight - 370;
                // 监听浏览器高度变化,改变表格高度
                window.onresize = () => {
                    this.tableHeight = window.innerHeight - 370;
                };
            } else {
                // 根据浏览器高度设置初始高度
                this.tableHeight = window.innerHeight - 270;
                // 监听浏览器高度变化,改变表格高度
                window.onresize = () => {
                    this.tableHeight = window.innerHeight - 270;
                };
            }
        });




    },
    mounted() {
    
        this.getVShoppingCartList();


    },
    beforeCreate() { },
    beforeMount() { },
    beforeUpdate() { },
    updated() { },
    beforeDestroy() { },
    destroyed() { },
    activated() { }
};
</script>
<style lang="scss" scoped>
.shopCar {
    padding: 0 20px 20px;
    box-sizing: border-box;

    .carTop {
        height: 50px;
        border-bottom: 1px solid #EEEEEE;
        padding: 0 20px;
        box-sizing: border-box;
        line-height: 50px;

        ul {
            li {
                font-size: 14px;
                color: #333333;
            }
        }
    }

    .carBot {
        .carBotUl {
            .carBotLi {
                width: 100%;
                border-left: 1px solid #EDEDED;
                margin-bottom: 10px;

                .dptitle {
                    height: 34px;
                    line-height: 34px;
                    background: #F8F8F8;
                    padding: 0 20px;
                    box-sizing: border-box;
                }

                .box1 {
                    .box1Ul {
                        padding: 18px;
                        box-sizing: border-box;
                        border-bottom: 1px solid #EDEDED;
                        border-right: 1px solid #EDEDED;

                        .box1Li {}
                    }
                }

            }


        }

    }
}

.jiesuanlan {
    padding: 0 37px;
    box-sizing: border-box;
    width: 100%;
    margin-top: 10px;
    background: #fff;
    height: 80px;
    line-height: 80px;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/525802.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

wordpress子比主题打开文章详情页一直出现在首页的问题

遇到过几次这种情况了&#xff0c;不知是不是中了木马&#xff0c;无从下手&#xff0c;试了很多方法都不行快要疯了&#xff0c;之前试过解决不了只能重新安装&#xff0c;现在又出现了&#xff0c;第二次了&#xff0c;太麻烦了&#xff0c;突然无意中打开index.php文件发现被…

【频繁模式挖掘】FP-Tree算法(附Python实现)

一、实验内容简介 该实验主要使用频繁模式和关联规则进行数据挖掘&#xff0c;在已经使用过Apriori算法挖掘频繁模式后&#xff0c;这次使用FP-tree算法来编写和设计程序&#xff0c;依然使用不同规模的数据集来检验效果&#xff0c;最后分析和探讨实验结果&#xff0c;看其是…

AttributeError: module ‘cv2‘ has no attribute ‘xfeatures2d‘

新版本的cv2已经不支持这种写法 cv2.xfeatures2d.SIFT_create() 因为这个SIFT特征匹配算法已经专利授权&#xff0c;在开源的CV2中无法使用&#xff0c;当然新版本的cv2也有能够直接使用的SIFT函数 直接使用cv2.SIFT_create()

echarts实现饼图见渐变

数据中添加itemStyle,修改颜色为渐变色 option {tooltip: {show:false,trigger: item},legend: {top: 5%,left: center},series: [{name: Access From,type: pie,radius: [40%, 70%],avoidLabelOverlap: false,label: {show: false,position: center,color: red},emphasis: {…

酷开科技 |酷开系统全视频化升级,让电视回归视频属性

随着消费升级浪潮的兴起&#xff0c;家庭互联网这一概念也在资本的注入下&#xff0c;成为了新风口。酷开系统全视频化升级&#xff0c;让电视回归视频属性&#xff0c;酷开系统在之前瀑布流板块设计的基础上&#xff0c;增加了视频流图文融合的并行界面&#xff0c;同时酷开系…

七、Ajax(Django开发)

Ajax&#xff08;Django开发&#xff09; 知识点的回顾&#xff1a;1.Ajax请求2.订单小结3.图表4.关于文件上传4.1基本操作案例&#xff1a;批量上传数据案例&#xff1a;混合数据&#xff08;Form&#xff09;4.2启用media案例&#xff1a;混合数据&#xff08;form&#xff0…

探索 Java 网络爬虫:Jsoup、HtmlUnit 与 WebMagic 的比较分析

1、引言 在当今信息爆炸的时代&#xff0c;网络数据的获取和处理变得至关重要。对于 Java 开发者而言&#xff0c;掌握高效的网页抓取技术是提升数据处理能力的关键。本文将深入探讨三款广受欢迎的 Java 网页抓取工具&#xff1a;Jsoup、HtmlUnit 和 WebMagic&#xff0c;分析…

Jackson 各种注解使用示例

参考资料 Jackson使い方メモ 目录 一. JsonIgnore二. JsonIgnoreProperties三. JsonProperty3.1 作用于entity属性上&#xff0c;指定json对象属性名3.2 作用于entity方法上&#xff0c;指定json对象属性名 四. JsonFormat4.1 日期格式化4.2 数字格式化4.3 枚举类返回code 五.…

Cortex-M4架构

第一章 嵌入式系统概论 1.1 嵌入式系统概念 用于控制、监视或者辅助操作机器和设备的装置&#xff0c;是一种专用计算机系统。 更宽泛的定义&#xff1a;是在产品内部&#xff0c;具有特定功能的计算机系统。 1.2 嵌入式系统组成 硬件 ①处理器&#xff1a;CPU ②存储器…

JSBridge原理 - 前端H5与客户端Native交互

1. 概述&#xff1a; 在混合应用开发中&#xff0c;一种常见且成熟的技术方案是将原生应用与 WebView 结合&#xff0c;使得复杂的业务逻辑可以通过网页技术实现。实现这种类型的混合应用时&#xff0c;就需要解决H5与Native之间的双向通信。JSBridge 是一种在混合应用中实现 …

【r-tree算法】一篇文章讲透~

目录 一、引言 二、R-tree算法的基本原理 1 数据结构 2 插入操作 3 删除操作 4 查询操作 5 代码事例 三、R-tree算法的性能分析 1 时间复杂度 2 空间复杂度 3 影响因素 四、R-tree算法的变体和改进 1 R*-tree算法 2 X-tree算法 3 QR-tree算法 五、R-tree算法的…

前端| 富文本显示不全的解决方法

背景 前置条件&#xff1a;编辑器wangEditor vue项目 在pc端进行了富文本操作&#xff0c; 将word内容复制到编辑器中&#xff0c; 进行发布&#xff0c; pc端正常&#xff0c; 在手机端展示的时候 显示不全 分析 根据h5端编辑器内容的数据展示&#xff0c; 看到有一些样式造…

【任推邦新悟空网盘拉新】八款地推网推新项目,周期稳定,受众广!

现在地推网推新项目打得火热&#xff0c;尤其是夸克网盘&#xff0c;地推网推新流程其实很简单&#xff0c;简单来说就是就是给项目增加新用户&#xff0c;每邀请一个新用户注册&#xff0c;你就能得到收益&#xff0c;下面小推给大家整理了一份好推的项目&#xff0c;希望能够…

C++:类与对象(一)

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《C&#xff1a;类与对象&#xff08;一&#xff09;》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 文章目录 面向对象和面向过程的区别1.类的引入2.…

【java面试题-Redis篇-2024】

##java面试题大全 详细面试题-持续更新中-点击跳转 点赞、收藏、加关注 java基础面试题 ##java面试题大全1、什么是 Redis2、Redis 的数据结构类型3、Redis 为什么快4、什么是跳跃表5、什么是 I/O 多路复用6、什么是缓存击穿、缓存穿透、缓存雪崩7、什么是布隆过滤器8、热…

webpack5如何关闭全屏错误

1、找到vue.config.js 2、在上面的devServer里面添加如下&#xff1a; client: {overlay: false, // 禁用全局错误提示},

写出好代码的底层逻辑

写出好代码的底层逻辑 程序员安身立命的手艺就是写代码&#xff0c;可多少人知道如何才能写出好的代码呢&#xff1f;这几年也做过很多次的代码 CR&#xff0c;可好代码的标准在哪里呢&#xff1f;我们在做 CR 的时候&#xff0c;其实只是停留在代码的表面&#xff0c;主要是跟…

Godot插值、贝塞尔曲线和Astar寻路

一、插值 线性插值是采用一次多项式上进行的插值计算&#xff0c;任意给定两个值A和B&#xff0c;那么在A和B之间的任意值可以定义为&#xff1a;P(t) A * (1 - t) B * t&#xff0c;0 < t < 1。 数学中用于线性拟合&#xff0c;游戏应用可以做出跟随效果&#xff08;…

keycloak - 鉴权VUE

目录 一、前言 1、背景 2、实验版本 二、开始干活 1、keycloak配置 a、创建领域(realms) b、创建客户端 c、创建用户、角色 2、vue代码 a、依赖 b、main.js 三、未解决的问题 目录 一、前言 1、背景 2、实验版本 二、开始干活 1、keycloak配置 a、创建领域(r…

VMware Esxi安装群辉系统

群晖的网络存储产品具有强大的操作系统&#xff0c;提供了各种应用程序和服务&#xff0c;包括文件共享、数据备份、多媒体管理、远程访问等。用户可以通过简单直观的界面来管理他们的存储设备&#xff0c;并且可以根据自己的需求扩展设备的功能。总的来说&#xff0c;群晖的产…