1、制作头部

     <!-- #ifdef MP --><search-slot><view class="left" slot="left"></view><view class="center" slot="center">购物车</view><view class="right" slot="right" A><view v-if="isEdit">编辑</view><view v-else>完成</view></view></search-slot><!-- #endif -->

样式

  .left {width: 100rpx;align-items: center;text-align: center;}.center {flex: 1;text-align: center;}.right {width: 100rpx;text-align: center;align-items: center;}

2、点击按钮完成和编辑进行切换

给按钮传一个点击事件进行判断即可

     data() {return {isEdit:true,}},
         tab(){this.isEdit = !this.isEdit}

3、编辑底部合计部分随着编辑一同显示

     <template v-if="isEdit"><view class="d-flex a-center position-fixed left-0 right-0 bottom-0 ju border-top border-light-secondary a-stretch"style="height: 100rpx;z-index: 100;"><label class="radio d-flex a-center j-center flex-shrink" style="width: 120rpx;"><radio color="#FD6801" ></radio></label><view class="flex-1 d-flex a-center j-center font-md">合计 <p-price>{{totalPrice}}</p-price></view><view class="flex-1 d-flex a-center j-center main-bg-color text-white font-md" hover-class="main-bg-hover-color">结算</view></view></template>

微信小程序中的hover-class属性

微信小程序中,可以用 hover-class 属性来指定元素的点击态效果。但是在在使用中要注意,大部分组件是不支持该属性的。

目前支持 hover-class 属性的组件有三个:view、button、navigator。


4、在完成页面中显示底部样式

<template v-else><view class="d-flex a-center position-fixed left-0 right-0 bottom-0 ju border-top border-light-secondary a-stretch"style="height: 100rpx;z-index: 100;"><label class="radio d-flex a-center j-center flex-shrink" style="width: 120rpx;" ><radio  color="#FD6801" ></radio></label><view class="flex-1 d-flex a-center j-center font-md main-bg-color text-white">移入收藏</view><view class="flex-1 d-flex a-center j-center bg-danger text-white font-md" hover-class="main-bg-hover-color">删除</view></view></template>

条件编译

条件编译是用特殊的注释作为标记,在编译时根据这些特殊的注释,将注释里面的代码编译到不同平台。

写法:以 #ifdef 或 #ifndef 加 %PLATFORM% 开头,以 #endif 结尾。

  • #ifdef:if defined 仅在某平台存在
  • #ifndef:if not defined 除了某平台均存在
  • %PLATFORM%:平台名称
条件编译写法 说明

#ifdef APP-PLUS
需条件编译的代码
#endif

仅出现在 App 平台下的代码

#ifndef H5
需条件编译的代码
#endif

除了 H5 平台,其它平台均存在的代码

#ifdef H5 || MP-WEIXIN
需条件编译的代码
#endif

在 H5 平台或微信小程序平台存在的代码(这里只有||,不可能出现&&,因为没有交集)

%PLATFORM% 可取值如下:

生效条件
VUE3 HBuilderX 3.2.0+ 详情
APP-PLUS App
APP-PLUS-NVUE或APP-NVUE App nvue
H5 H5
MP-WEIXIN 微信小程序
MP-ALIPAY 支付宝小程序
MP-BAIDU 百度小程序
MP-TOUTIAO 字节跳动小程序
MP-LARK 飞书小程序
MP-QQ QQ小程序
MP-KUAISHOU 快手小程序
MP-360 360小程序
MP 微信小程序/支付宝小程序/百度小程序/字节跳动小程序/飞书小程序/QQ小程序/360小程序
QUICKAPP-WEBVIEW 快应用通用(包含联盟、华为)
QUICKAPP-WEBVIEW-UNION 快应用联盟
QUICKAPP-WEBVIEW-HUAWEI 快应用华为

基本样式完成后接下来用vuex来写数据

uniapp中自带vuex所以无需再安装,直接调用即可

创建一个store文件夹里面存放index.js,代码如下:

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
import cart from './modules/cart.js'
let store = new Vuex.Store({modules:{cart}
})
export default store

