首先来看看效果图

预览地址:http://xy.xxiaoyuan.top/demo/shopCart/#/

项目开始之前需要选安装好node跟vue和vue-cli
如果还没安装的可以看这里(mac环境下的)https://blog.csdn.net/weixin_39644462/article/details/86302579

1. 首先创建一个vue项目(命令行如下)

vue init webpack shopcart

然后可以一路回车或者Y

2. 创建成功后进入到shopcart目录

cd shopcart

3. 安装项目所需要的依赖

我这项目用到axios请求自己写点json模拟数据,UI框架用到饿了么的Mint-UI框架,使用less作为css预处理器

//安装axios
npm install axios --save
//安装Mint-UI_
npm install mint-ui --save
//安装less
npm install less less-loader --save-dev

好了,可以先运行项目看看

npm run dev

如果浏览器没有自动打开浏览器的话,可以自己手动在浏览器输入localhost:8080  ,或者设置/config/index.js(如下图)

默认样式效果

下面配置一下安装的依赖

配置axios 和 Mint-UI (打开/src/main.js)

配置less(在build/webpack.base.conf.js 的module.exports.module.rules 里面添加如下代码)

{test: /\.less$/,loader: 'style-loader!css-loader!less-loader'
}

为了移动端自配,将引入外部flexible.js进行适配,将flexible.js放在/static/js/目录下,然后在/src/main.js下引入

import '../static/js/flexible.js'

并在/src创建一个目录styles(mixin.less用来做计算rem尺寸,源码文章后面有)

接下来就真正的搞事情了/components/shopCart.vue

