美文网首页
uni-app开发H5——购物车

uni-app开发H5——购物车

作者: 小鱼儿_逆流而上 | 来源:发表于2020-07-05 00:09 被阅读0次
小鱼儿心语:决定你穿什么衣裳的,不是你的钱包,而是你的身材。决定你的脾气的,不是你的性格,而是你的位置。决定你的品位的,不是你的学历,而是你的阅历。
今天给大家分享uni-app开发H5中的购物车功能,具体是怎样实现的呢,跟着我一起来看看吧~

首先来看下详情页面的效果,可能有点不完善,大家主要看功能点就好:

教具详情.png
这是一个简单的物品详情页面,点击 “加入购物车” 弹出选择规格弹框: 规格弹框.png
选择完规格以及数量之后点击 “加入购物车”,此时,详情页下方购物车图标上的数字就会 增加
接下来我们来看下购物车页面:
右上角--管理.png
右上角--完成.png
  • 以上页面中标题栏按钮的点击变化是通过uni-app中的自定义标题栏uni-nav-bar插件实现的
  • https://ext.dcloud.net.cn/plugin?id=52 (uni-app自定义导航栏插件下载地址)
    uni-app(自定义导航栏)插件下载.png
  • 具体操作有待更新!

那么,点击 “加入购物车” 之后我们是怎么获取到数据的呢,我想大家一定想到了,先把数据缓存,再从缓存中拿到想要的数据,我们来看下具体的思路:

https://uniapp.dcloud.io/api/storage/storage?id=setstorage(缓存的官方文档请作参考)
  • 首先:把我们加入购物车的数据通过uni.setStorage()缓存到本地,此时还需要考虑:如果再次加入购物车的物品的规格与购物车中的某一条物品规格相同,那么购物车中的那个物品只能数量发生变化,而不能出现两件规格完全相同的物品!
    还有一个最重要的,每次登录的用户不同购物车数据一定页不同,所以还需要通过当前用户的id来判断获取当前购物车数据
  • 其次:当我们在购物车页面通过uni.getStorageInfoSync()获取缓存中的数据时,需要通过物品id(唯一标识)来判断物品规格是否相同,如果相同就让该物品的数量增加!
好了,现在我们来看下具体的代码操作
一、通过uni.setStorage()将数据缓存到本地
//点击加入购物车按钮
torouter() {
                let that = this
                let stuid = ''
                // 获取缓存中的当前登录的用户id,确保不同用户登录后购物车中的数据都是对应当前用户的数据
                uni.getStorage({
                    key: 'userInfo',
                    success: function(res) {
                        stuid = res.data.uid
                    }
                })
                //  缓存中的当前登录的用户id
                that.stuId = stuid
                // 因为点击加入购物车和点击立即购买都要弹出规格弹框,所以这里需要判断一下
                if (that.btnName == '加入购物车') {
                    // 点击加入购物车时校验库存
                    that.kucunNum()
                    // maxNumber--总库存、number--当前输入的数量
                    // 当库存充足就可以进行“加入购物车”操作
                    if(that.maxNumber>=that.number){
                        // 首先获取缓存中的已经加入购物车的数据
                        const res = uni.getStorageInfoSync();
                        // keys--缓存中所有的key值
                        that.keys = res.keys
                        let data = []
                        // 过滤包含‘goods_key’的key值()
                        that.keys.forEach(item => {
                            if (item.indexOf('goods_key') != -1 && item.indexOf(that.stuId) != -1) {
                                // 将购物车列表中已有的数据push到data中
                                data.push(item)
                            }
                        })
                        // 获取当前时间戳(用来区别相同的物品规格)
                        let newData = Date.parse(new Date());
                        // 如果购物车中已有数据
                        if (data.length > 0) {
                            data.forEach(item => {
                                // 循环购物车中已有数据,判断是否与当前要加入购物车的物品id相同
                                // 如果相同就通过拼接new和时间戳来区分
                                if (item.indexOf(that.guige_skuId) != -1) {
                                    // 弹出确定、取消弹框
                                    uni.showToast({
                                        title: '已成功添加到购物车',
                                        duration: 2000,
                                        image: '../../../static/images/duigou.png',
                                        success: function(res) {
                                            // 用户点击确定
                                            // 通过uni.setStorage将当前数据缓存到本地
                                            uni.setStorage({
                                                // 如果同样规格的物品多次加入购物车,加一个new标识
                                                key: 'goods_key' + that.guige_skuId + that.stuId + 'new' + newData,
                                                data: that.data,
                                                success: function() {
                                                    // console.log('success');
                                                }
                                            });
                                        }
                                    })
                                    // 加入购物车完成后将选择规格弹框隐藏掉
                                    this.hides()
                                } else {
                                    // 如果购物车已有数据与当前要加入购物车的物品id不相同,就直接将当前物品缓存到本地
                                    uni.showToast({
                                        title: '已成功添加到购物车',
                                        duration: 2000,
                                        image: '../../../static/images/duigou.png',
                                        success: function(res) {
                                            console.log('用户点击确定');
                                            uni.setStorage({
                                                // 此时就不需要通过new和时间戳来区分,因为此规格只有一个,独一无二
                                                key: 'goods_key' + that.guige_skuId + that.stuId,
                                                data: that.data,
                                                success: function() {
                                                    // console.log('success');
                                                }
                                            });
                                        }
                                    })
                                    this.hides()
                                }
                            })
                        } else {
                            uni.showToast({
                                title: '已成功添加到购物车',
                                duration: 2000,
                                image: '../../../static/images/duigou.png',
                                success: function(res) {
                                    console.log('用户点击确定');
                                    uni.setStorage({
                                        key: 'goods_key' + that.guige_skuId + that.stuId,
                                        data: that.data,
                                        success: function() {
                                            console.log('success');
                                        }
                                    });
                                }
                            })
                            this.hides()
                        }
                    }
                    // 因为点击加入购物车和点击立即购买都要弹出规格弹框,所以这里需要判断一下
                } else {
                    // 点击立即购买,校验库存
                    that.kucunNum()
                    // maxNumber--总库存、number--当前输入的数量
                    // 当库存充足就可以进行“加入购物车”操作
                    if(that.maxNumber>=that.number){
                        uni.navigateTo({
                            url: '../shopmall/infoconf?sku_id=' + that.goodDetail.id + '&level=' + that.data.level +
                                '&coach=' + that.data.coach + '&material=' + that.data.material + '&number=' + that.data.number +
                                '&sellPrice=' + that.GoodsPrice
                        })
                    }
                    
                }
            }