在main.js中引入

在store文件夹中再新建一个modules文件里面包裹一个cart.js

state中填入list列表

list: [ {checked: false,id: 11,title: "商品标题111",cover: "/static/images/demo/list/1.jpg",// 选中商品属性attrs: [{title: "颜色",selected: 0,list: [{name: '火焰红',},{name: '炭黑',},{name: '冰川兰',}]},{title: "容量",selected: 0,list: [{name: '64GB',},{name: '128GB',},]},{title: "套餐",selected: 0,list: [{name: '标配',},{name: '套餐一',},{name: '套餐二',}]},],pprice: 336,num: 1,minnum: 1,maxnum: 10, // 该商品最大商品数,跟库存有关},{checked: false,id: 12,title: "商品222",cover: "/static/images/demo/list/1.jpg",// 选中商品属性attrs: [{title: "颜色",selected: 0,list: [{name: '火焰红',},{name: '炭黑',},{name: '冰川兰',}]},{title: "容量",selected: 0,list: [{name: '64GB',},{name: '128GB',},]},{title: "套餐",selected: 0,list: [{name: '标配',},{name: '套餐一',},{name: '套餐二',}]},],pprice: 200,num: 1,minnum: 1,maxnum: 10, // 该商品最大商品数,跟库存有关},{checked: false,id: 13,title: "商品标题333",cover: "/static/images/demo/list/1.jpg",// 选中商品属性attrs: [{title: "颜色",selected: 0,list: [{name: '火焰红',},{name: '炭黑',},{name: '冰川兰',}]},{title: "容量",selected: 0,list: [{name: '64GB',},{name: '128GB',},]},{title: "套餐",selected: 0,list: [{name: '标配',},{name: '套餐一',},{name: '套餐二',}]},],pprice: 100,num: 2,minnum: 1,maxnum: 10, // 该商品最大商品数,跟库存有关} ],selectedAll:[]//储存选中数据

也可以单独这么写:

// 页面路径:store/index.js
import Vue from 'vue'
import Vuex from 'vuex'Vue.use(Vuex); //vue的插件机制//Vuex.Store 构造器选项
const store = new Vuex.Store({state: {list: [{checked: false, //按钮状态id: 11, // id用来区分每个不同的按钮title: "商品标题111",cover: "/static/images/demo/list/1.jpg",// 选中商品属性attrs: [{title: "颜色",selected: 0, // 选中的第几个,默认从0开始list: [{name: '火焰红',},{name: '炭黑',},{name: '冰川兰',}]},{title: "容量",selected: 0,list: [{name: '64GB',},{name: '128GB',},]},{title: "套餐",selected: 0, //选中状态list: [{name: '标配',},{name: '套餐一',},{name: '套餐二',}]},],pprice: 336, //商品价格num: 1, // 初始值minnum: 1, // 按钮最大值maxnum: 10, // 该商品最大商品数,跟库存有关},{checked: false,id: 12,title: "商品222",cover: "/static/images/demo/list/1.jpg",// 选中商品属性attrs: [{title: "颜色",selected: 0,list: [{name: '火焰红',},{name: '炭黑',},{name: '冰川兰',}]},{title: "容量",selected: 0,list: [{name: '64GB',},{name: '128GB',},]},{title: "套餐",selected: 0,list: [{name: '标配',},{name: '套餐一',},{name: '套餐二',}]},],pprice: 200,num: 1,minnum: 1,maxnum: 10, // 该商品最大商品数,跟库存有关},{checked: false,id: 13,title: "商品标题333",cover: "/static/images/demo/list/1.jpg",// 选中商品属性attrs: [{title: "颜色",selected: 0,list: [{name: '火焰红',},{name: '炭黑',},{name: '冰川兰',}]},{title: "容量",selected: 0,list: [{name: '64GB',},{name: '128GB',},]},{title: "套餐",selected: 0,list: [{name: '标配',},{name: '套餐一',},{name: '套餐二',}]},],pprice: 100,num: 2,minnum: 1,maxnum: 5, // 该商品最大商品数,跟库存有关}],selectedAll: [] //储存选中数据},getters: {// 购物车为空时出现购物车图标disSelect(state) {return state.list.length === 0;},//全部选中checkedAll(state) {return state.list.length === state.selectedAll.length},//计算总价totalPrice(state) {let total = 0state.list.forEach(v => {/* if(state.selectedAll.indexOf(v.id)!=-1){total += v.pprice * v.num} */console.log(v.num);if (v.checked) {total += v.pprice * v.num}})return total},//合计按钮不可用状态disabled(state) {if (state.list.length === 0) {state.list.checked = falsereturn true}}},mutations: {//单选按钮selectItem(state, index) {var id = state.list[index].idvar i = state.selectedAll.indexOf(id)if (i > -1) {// 取消当前商品选中状态state.list[index].checked = false// 移除选中列表中的当前商品return state.selectedAll.splice(i, 1)}// 选中state.list[index].checked = truestate.selectedAll.push(id)console.log(state.selectedAll);},//全选selectAll(state) {state.selectedAll = []state.list.map(v => {v.checked = truestate.selectedAll.push(v.id)})/* state.selectedAll = state.list.map(v=>{v.checked = truereturn v.id}) */},//全不选noselectAll(state) {state.list.map(v => {v.checked = false})state.selectedAll = []},//删除商品delgoods(state) {uni.showModal({content: '您确定要删除吗',success: () => {// commit('delgoods')state.list = state.list.filter(v => {console.log(state.selectedAll.indexOf(v.id) === -1);return state.selectedAll.indexOf(v.id) === -1})state.selectedAll = [] //清空id},fail: (err) => {console.log(err);}})}},actions: {doselectAll({getters,commit}) {// 传getters中的状态,如果全选按钮是开启的那么就返回全不选,否则就在跳回全选getters.checkedAll ? commit('noselectAll') : commit('selectAll')},}})
export default store

数据基本完成,完成后再写个购物车为空的页面,如果没有获取到数据,那么购物车就显示空

<template v-if="disSelect"><view class="py-5 d-flex a-center j-center bg-white"><view class="iconfont icon-gouwuche text-light-muted" style="font-size: 50rpx;"></view><text class="text-light-muted mx-2">购物车还是为空</text><view class="px-2 py-1 border border-light-secondary rounded" hover-class="bg-light-secondary">去逛逛</view></view></template>

用计算属性引入

 getters: {// 购物车为空时出现暂无数据购物车图标disSelect(state){return state.list.length === 0}},

在页面用计算属性让其显示list列表

     computed: {...mapState({list: (state) => state.list}),// 在这里引入...mapGetters(['disSelect'])}



全部选中:

 

计算总价:

 按钮出现不可选中状态

单选按钮

全选

全不选

删除

异步接收方法

uniapp——商城购物车联动效果相关推荐

  1. 基于vue2.0打造移动商城页面实践 vue实现商城购物车功能 基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果...

    基于vue2.0打造移动商城页面实践 地址:https://www.jianshu.com/p/2129bc4d40e9 vue实现商城购物车功能 地址:http://www.jb51.net/art ...

  2. Android 仿京东商城购物车及源码

    产品需求和京东商城购物车类似,需求如下:店铺不能跨店结算,仅支持单店结算,单店铺下商品侧滑删除商品,如果单店铺下商品全部删除,需要删除该店铺,店铺的单个商铺库存不足或者商品下架状态不支持选择,商品的数 ...

  3. Android:高仿百度外卖、美团、淘点点二级联动效果!

    美团,百度外卖的左右二级联动效果如下: 具体的效果建议打开手机软件玩玩. 分析 首先我们一起分析一下这个界面给我们要怎么去实现. 1.最上面的ToolBar不用多解释,比较简单. 2.下面三个界面切换 ...

  4. php实现商城购物车的思路以及源码分析

    这篇文章主要介绍了php实现商城购物车的思路和源码分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着快搜小编来一起学习学习吧 AI 本文介绍一个ph ...

  5. 仿饿了么购物车下单效果

    文章目录 仿饿了么购物车下单效果 效果图如下 主要的功能 主要功能实现 分类及商品及购物车里面商品数量的联动效果 底部购物车商品列表 添加商品是有0到1,减少商品有1到0动画效果 下单动画 仿饿了么购 ...

  6. Joolun uniapp商城源码实现商城自定义拖拽装修_Java二开源码

    前一阵子,Joolun uniapp商城源码系统应广大开发者的需求,把开发者们想要的商城自定义拖拽装修给安排上了,拖拽装修也在V1.0.2版本发布的时候正式上线,实现商城首页自定义动态拖拽装修(支持不 ...

  7. Vue-elementUI实现PC端商城购物车计算

    Vue-elementUI实现PC端商城购物车计算 Vue-elementUI实现PC端商城购物车计算,最重要的就是[computed]里面的计算,用来算出勾选的商品的总价 文章目录 Vue-elem ...

  8. 来客推商城V3多用户uni-app商城源码如何搭建?盈利模式怎么样的?

    双11马上又要到了,今年的我们打工人又要把为数不多的余额交给马爸爸,从10月中旬开始就是集体变成尾款人.双11电商平台现在可谓百花齐放,我们一般都会去淘宝,天猫,京东等大型电商平台,那么大家想过没有, ...

  9. Android之实现京东底部添加到购物车的效果

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/50992567 本文出自:[顾林海的博客] ##前言 美好的双休日快要结 ...

最新文章

  1. 神经网络在Keras中不work!博士小哥证明何恺明的初始化方法堪比“CNN还魂丹”...
  2. bios设置 联想m8000t_怎么进bios设置硬盘启动顺序
  3. socket编程五种模型
  4. linux系统中存放用户账号信息的文件是,信息安全技术题库:Linux系统中,用户登录密码的hash是存放在()文件中的。...
  5. 去越南旅游一个人玩一个月需要多少人民币?
  6. 解决Winform应用程序中窗体背景闪烁的问题
  7. 由捧哏巨匠谈创新的难度
  8. ARM嵌入式开发入门必要步骤
  9. python复数类型-Python 复数属性和方法操作实例
  10. 服务器显示媒体已断开,媒体断开是什么?Win10专业版如何修复媒体断开?
  11. 前端几种本地缓存机制
  12. Delta RPMs disabled because /usr/bin/applydeltarpm not installed
  13. 电脑计算机打不开显示远程过程,win10系统打不开图片提示“远程过程调用失败”的解决方法...
  14. 如何在期货与现货市场之间套利?
  15. 从学生到机器视觉工程师,我有话要说!
  16. 炫酷可视化教程 Cufflinks 来啦!!!
  17. 扎心了!37岁被裁,好几个月都没有找到工作,面试大公司被婉拒,无奈只能降薪去小公司,没想到还被人嫌弃技术太落后...
  18. Zigbee使用MT层实现串口写和读操作,简要了解osal_msg_send消息机制
  19. linux少了 dev dm设备,已解决: Linux中安装了powerpath之后为什么还会有dm设备? - Dell Community...
  20. 受疫情影响,超七成美国科技公司暂停招聘或裁员

热门文章

  1. ubuntu14.04.5 + 1080ti + CUDA8.0 深度学习服务器配置折腾手记
  2. div设置背景图background:url
  3. lollipop中文_2NE1的Lollipop中文歌词和中文译音?
  4. 交换机和路由器技术-04-远程管理交换机
  5. 微信官方服务器什么时候恢复,微信上午“罢工” 因服务器故障所致 预计后天恢复...
  6. php excel多级下拉菜单自动匹配,让Excel如程序般酷炫,两步让多级下拉菜单自动匹配内容...
  7. UNITE 2016 SHANGHAI|社区 团结 分享 感谢与你相逢
  8. 3款好用的客户系统管理软件推荐,你用过哪款?
  9. Linuxcentos常用命令
  10. 调用service的executeSql方法直接 写sql语句