11、微信小程序——购物车

这篇具有很好参考价值的文章主要介绍了11、微信小程序——购物车。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1、代码分析

1.1  dom结构分析

1.2  全选控制反选

1.3  反选控制全选

1.4、计算总价

1.4 加、减

2、效果、代码演示 

11、微信小程序——购物车

1、代码分析

1.1  dom结构分析

购物车的组件结构主要由两部分组成:多选框部分( checkbox-group ) + 全选框部分( view )

11、微信小程序——购物车

1.2  全选控制反选

业务逻辑:

1、全选框(选中)——》 多选框(选中)、全选框(不选中)——》 多选框(不选中)

2、令复选框跟随全选框的状态变化——遍历数据,设置每条数据的 isChecked 状态

注意:因为无法直接操作数据,所以需要先行拷贝数据,再对其进行遍历(在本项目中,所有需要对数据进行遍历、筛选操作的步骤,都需要先拷贝数据)

 allChecked(e){
        console.log(e);  //触发点击事件,拿到全选框的事件源对象
        // 全选框: 状态为 true时,令其为 false,当状态为 false时,令其状态变为 true
        if(this.data.isAllChecked){
        // 遍历数据,令复选框的状态跟随全选框变化
        // 拷贝数据、遍历数据
        let goodslist=JSON.parse(JSON.stringify(this.data.goods))
        goodslist.forEach(item=>item.isChecked=false)
            this.setData({
                isAllChecked:false,
                goods:goodslist  //重新渲染
            })
        }else{
            let goodslist=JSON.parse(JSON.stringify(this.data.goods))
            goodslist.forEach(item=>item.isChecked=true)
            this.setData({
                isAllChecked:true,
                goods:goodslist
            })
        }
    },

1.3  反选控制全选

业务逻辑:

1、多选框(全部选中)——》全选框(选中)

因为复选框有多个,全选框只有一个,所以多选框控制全选框被选中的前提是确定每一个多选框都被选中了  ,打印复选框的事件源对象,发现复选框有一 detail.value 属性,可显示 复选框为 true 的对象 / 数量。所以当 e.detail.value.length===this.data.goods.length 时,表示复选框都被选中了

11、微信小程序——购物车

 2、多选框(有一不选中)——》全选框(不选中)

遍历数据( forEach ) 并 检查元素 ( includes ),如果 e.detail.value 中包含 数据id,则令该复选框的 isChecked=true,否则为 false

 // 单选控制全选
    changeCound(e) {
        console.log(e);
        let checkedArr = e.detail.value
        if (checkedArr.length == this.data.goods.length) {
            let goodsList = JSON.parse(JSON.stringify(this.data.goods))
            goodsList.forEach(item => item.isChecked = true)
            this.setData({
                isAllChecked: true,
                goods: goodsList
            })
        } else {
            let goodsList = JSON.parse(JSON.stringify(this.data.goods))
            goodsList.forEach(item => {
                if (checkedArr.includes(item.id)) {
                    item.isChecked = true
                } else {
                    item.isChecked = false
                }
            })
            this.setData({
                isAllChecked: false,
                goods: goodsList
            })
        }
    },

1.4、计算总价

通常用 reduce 来计算总价,其中 total 表示旧值,item表示新值,0为初始值

. reduce( ( total , item ) => { } , 0 )

 // 计算总价
    computedTotalPrice() {
        let totalPrice = this.data.goods.reduce((total, item) => {
            if (item.isChecked) {
                return total + item.num * item.price
            } else {
                return total
            }
        }, 0)
        this.setData({
            totalPrice: totalPrice
        })
    },

1.4 加、减

11、微信小程序——购物车

 // 加、减、删除
    handle: function (e) {
        let id = e.currentTarget.dataset.id
        console.log(id);
        var index = e.currentTarget.dataset.index
        var val = `goods[${index}].num`  //对数据对象 goods 中的 num 属性进行修改
        let oldnum = this.data.goods.find(item => item.id == id).num //查找
        console.log(oldnum);
        // 减
        if (e.currentTarget.dataset.name == "mulse") {
            let newNum = oldnum - 1
            if (newNum > 0) {
                this.setData({
                    [val]: newNum
                })
            }else if(newNum == 0){
                let goodsList = JSON.parse(JSON.stringify(this.data.goods))
                let newGoodList=goodsList.filter(item=>item.id!==id)
                this.setData({
                    goods:newGoodList
                })
            }
            // 加
        }else if(e.currentTarget.dataset.name=="add"){
            let newnum=++oldnum
            this.setData({
                [val]:newnum
            })
        }  
          // 删除
         else if (e.currentTarget.dataset.name == "del") {
              let goodslist = JSON.parse(JSON.stringify(this.data.lists))
              let newLists = goodslist.filter(item => item.id !== id)
              this.setData({
                  lists: newLists
              })
          }
        this.computedTotalPrice()
    }
})

2、代码演示 

 index.wxml:

<checkbox-group bindchange="changeCound" class="top">
    <view wx:for="{{goods}}" wx:key="id" class="checkbox">
        <view class="chleft">
            <checkbox value="{{item.id}}" checked="{{item.isChecked}}" class="cleft"></checkbox>
            <image src="{{item.imgUrl}}" mode="" class="pic" />
        </view>
        <view class="Box">
            <view class="box-left">
                <text class="name">{{item.name}}</text>
                <text class="price">¥{{item.price}}</text>
            </view>
            <view class="box-right">
                <text bindtap="handle" data-id="{{item.id}}" data-name="mulse" data-index="{{index}}">-</text>
                <text>{{item.num}}</text>
                <text bindtap="handle" data-id="{{item.id}}" data-name="add" data-index="{{index}}">+</text>
                <text bindtap="handle" class="del">x</text>
            </view>
        </view>
    </view>
</checkbox-group>
<view class="bottom">
    <view class="bottom-box" bindtap="allChecked">
        <label>
            <checkbox value="" checked="{{isAllChecked}}" />
            <text>全选</text>
        </label>
    </view>
    <view class="total">
        {{totalPrice}} 元
    </view>
</view>

index.scss

.top {
    height:90vh;
    overflow: auto;
    .checkbox {
        position: relative;
        width: 100vw;
        height: 100px;
        border: 1px solid #eee;
        display: flex;
        flex-direction: row;
        .chleft{
            display: flex;
            flex-direction: row;
            align-content: center;
            width: 41%;
            .cleft {
                margin-left: 10px;
                margin-right: 10px;
                line-height: 100px;
            }
            .pic {
                width:80px;
                height: 80px;
                margin-top: 10px;
                object-fit: cover;
            }
        }
        .Box{
            width: 59%;
            height: 100%;
            background-color: #fff;
            .box-left{
                position: relative;
                width: 100%;
                height: 50%;
                text{
                    position: relative;
                    width:50px;
                    height: 20px;
                    margin-left: 10px;
                }
                .name{
                    position: absolute;
                    top:20rpx;
                    left:5rpx;
                }
                .price{
                    position: absolute;
                    top:20rpx;
                    right:5rpx;
                    text-align: left;
                }
            }
            .box-right{
                position: relative;
                margin-top: 17px;
                >text{
                    width: 20px;
                    margin-left: 10px;
                    font-weight: bolder;
                }
                .del{
                    position: absolute;
                    top:-2px;
                    right: 10px;
                    margin-left: 100px;
                }
            }
        }
    }
}
.bottom{
    position: fixed;
    bottom: 0;
    left:0;
    width: 100%;
    height: 11vh;
    box-shadow: 5px 5px 5px 5px rgb(204, 204, 204);
    line-height: 11vh;
    display: flex;
    flex-direction: row;
    .bottom-box{
        width: 50%;
        margin-left: 10px;
    }
    .total{
        width: 50%;
        text-align: right;
        padding-right: 15px;
    }
}

index.js文章来源地址https://www.toymoban.com/news/detail-430843.html

Page({
    data: {
        goods: [
            {
                id: '1',
                name: '黄桃',
                num: 10,
                price: 10,
                isChecked: false,
                imgUrl: '/images/HT.jpg'
            },
            {
                id: '2',
                name: '西瓜',
                num: 20,
                price: 8,
                isChecked: true,
                imgUrl: '/images/XG.jpg'
            },
            {
                id: '3',
                name: '猕猴桃',
                num: 6,
                price: 12,
                isChecked: false,
                imgUrl: '/images/MHT.jpg'
            }
        ],
        isAllChecked: false,
        totalPrice: 0
    },
    onLoad() {
        this.computedTotalPrice()
    },
    // 单选控制全选
    changeCound(e) {
        console.log(e);
        let checkedArr = e.detail.value
        if (checkedArr.length == this.data.goods.length) {
            let goodsList = JSON.parse(JSON.stringify(this.data.goods))
            goodsList.forEach(item => item.isChecked = true)
            this.setData({
                isAllChecked: true,
                goods: goodsList
            })
        } else {
            let goodsList = JSON.parse(JSON.stringify(this.data.goods))
            goodsList.forEach(item => {
                if (checkedArr.includes(item.id)) {
                    item.isChecked = true
                } else {
                    item.isChecked = false
                }
            })
            this.setData({
                isAllChecked: false,
                goods: goodsList
            })
        }
        this.computedTotalPrice()

    },
    // 全选控制单选
    allChecked(e) {
        if (this.data.isAllChecked) {
            let goodsList = JSON.parse(JSON.stringify(this.data.goods))
            goodsList.forEach(item => item.isChecked = false)  //这里是赋值
            this.setData({
                isAllChecked: false,
                goods: goodsList
            })
        } else {
            let goodsList = JSON.parse(JSON.stringify(this.data.goods))
            goodsList.forEach(item => item.isChecked = true)  //这里是赋值
            this.setData({
                isAllChecked: true,
                goods: goodsList
            })
        }
        this.computedTotalPrice()
    },

    // 计算总价
    computedTotalPrice() {
        let totalPrice = this.data.goods.reduce((total, item) => {
            if (item.isChecked) {
                return total + item.num * item.price
            } else {
                return total
            }
        }, 0)
        this.setData({
            totalPrice: totalPrice
        })
    },

    // 加、减、删除
    handle: function (e) {
        let id = e.currentTarget.dataset.id
        console.log(id);
        var index = e.currentTarget.dataset.index
        var val = `goods[${index}].num`
        let oldnum = this.data.goods.find(item => item.id == id).num
        console.log(oldnum);
        if (e.currentTarget.dataset.name == "mulse") {
            let newNum = oldnum - 1
            if (newNum > 0) {
                this.setData({
                    [val]: newNum
                })
            }else if(newNum == 0){
                let goodsList = JSON.parse(JSON.stringify(this.data.goods))
                let newGoodList=goodsList.filter(item=>item.id!==id)
                this.setData({
                    goods:newGoodList
                })
            }
        }else if(e.currentTarget.dataset.name=="add"){
            let newnum=++oldnum
            this.setData({
                [val]:newnum
            })
        }
        this.computedTotalPrice()
    }
})