<template><div class="page"><header><h3>购物车</h3></header><div class="shop_car_body"><ul><li v-for="(item, index) in  list"><div class="car_list_top"><div class="car_list_t_l"><!-- 选择商品 --><div class="input_check"><span class="ico_gou":class="{'ico_gou_on':item.checked}" @click="selectGoods(item)"></span></div><!-- 选择商品 end --><P>商家: {{item.shop_name}}</P></div><div class="car_list_t_r"><p class="ico_del" @click="delGoods(item.goods_id,index)"></p></div></div><div class="car_list_center"><div class="car_list_c_l"><img :src="'http:'+item.goods_img" alt=""></div><div class="car_list_c_r"><p>{{item.goods_name}}</p><div class="goods_intor"><p>¥{{item.price}}</p><p class="select_num_input"><span class="ico_sub" @click="sub(item.sales_num,index)"></span><input type="number" :value="item.sales_num" disabled><span class="ico_plus" @click="plus(item.sales_num,index)"></span></p></div></div></div></li></ul><div class="car_footer"><div class="car_footer_l" v-show="!checkAllFlag"><span class="ico_gou" @click="checkAll(true)"></span><p>全选</p></div><div class="car_footer_l" v-show="checkAllFlag"><span class="ico_gou_on" @click="checkAll(false)"></span><p>取消全选</p></div><div class="car_footer_r"><span>合计:{{$setNum.Dec(totalMoney,2)}}</span><p @click="toDo()">结算({{checkNum}})</p></div></div></div></div>
</template><script>
import { Toast, Indicator, MessageBox} from 'mint-ui'
export default {data () {return {list:[],selectId:[],  //选中的商品idtotalMoney: 0,  //总价checkNum: 0,  //选择的商品数量(结算需要显示的数量)checkAllFlag:false,  //是否全选}},computed: {},methods: {// 点击结算toDo(){if(this.checkNum <= 0){Toast('先选中需要结算的商品');}else{// 结算选中的商品var isList = [];for(var i in this.list){if(this.list[i].checked){isList.push(this.list[i]);}}                console.log(isList);}},// (单选)选择商品selectGoods(item){//判断是否未定义,如果没点击过按钮是没有注册的,则需要先注册checked属性if(typeof item.checked =='undefined'){this.$set(item,"checked",true);this.checkNum ++;  //结算需要显示的数量}else{//  如果已经注册,则设置checked否(这里不能设置为false,因为当已经注册过之后再点击为flase,那么再点击一次则为true)item.checked = !item.checked;item.checked ? this.checkNum ++ : this.checkNum --;}// 求总价this.totalPrice();// 当所有的商品都选择的时候,自动默认为全选this.list.length == this.checkNum ? this.checkAll(true) : this.checkAllFlag = false;},// 全选与取消全选,点击全选时flag为true,取消时为falsecheckAll(flag){this.checkAllFlag = flag;var _this = this;flag ? this.checkNum = this.list.length : this.checkNum = 0;this.list.forEach(function(item,index){if(typeof item.checked == 'undefined'){//也要防止未定义_this.$set(item,"checked",_this.checkAllFlag);//通过set来给item添加属性checked}else{item.checked = _this.checkAllFlag;}});this.totalPrice();},// 求总价totalPrice(){var _this = this;this.totalMoney = 0;this.list.forEach((item,index)=>{if(item.checked){_this.totalMoney += this.$setNum.accMul(item.price,item.sales_num);}});},// 删除商品delGoods(id,index){MessageBox.confirm('',{title:'',message:'确定删除该商品吗?',confirmButtonText:'确定',cancelButtonText:'取消'}).then(action => {if (action == 'confirm') {// 刷新类表this.getList();// 取消全选this.checkAll(false);}}).catch(error =>{});},// 数量减方法sub(num,index){if(parseInt(num) <= 1){this.list[index].sales_num = 1;}else{this.list[index].sales_num = parseInt(this.list[index].sales_num) - 1;}this.totalPrice();},// 数量加方法plus(num,index){this.list[index].sales_num = parseInt(this.list[index].sales_num) + 1;this.totalPrice();},// 获取购物车列表getList(){var _this = this;this.$http.get("/static/data/data.json").then(function(res){_this.list = res.data.list;});}},mounted(){this.getList();}
}
</script><!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped lang="less">
@import "./../styles/index.less";
.page{.mt(88);.mb(110);.pt(20);
}
header{.h(88);.lh(88);background: @base-color;color: #fff;.fs(32);text-align: center;position: fixed;.left(0);.top(0);width: 100%;z-index: 100;
}
.shop_car_body{.w-calc(48);.ml(24);ul{li{.b-radius(16);background: #fff;.mb(20);.fs(28);.padding(0,24);.pb(24);.car_list_top{.fs(30);display: flex;justify-content: space-between;align-items: center;.padding(24,0);.car_list_t_l{display: flex;justify-content: flex-start;align-items: center;.input_check{position: relative;.mr(20);.w(40);.h(40);span{display: block;position: absolute;.top(4);.left(4);.w(36);.h(36);.bgs(36,36);}}}.car_list_t_r{p.ico_del{.w(36);.h(40);.bgs(36,40);}}}.car_list_center{display: flex;justify-content: flex-start;.car_list_c_l{img{display: block;.w(160);.h(160);object-fit: cover;}}.car_list_c_r{.ml(20);display: flex;flex-direction: column;justify-content: space-around;align-items: flex-start;.w-calc(140);p:nth-child(1){text-align: left;overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 2;-webkit-box-orient: vertical;}.goods_intor{display: flex;justify-content: space-between;align-items: center;width: 100%;.select_num_input{display: flex;justify-content: center;align-items: center;span{display: flex;justify-content: center;align-items: center;@ico_s:40;.w(@ico_s);.h(@ico_s);.bgs(@ico_s,@ico_s);&:active{opacity: .5;}}input[type=number]{.w(60);text-align: center;background: none;}                      }}}}}}// footer.car_footer{.border-top(2,#eee);position: fixed;.left(0);.bottom(0);.w-calc(48);background: #fff;.h(88);.fs(30);display: flex;justify-content: space-between;align-items: center;.padding(0,24);.car_footer_l{.fs(28);color: @base-color;display: flex;justify-content: flex-start;align-items: center;p{.ml(20);}span{display: block;.w(36);.h(36);.bgs(36,36);}}.car_footer_r{display: flex;justify-content: flex-end;align-items: center;span{display: block;.mr(30);}p{display: flex;justify-content: center;align-items: center;color: #fff;.h(60);.padding(0,30);.b-radius(30);background: linear-gradient(45deg, #ff6924, #fe8701);              }}}
}
</style>

主要代码在上面,下面讲解一下主要部分

获取列表数据(因为购物车列表数据是通过自己模拟json数据来实现的,模拟的数据放在/static/data/data.json)

{"list": [{"classify_id": 1,"goods_img": "//gd4.alicdn.com/imgextra/i2/726671139/O1CN01UsYSFL1KHhdcGkTfo_!!726671139.jpg_400x400.jpg","goods_name": "连衣裙ins夏chic2019新款很仙的法国小众吊带网纱超仙a字裙两件套","goods_id": 61,"shop_name": "恋上公主","sales_num": 1,"price": "105.00"},{"classify_id": 2,"goods_img": "//gd3.alicdn.com/imgextra/i3/726671139/O1CN01P4vwli1KHhdYOfl9j_!!726671139.jpg_400x400.jpg","goods_name": "防晒衬衫女长袖薄款设计感小众百搭外穿2019新款超薄透气雪纺衬衣","goods_id": 62,"shop_name": "恋上公主","sales_num": 2,"price": "116.00"},{"classify_id": 2,"goods_img": "//gd2.alicdn.com/imgextra/i1/726671139/O1CN010EFA6U1KHhdODcpz0_!!726671139.jpg_400x400.jpg","goods_name": "2019网红时尚连衣裙很仙的夏款网纱小清新温柔波点吊带T恤裙套装","goods_id": 63,"shop_name": "恋上公主","sales_num": 3,"price": "129.00"},{"classify_id": 4,"goods_img": "//gd4.alicdn.com/imgextra/i4/726671139/O1CN01nonA501KHhctJZ7Tk_!!726671139.jpg_400x400.jpg","goods_name": "新款衬衫女时尚洋气超仙设计感小众2019长袖收腰雪纺韩版chic衬衣","goods_id": 64,"shop_name": "恋上公主","sales_num": 3,"price": "69.00"}]
}

然后通过axios的get请求获取到数据(在methods钩子里写getList方法获取,在mounted钩子初始化)

数量加和数量减的方法

选择商品(单选)

下面代码有注释,应该是比较详细的了

全选

求总价(查找列表,如果存在checked == true,则将其价格剩余数量,下面用到了$setNum.accMul(int1,int2),这个方法是自己封装的一个乘法方法,因为在js中的浮点类型相乘并不能完全得到准确的数据,会存在一定的误差,该方法在/src/assets/js/setDec.js里)

删除商品

点击结算(可以在控制台查看,选中的商品)

最后打包,修改/config/index.js文件下的module.exports下的build的assetsPublicPath,设置为'./'

最后预览地址:http://xy.xxiaoyuan.top/demo/shopCart/#/

源码下载地址在gitHud: https://github.com/YanGo520/shopCart(源码好像没有修改打包后的相对静态资源文件,可以参考上面修改assetsPublicPath为 './' )

码云地址:https://gitee.com/yango520/shopCart

最后允许我打个小广告(虽然很多猿兄没女朋友这是种生物[/滑稽脸]):恋上公主(里面的衣服贼漂亮)

vue实现完整的购物车功能(包括单选全选,删除商品和结算商品功能)相关推荐

  1. Vue购物车功能计算总价/全选/删除

    要求 功能实现 初始页面 功能1:删除 点击删除操作后,整行可以被删除. 功能2:全选 当所有商品都被勾选上是,全选按钮也勾上,当全选按钮勾上时,所有商品都被勾选上. 功能3:计算总价 当输入商品数量 ...

  2. vue实现购物车简单的功能-单选全选总价计算、批量删除

    vue实现购物车简单的功能-----单选全选总价计算.批量删除等 观看了后盾人视频教学,视频里面对于全选和单选的功能没有讲全,于是自己研究了一下,前端小白,也是第一次写博客,有什么不足和可以优化的地方 ...

  3. Vue+Vant制作单选全选全不选以及删除按钮van-checkbox

    在官网上看到vant组件特别好用,就尝试使用checkbox制作单选全选,由于是下午头脑不清楚所以没想通思路,导致了一部分的错误,经过我的老大指点,才想通如此简单的思路,就是都亮和都不亮的区别. 全选 ...

  4. uniapp手写 购物车单选 全选 反选

    uniapp手写 购物车单选 全选 反选 这里是用图片切换的方法显示没有用到 checkbox 单选 选项 图片判断切换 全选 选项 图片判断切换 这里是用图片切换的方法显示没有用到 checkbox ...

  5. android 批量查找view,Android Recyclerview实现多选,单选,全选,反选,批量删除的功能

    效果图如下: recyclerview 实现多选,单选,全选,反选,批量删除的步骤 1.在recyclerview布局中添加上底部的全选和反选按钮,删除按钮,和计算数量等控件 2.这里选中的控件没有用 ...

  6. android 全选功能,Android Recyclerview实现多选,单选,全选,反选,批量删除的功能

    效果图如下: Recyclerview 实现多选,单选,全选,反选,批量删除的步骤 1.在Recyclerview布局中添加上底部的全选和反选按钮,删除按钮,和计算数量等控件 2.这里选中的控件没有用 ...

  7. android 获取通讯录全选反选_Android Recyclerview实现多选,单选,全选,反选,批量删除的功能...

    效果图如下: Recyclerview 实现多选,单选,全选,反选,批量删除的步骤 1.在Recyclerview布局中添加上底部的全选和反选按钮,删除按钮,和计算数量等控件 2.这里选中的控件没有用 ...

  8. Mac OS开发—Xcode给Mac应用添加编辑快捷键(剪切 复制 粘贴 全选 删除 撤销 重做)功能

    前言 笔者做Windows开发的,无奈公司有Mac OS的项目需要维护,之前没有编辑菜单的功能,需要笔者加上这个功能,笔者只能硬着头皮上.还好会c++,Mac应用里面一般都会用object-c 也可以 ...

  9. vue.js实战——购物车练习(包含全选功能)

    vue.js实战第5章 54页的练习1 直接放代码好了,全选的部分搞了好久,代码好像有点啰嗦,好在实现功能了(*^▽^*) HTML: <!DOCTYPE html> <html l ...

  10. angualr 单选全选方法(适用购物车/各种列表删除等)

    Html部分: <table class="pay_attention_table"><thead><tr><!--ng-click=&q ...

最新文章

  1. android studio dump java heap_Android Studio 3.0 Memory Profiler使用
  2. CSDN并购博客园遐想
  3. linux中文乱码问题及locale详解
  4. matlab索引程序,Matlab索引到逻辑索引
  5. Hadoop官网的一个WordCount程序
  6. 用python写MapReduce函数——以WordCount为例
  7. 怎样写 Linux LCD 驱动程序
  8. Max Script|控制摄像机
  9. css挪动背景块位置的属性,CSS 背景位置 background-position属性
  10. 「写论文」“常用关联词”汇总
  11. php相册照片批量修改,怎么批量修改图片尺寸 批量修改图片大小
  12. cap 2 加州房价预测
  13. 语料标注平台BRAT安装说明
  14. 低功耗蓝牙芯片CH579系列开发记录
  15. 苹果手机通话怎么录音?通话录音的详细教程!
  16. 力扣:第 304 场周赛
  17. Android视图绑定,设置控件点击事件不生效
  18. 简述冯诺依曼工作原理_冯.诺依曼计算机的基本工作原理是什么??
  19. 《像神一样玩转金融》公益免费课持续分享!
  20. C/C++常见面试知识点总结附面试真题----20220326更新

热门文章

  1. 墓碑上的字符c语言程序设计,刻在死者墓碑上.概述人物事迹.赞美人物品格的文字叫墓志铭.信客离开我们后.村民为他树碑.请你为其撰写墓志铭. 题目和参考答案——青夏教育精英家教网——...
  2. 51Nod1203 2012集训队答辩 JZPLCM
  3. 技术负责人如何带领好团队
  4. Hierarchical Prosody Modeling for Non-Autoregressive Speech Synthesis
  5. 长沙县北部新城:“湖湘生态”蓝图已绘就,“右岸经济”起飞正当时
  6. 谷歌浏览器怎么开启硬件加速模式 硬件加速模式开启方法简述
  7. 特征点匹配(SIFI)
  8. seata-order-service2006模块
  9. 主板USB接口全部失效解决方案(通用串行总线USB控制器有黄色叹号)保姆级教程亲测有效
  10. 安装eNSP和VirtualBox中遇到的问题