vue+vant实现购物车全选和反选功能


Posted in Vue.js onNovember 17, 2020

本文实例为大家分享了vue+vant实现购物车全选和反选的具体代码,供大家参考,具体内容如下

这是效果图:

vue+vant实现购物车全选和反选功能

话不多少,直接上代码:

<template>
 <div class="cart">
 <div class="st-spacing-main" v-for="(item) in cartInfoList" :key="item.id">
  <div class="st-item product-item">
  <div class="st-border-bottom store-title">
   <p @click="checkShop(item)">
   <van-checkbox v-model="item.checked">
    <span>
    {{item.shopTitle}}
    <van-icon name="arrow"/>
    </span>
   </van-checkbox>
   </p>
  </div>
  <ul class="commodity-list" v-for="(pros,value) in item.productList" :key="value">
   <li @click="ischeck(item,pros)">
   <van-checkbox v-model="pros.isChecked"></van-checkbox>
   </li>
   <li>
   //这是商品组件
   <product-cart size="mini" type="number" :option="3"></product-cart>
   </li>
  </ul>
  </div>
 </div>
 <van-submit-bar class="settlement" :price="10060" button-text="去结算" @submit="onSubmit">
  <van-checkbox v-model="isCheckAll" @click="checkAll()">全选</van-checkbox>
  <span class="cart-freight" slot="default">不含运费</span>
 </van-submit-bar>
 </div>
</template>

<script>
export default {
 data () {
 return {
  cartInfoList: [
  {
   id: 1,
   shopTitle: '苹果旗舰店', // 商店名
   checked: false, // 商店选择的状态
   checkedCount: 0, // 此商店被选择的商品数量
   productList: [
   {
    isChecked: false, // 商品选择状态
    productTitle: '2019款macbook/苹果/MF893/A国航笔记本', // 产品名
    category: '15寸/2.3/8G/256/土豪金/标准套餐',
    price: 10200, // 价格
    count: 1 // 数量
   }
   ]
  },
  {
   id: 2,
   shopTitle: '锤子科技旗舰店',
   checked: false,
   checkedCount: 0,
   productList: [
   {
    isChecked: false,
    productTitle: '锤子手机手感保护膜',
    category: '登陆月球',
    price: 9.9,
    count: 1
   },
   {
    isChecked: false,
    productTitle: '锤子手机pro割手版',
    category: '128G/割手版',
    price: 1790,
    count: 1
   }
   ]
  }
  ],
  isCheckAll: false, // 是否全选
  allPrice: 0, // 所有价格
  allShops: 0, // 被选中的商店数量
  allCount: 0 // 被选中的产品数量
 }
 },
 methods: {
 // 选中单个商品
 ischeck (item, pro) {
  // 为未选中的时候改变为false,反之为true
  !pro.isChecked ? this._checkTrue(item, pro) : this._checkFalse(item, pro)
 },
 // 修改单个商品的true
 _checkTrue (item, pro) {
  pro.isChecked = true // 将商品选中状态改为true
  // 这里执行了两部,选中商品数量先+1,再与该店铺商品数量比较,如果相等就更改店铺选中状态为true
  if (++item.checkedCount === item.productList.length) {
  item.checked = true
  } else {
  return ''
  }
  // ++item.checkedCount === item.productList.length ? item.checked = true : ''
  // 如果店铺选中状态改为true,选中店铺数量先+1,再与店铺数量比较,如果相等就更改全选选中状态为true
  // // 当商店全选状态,每全选一个商店,被选中商店数加一,数值等于所有商店数,全选状态为true
  if (item.checked) {
  if (++this.allShops === this.cartInfoList.length) {
   this.isCheckAll = true
  } else {
   this.isCheckAll = false
  }
  } else {
  return ''
  }
  // item.checked ? ++this.allShops === this.cartInfoList.length ? this.isCheckAll = true : this.isCheckAll = false : ''
 },
 // 修改单个商品的 false
 _checkFalse (item, pro) {
  pro.isChecked = false // 将商品选中状态改为false
  --item.checkedCount // 被选中的商品数减一
  if (item.checked) {
  // 如果店铺是被选中的,更改店铺选中状态
  item.checked = false // 当商店状态为选中时改变false
  --this.allShops // 商店数减一
  }
  this.isCheckAll = false // 全选状态为false
 },

 // 选择整个商店的商品
 checkShop (item) {
  !item.checked ? this._shopTrue(item) : this._shopFalse(item)
 },
 // 遍历商店每个商品,状态为false的改变为true,又在_checkTrue()方法中将商店状态改为true
 _shopTrue (item) {
  item.productList.forEach(pro => {
  if (pro.isChecked === false) {
   this._checkTrue(item, pro)
  } else {
   return ''
  }
  // pro.isChecked === false ? this._checkTrue(item, pro) : ''
  })
 },
 _shopFalse (item) {
  item.productList.forEach(pro => {
  // 同上
  if (pro.isChecked === true) {
   this._checkFalse(item, pro)
  } else {
   return ''
  }
  // pro.isChecked === true ? this._checkFalse(item, pro) : ''
  })
 },
 // 选择全部商店的商品,已经计算总价和总数量的函数
 checkAll () {
  // 方法内调用方法
  this.isCheckAll = !this.isCheckAll
  this.isCheckAll
  ? this.cartInfoList.forEach(item => {
   this._shopTrue(item)
  })
  : this.cartInfoList.forEach(item => {
   this._shopFalse(item)
  })
 },
 _totalPeice () {
  // 每次调用此方法,将初始值为0,遍历价格并累加
  this.allPrice = 0
  this.cartInfoList.forEach(item => {
  let products = item.productList
  products.forEach(pros => {
   if (pros.isChecked) {
   this.allPrice += pros.price * pros.count
   }
  })
  })
 },
 _totalCount () {
  // 同上
  this.allCount = 0
  this.cartInfoList.forEach(item => {
  this.allCount += item.checkedCount
  })
 },

 onSubmit () {}
 },
 watch: {
 // 深度监听所有数据,每次改变重新计算总价和总数
 cartInfoList: {
  deep: true,
  handler (val, oldval) {
  this._totalPeice()
  this._totalCount()
  }
 }
 }
}
</script>