二、通过uni.getStorage()获取缓存中购物车数据

如下就是缓存中的数据:


缓存数据.png

其中一个key值:goods_key809352new1592216294000
goods_key:代表购物车中所有的缓存数据;
809:当前要加入缓存数据的规格id
352:当前登录的用户id
new1592216294000(当前时间戳):用来区分当前要加入购物车的数据与购物车已有数据规格相同时的字符串

// 因为是列表数据,所以运用了分页处理,
            getUpData(mescroll) {
                this.mescroll = mescroll
                let that = this
                that.loading = true
                let data = []
                uni.removeStorageSync('goods_key');
                // 当前学员的id(当前登录用户的id)
                let stuid = ''
                uni.getStorage({
                    key: 'userInfo',
                    success: function(res) {
                        stuid = res.data.uid
                    }
                })
                // 获取缓存中的当前登录用户的id
                that.stuId = stuid
                // 获取缓存中所有的key值
                const res = uni.getStorageInfoSync();
                console.log("所有多少个key", res.keys);
                // 获取缓存中所有的key值
                that.keys = res.keys
                // 缓存中物品规格完全相同的key值
                let newData = []
                // 过滤包含‘goods_key’的key
                that.keys.forEach(item => {
                    // 购物车中所有缓存数据的key值
                    if (item.indexOf('goods_key') != -1 && item.indexOf(that.stuId) != -1 && item.indexOf('new') == -1) {
                        data.push(item)
                    }
                    // 获取缓存中key值中包含‘new’的key值(物品规格相同的数据)
                    if (item.indexOf('new') != -1) {
                        newData.push(item)
                    }
                })
                // -----------------获取新添加的new的data数据---------------------
                // 物品规格相同的数据的key值对应的每一个data数据
                let newDetail = {}
                // 物品规格相同的数据的key值对应的data数据,每一个循环push进newdata数组里
                let newdata = []
                // 循环缓存中物品规格完全相同的key值
                newData.forEach(item => {
                    uni.getStorage({
                        key: item,
                        success: function(res) {
                            // 深拷贝(物品规格相同的数据的key值对应的每一个data数据)
                            newDetail = JSON.parse(JSON.stringify(res.data))
                            // 物品规格相同的数据的key值对应的data数据,每一个循环push进newdata数组里
                            newdata.push(newDetail)
                            that.loading = false
                        },
                    });
                })
                // 购物车中所有缓存数据的key值
                that.goodKey = data
                // 清空当前购物车列表中的数据
                that.goodsData = []
                // 循环购物车中所有缓存数据的key值
                that.goodKey.forEach(item => {
                    uni.getStorage({
                        key: item, //每一个key值
                        success: function(res) {
                            // 每一个key值对应的data数据
                            that.goods = JSON.parse(JSON.stringify(res.data))
                            that.$set(that.goods, 'checkedGoods', false)
                            // 每一个key值对应的data数据push到购物车列表goodsData数组中
                            that.goodsData.push(that.goods)
                            that.loading = false
                        },
                    });
                })

                // 判断new中数据的skuid与显示的是否相同。相同,显示的数量就是new相加的数量
                // 循环包含new的key值对应的data数据(物品规格相同的值)
                newdata.forEach(item => {
                    // 循环购物车列表中的数据
                    that.goodsData.forEach(v => {
                        // 强制转化成数字类型
                        v.number = Number(v.number)
                        // 判断new中数据的skuid(规格id)与列表数据中的skuid(规格id)是否相同。相同,当前列表中显示的数量就是new中skuid(规格id)相同的数据中的number相加的数量
                        if (item.goodDetail.sku_id == v.goodDetail.sku_id) {
                            // v.number--列表中的显示某条数据的number
                            // item.number--new中数据的所有skuid(规格id)与列表数据中的某条skuid(规格id)相同的data数据中的number相加
                            v.number += Number(item.number)
                            // 最大购买数量不超过100件
                            if (v.number > 100) {
                                v.number = 100
                            }
                        }
                    })
                })
                if (that.goodsData.length == 10) {
                    mescroll.endSuccess(that.goodsData.length);
                    that.loading = false
                    that.current_page = 1
                    that.current_page = that.current_page + 1
                } else {
                    that.loading = false
                    that.current_page = 1
                    mescroll.endSuccess(0)
                }
                if (that.goodsData.length == 0) {
                    this.isEmpty = true
                    this.bgcolor = '#fff'
                }
            },
