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中echarts的用法及与elementui-select的协同绑定操作
Nov 17 Vue.js
解决vue下载后台传过来的乱码流的问题
Dec 05 Vue.js
vue+element_ui上传文件,并传递额外参数操作
Dec 05 Vue.js
基于vue与element实现创建试卷相关功能(实例代码)
Dec 07 Vue.js
Vue解决移动端弹窗滚动穿透问题
Dec 15 Vue.js
vue 递归组件的简单使用示例
Jan 14 Vue.js
Vue看了就会的8个小技巧
Jan 21 Vue.js
学习 Vue.js 遇到的那些坑
Feb 02 Vue.js
如何使用vue3打造一个物料库
May 08 Vue.js
Vue中插槽slot的使用方法与应用场景详析
Jun 08 Vue.js
Vue中使用import进行路由懒加载的原理分析
Apr 01 Vue.js
vue ant design 封装弹窗表单的使用
Jun 01 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
一个简单的自动发送邮件系统(二)
2006/10/09 PHP
深入理解PHP原理之Session Gc的一个小概率Notice
2011/04/12 PHP
php连接数据库代码应用分析
2011/05/29 PHP
PHP中new static()与new self()的比较
2016/08/19 PHP
关于javascript event flow 的一个bug详解
2013/09/17 Javascript
Javascript 按位左移运算符使用介绍(
2014/02/04 Javascript
js实现的捐赠管理完整实例
2015/01/20 Javascript
Backbone.js的Hello World程序实例
2015/06/19 Javascript
深入理解JavaScript的React框架的原理
2015/07/02 Javascript
JavaScript的函数式编程基础指南
2016/03/19 Javascript
bootstrap模态框跳转到当前模板页面 框消失了而背景存在问题的解决方法
2020/11/30 Javascript
JavaScript实现计数器基础方法
2017/10/10 Javascript
vue中配置mint-ui报css错误问题的解决方法
2017/10/11 Javascript
vue通过点击事件读取音频文件的方法
2018/05/30 Javascript
jquery实现动态改变css样式的方法分析
2019/05/27 jQuery
vue中监听路由参数的变化及方法
2019/12/06 Javascript
小程序双头slider选择器的实现示例
2020/03/31 Javascript
[00:55]深扒TI7聊天轮盘语音出处3
2017/05/11 DOTA
Python threading多线程编程实例
2014/09/18 Python
python简单文本处理的方法
2015/07/10 Python
Python使用redis pool的一种单例实现方式
2016/04/16 Python
Python使用matplotlib绘制三维图形示例
2018/08/25 Python
对pandas的层次索引与取值的新方法详解
2018/11/06 Python
Python面向对象之类和对象属性的增删改查操作示例
2018/12/14 Python
python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例
2020/02/28 Python
Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)
2020/06/23 Python
HTML5之SVG 2D入门12—SVG DOM及DOM操作介绍
2013/01/30 HTML / CSS
德国健康生活方式网上商店:Landkaufhaus Mayer
2019/03/12 全球购物
环境工程求职简历的自我评价范文
2013/10/24 职场文书
自主招生自荐信范文
2013/12/04 职场文书
外贸业务员工作职责
2014/01/06 职场文书
工程招投标邀请书
2014/01/26 职场文书
园林设计专业毕业生求职信
2014/03/23 职场文书
市场营销专业自荐书
2014/06/10 职场文书
道德模范事迹材料
2014/12/20 职场文书
MySQL transaction事务安全示例讲解
2022/06/21 MySQL