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 相关文章推荐
vue使用require.context实现动态注册路由
Dec 25 Vue.js
vue keep-alive的简单总结
Jan 25 Vue.js
Vue+Bootstrap实现简易学生管理系统
Feb 09 Vue.js
vue前端和Django后端如何查询一定时间段内的数据
Feb 28 Vue.js
vue路由实现登录拦截
Mar 24 Vue.js
开发一个封装iframe的vue组件
Mar 29 Vue.js
Vue详细的入门笔记
May 10 Vue.js
vue实现锚点定位功能
Jun 29 Vue.js
vue使用Google Recaptcha验证的实现示例
Aug 23 Vue.js
关于Vue中的options选项
Mar 22 Vue.js
vue实现在data里引入相对路径
Jun 05 Vue.js
Vue3实现简易音乐播放器组件
Aug 14 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伪静态之APACHE篇
2014/06/02 PHP
xml 与javascript结合的问题解决方法
2007/03/24 Javascript
JS backgroundImage控制
2009/05/19 Javascript
获取非最后一列td值并将title设为该值的方法
2013/10/30 Javascript
js代码验证手机号码和电话号码是否合法
2015/07/30 Javascript
jquery实现表格隔行换色效果
2015/11/19 Javascript
高效的jquery数字滚动特效
2015/12/17 Javascript
jquery表单验证实例仿Toast提示效果
2017/03/03 Javascript
Bootstrap Table快速完美搭建后台管理系统
2017/09/20 Javascript
Postman模拟发送带token的请求方法
2018/03/31 Javascript
JavaScript实现数字前补“0”的五种方法示例
2019/01/03 Javascript
Layui弹出层 加载 做编辑页面的方法
2019/09/16 Javascript
jquery添加div实现消息聊天框
2020/02/08 jQuery
JavaScript闭包原理与用法学习笔记
2020/05/29 Javascript
用Python输出一个杨辉三角的例子
2014/06/13 Python
python实现简单爬虫功能的示例
2016/10/24 Python
详解Python 协程的详细用法使用和例子
2018/06/15 Python
对Tensorflow中的变量初始化函数详解
2018/07/27 Python
Python在图片中插入大量文字并且自动换行
2019/01/02 Python
Python多线程threading模块用法实例分析
2019/05/22 Python
Python3中的最大整数和最大浮点数实例
2019/07/09 Python
python os.fork() 循环输出方法
2019/08/08 Python
Python 面向对象静态方法、类方法、属性方法知识点小结
2020/03/09 Python
Python如何使用vars返回对象的属性列表
2020/10/17 Python
HTML5+Canvas+CSS3实现齐天大圣孙悟空腾云驾雾效果
2016/04/26 HTML / CSS
Html5页面上如何禁止手机虚拟键盘弹出
2020/03/19 HTML / CSS
迪拜领先运动补剂零售品牌中文站:Sporter商城
2019/08/20 全球购物
六十大寿答谢词
2014/01/12 职场文书
报关专员求职信范文
2014/02/22 职场文书
大学竞选班长演讲稿
2014/04/24 职场文书
师范生求职信
2014/06/14 职场文书
高中综合实践活动总结
2014/07/07 职场文书
幼儿园教师师德师风承诺书
2015/04/28 职场文书
2015初中政治教学工作总结
2015/07/21 职场文书
Docker下安装Oracle19c
2022/04/13 Servers
css清除浮动clearfix:after的用法详解(附完整代码)
2023/05/21 HTML / CSS