以上呢就是购物车基本内容了,大概思路就是这样的,如果有写法有误的地方,还请大家多多指教,我们一起进步撒~
希望可以帮助到大家,有疑问的话可以留言给我哦,喜欢我的分享可以为我点赞吧,哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈~~~

相关文章

  • ios静态库链接的问题

    uni-app开发原生插件   公司用uni-app开发的h5程序,然后使用云打包的方式生成包。需要使用支付宝的原...

  • uni-app开发H5——购物车

    小鱼儿心语:决定你穿什么衣裳的,不是你的钱包,而是你的身材。决定你的脾气的,不是你的性格,而是你的位置。决定你的品...

  • 图鸟UI开源上线啦

    # 说明 **图鸟UI**,是基于uni-app进行开发的UI框架,提供丰富的组件进行快速开发,已经支持`H5`和...

  • UniApp H5 Base64 图片上传

    前言 在 APP 开发中,或是 H5 开发时,避免不了会上传一写图片。利用 uni-app 中的 uni.upl...

  • 当 uni-app 遇见 vscode

    uni-app 是一个用 vue 语法来开发小程序、App、H5 的框架,其官方推荐的开发工具为 HBuilder...

  • uni-app开发多终端项目公共样式库

    前沿 使用D-Cloud,uni-App开发多终端app,h5,小程序,可以满足一套代码多端适配,再开发过程中,小...

  • uni-app 中如何实现图片转Base64

    前言 在 APP 开发中,或是 H5 开发时,避免不了会上传一写图片。这时一般有两种方式,利用 uni-app 中...

  • uni-app开发指南

    如果你平时用Vue写H5项目比较多,然后突然有一天公司要你用uni-app来同时开发H5和小程序(甚至App),而...

  • uni-app底部tab栏安全距离遮挡以及底部tabbar距离

    uni-app在小程序和app中开发使用框架原生自带的tab栏是没问题的,但是最近用uniapp开发H5页面时才发...

  • uni-app 安卓手机真机调试

    大家都知道uni-app可进行多端开发,多端调试。小程序,h5,这里就不说了 比较简单哈,我用的是oppo手机 安...

网友评论

      本文标题:uni-app开发H5——购物车

      本文链接:https://www.haomeiwen.com/subject/uozuqktx.html