到了这里,关于11、微信小程序——购物车的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序实现商品加入购物车案例

    思考: 购物车中的数据保存在哪里?用哪种数据结构进行保存? 小程序中可能有多个页面需要对购物车中的数据进行操作,因此我们想到把数据存到全局中。可以使用 wx.setStorageSync() 储存,用 wx.getStorageSync() 进行获取,以数组格式方便对数据进行操作。 一、商品加入购物车

    2024年02月10日
    浏览(51)
  • 微信小程序商城开发-商品详情页跳转购物车

    微信小程序商城开发中商品详情页中购物车页面的跳转(仅限于tabbar页面的跳转)   点击商品详情页中的购物车图标跳转不到tabbar及导航栏中的购物车页面,总是报错 微信小程序开发需要跳转tabbar页面的话,有固定的跳转方式,不是开发中所有的跳转方式都适用于tabbar跳转

    2024年02月17日
    浏览(59)
  • 【微信小程序】-- uni-app 项目-- 购物车 -- 首页 - 轮播图效果(五十二)

    💌 所属专栏:【微信小程序开发教程】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信 😘 😘 😘   大家好,又见面了,

    2023年04月18日
    浏览(77)
  • 微信电商小程序购买/加入购物车组件设计

    作为一名常常摆烂,一蹶不振的大学生,最近接到了开发电商小程序的小任务,既然是电商,总得有购买加车功能吧?经过n个坤年的拜读微信小程序开发者文档还有别的大佬的指点,奉上我自己的理解,欢迎各位大佬指点改正,学习交流,共同进步。该文章适合微信小程序初

    2024年02月09日
    浏览(45)
  • 购物车程序实现教程

    在本教程中,我们将实现一个购物车程序,实现在界面中以列表的形式显示购物车的商品信息。商品信息包含商品名称,价格和数量,并能实现对应的增删改查操作。我们将使用 Android Studio 和 SQLite 数据库来完成这个任务。 我们的购物车程序由以下四个主要类组成: MainAct

    2024年02月04日
    浏览(45)
  • 实现蛋糕商城购物车功能代码实现实验报告

    一、实验目的 1、熟悉HttpSession接口中常用方法 2、熟悉Session 对象的生命周期 3、熟悉两种方法返回与当前请求相关的HttpSession对象。 4、学会如何使用Session 技术模拟用户登录的功能 二、实验内容 实现购物车 1、在chapler05 项目下新建一个名称为 cn.itcast.session.entity 的包,在该

    2024年02月09日
    浏览(48)
  • 商城小程序(7.加入购物车)

    新建store目录,并创建store.js文件用于管理vuex相关内容 在store.js中 初始化store的实例对象 在main.js 中导入store实例对象并挂载到vue的实例上 同样目录下创建cart.js模块 在cart.js中,初始化如下的vuex模块 在store/store.js 模块中,导入并挂载购物车中的vue模块 商品详情页面测试,是

    2024年02月02日
    浏览(43)
  • 商城小程序(8.购物车页面)

    本章主要完成pages下的cart购物页面编写 定义如下UI结构 美化样式 通过 mapState 辅助函数,将Store中的cart数组映射到当前页面中使用: 在UI结构中,通过v-for渲染自定义组件my-goods 打开my-goods.vue组件,为商品左侧图片区域添加radio足迹 并美化UI ,使radio组件和image组件左右布局

    2024年01月23日
    浏览(61)
  • 模拟瑞幸小程序购物车

    是根据渡一袁老师的大师课写的,如有什么地方存在问题,还请大家指出来哟ど⁰̷̴͈꒨⁰̷̴͈う♡~

    2024年01月16日
    浏览(41)
  • flask 与小程序 购物车删除和编辑库存功能

    编辑  :   数量加减   价格汇总  数据清空 知识点1: view class=\\\"jian-btn\\\" catchtap=\\\"jianBtnTap\\\" data-index=\\\"{{index}}\\\" 是一个微信小程序中的一个视图组件,具有以下特点: class=\\\"jian-btn\\\" :该组件的样式类名为 jian-btn ,可以通过CSS样式表对其进行样式设置。 catchtap=\\\"jianBtnTap\\\" :该组件绑

    2024年01月22日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包