<style lang="less" scoped>
@import "../assets/less/views/cart.less";
</style>

less文件

@spacing-size: .29rem;

.cart-main {
 .st-item-header {
 padding: @spacing-size;
 justify-content: flex-start;
 .theme-checkbox {
  margin-right: @spacing-size;
 }
 }
 .item-list {
 padding-left: .77rem;
 position: relative;
 .theme-checkbox {
  margin-top: -.24rem;
  position: absolute;
  left: 0;
  top: 50%;
 }
 }
}

关于vue.js组件的教程,请大家点击专题vue.js组件学习教程进行学习。

更多vue学习教程请阅读专题《vue实战教程》

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Vue.js 相关文章推荐
vue3.0中setup使用(两种用法)
Dec 02 Vue.js
Vue中computed和watch有哪些区别
Dec 19 Vue.js
如何在vue 中使用柱状图 并自修改配置
Jan 21 Vue.js
vue.js实现点击图标放大离开时缩小的代码
Jan 27 Vue.js
vue实现拖拽进度条
Mar 01 Vue.js
vue打开新窗口并实现传参的图文实例
Mar 04 Vue.js
vue前端工程的搭建
Mar 31 Vue.js
浅谈vue2的$refs在vue3组合式API中的替代方法
Apr 18 Vue.js
vue项目中的支付功能实现(微信支付和支付宝支付)
Feb 18 Vue.js
vue的项目如何打包上线
Apr 13 Vue.js
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
Apr 24 Vue.js
vue-cli3.x配置全局的scss的时候报错问题及解决
Apr 30 Vue.js
vue中音频wavesurfer.js的使用方法
Feb 20 #Vue.js
vue使用vant中的checkbox实现全选功能
Nov 17 #Vue.js
在vue中通过render函数给子组件设置ref操作
Nov 17 #Vue.js
vue+iview分页组件的封装
Nov 17 #Vue.js
快速解决vue2+vue-cli3项目ie兼容的问题
Nov 17 #Vue.js
vue+iview实现分页及查询功能
Nov 17 #Vue.js
vue中echarts的用法及与elementui-select的协同绑定操作
Nov 17 #Vue.js
You might like
php minixml详解
2008/07/19 PHP
PHP 采集心得技巧
2009/05/15 PHP
PHP CodeBase:将时间显示为&quot;刚刚&quot;&quot;n分钟/小时前&quot;的方法详解
2013/06/06 PHP
PHP使用token防止表单重复提交的方法
2016/04/07 PHP
PHP编写简单的App接口
2016/08/28 PHP
PHP基于ip2long实现IP转换整形
2020/12/11 PHP
Javascript Tab 导航插件 (23个)
2009/06/11 Javascript
解决iframe的frameborder在chrome/ff/ie下的差异
2010/08/12 Javascript
动态加载js的方法汇总
2015/02/13 Javascript
jQuery插件zoom实现图片全屏放大弹出层特效
2015/04/15 Javascript
jqueryMobile使用示例分享
2016/01/12 Javascript
JS比较两个数值的大小实例
2016/11/25 Javascript
JavaScript的变量声明提升问题浅析(Hoisting)
2016/11/30 Javascript
原生javascript移动端滑动banner效果
2017/03/10 Javascript
详解如何解决vue开发请求数据跨域的问题(基于浏览器的配置解决)
2018/11/12 Javascript
js打开word文档预览操作示例【不是下载】
2019/05/23 Javascript
使用Protocol Buffers的C语言拓展提速Python程序的示例
2015/04/16 Python
Python Sql数据库增删改查操作简单封装
2016/04/18 Python
python多进程和多线程究竟谁更快(详解)
2017/05/29 Python
Scrapy基于selenium结合爬取淘宝的实例讲解
2018/06/13 Python
selenium+python设置爬虫代理IP的方法
2018/11/29 Python
python实现图片识别汽车功能
2018/11/30 Python
python实现栅栏加解密 支持密钥加密
2019/03/20 Python
Python实现字符串匹配的KMP算法
2019/04/04 Python
Python中的xlrd模块使用原理解析
2020/05/21 Python
python3代码中实现加法重载的实例
2020/12/03 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
2021/03/03 Python
HTML5+lufylegend实现游戏中的卷轴
2016/02/29 HTML / CSS
Farfetch台湾官网:奢侈品牌时尚购物平台
2019/06/17 全球购物
Nayomi官网:沙特阿拉伯王国睡衣和内衣品牌
2020/12/19 全球购物
小区门卫工作职责
2013/12/14 职场文书
小学门卫岗位职责
2013/12/17 职场文书
挂职思想汇报
2013/12/31 职场文书
会计专业毕业生求职信分享
2014/01/03 职场文书
经典而简洁的婚礼主持词
2014/03/13 职场文书
店面出租协议书范本
2014/11/28 职场文书