需求:

首先说一下思路:我首先把数据列表两级遍历了一下,增加了一个checked属性来控制勾选和不勾线

  1. this.productList.forEach((item)=>{
  2. this.$set(item,"checked",false);
  3. item.goodList.forEach((subItem)=>{
  4. this.$set(subItem,"checked",false);(我这里用$set,添加属性,
    因为vue是数据挟持的原理,他通过Object.defineProperty来监听属性的变化,我防止层级太深,
    属性变化vue监听不到(或者监听到了dom渲染不了),如果监听到了你可以不加,加了肯定是对的)
  5. })
  6. })

页面结构

  1. <div>
  2. <p>
  3. <span class="checkSpan"><input type="checkbox" v-model="checkAll" @change="selectAll"><label></label>全选</span></p>
  4. <div class="itemSection" v-for="(item,index) in productList">
  5. <div class="item-top">
  6. <span class="checkSpan"><input type="checkbox" v-model="item.checked" @change="selectItem1(item,productList)"><label></label>{{item.typeName}}</span>
  7. </div>
  8. <div class="subItemSection">
  9. <div class="subItem" v-for="(subItem,subIndex) in item.goodList">
  10. <div class="">
  11. <span class="checkSpan"><input type="checkbox" v-model="subItem.checked" @change="selectItem2(item,productList)"><label></label>{{subItem.goodName}}</span></div>
  12. </div>
  13. </div>
  14.  
  15. </div>
  16. </div>

以下步骤是建立在你把数据循环遍历加了一个checked属性的基础上实现的

1第一步全选    checkAll:false,

  1. selectAll(){
  2. this.productList.forEach(item=>{
  3. item.checked=this.checkAll;
  4. item.goodList.forEach(subItem=>{
  5. subItem.checked=this.checkAll;
  6. })
  7. })
  8. },//定一个变量,你通过全选的变量来递归让所有的数据勾选或不勾选

2第二步

  1. selectItem1(item,productList){
  2. let firstItem=productList.every(item=>{
  3. return item.checked==true;
  4. }) //这步所有的一级,度勾选控制全选勾选
  5. if(firstItem){
  6. this.checkAll=true;
  7. }else{
  8. this.checkAll=false;
  9. }
  10. item.goodList.forEach(subItem=>{
  11. subItem.checked=item.checked;
  12. })//控制二级的勾选
  13. },

3这里都是针对的都是当前的二级

  1. selectItem2(item,productList){
  2.  
  3. let lengths=item.goodList.length;
  4. let checkeds=item.goodList.filter(subItem=>{
  5. return subItem.checked==true;
  6. });
  7. if(lengths==checkeds.length){
  8. item.checked=true;//2级勾选的数量和二级的数量相同,让一级勾选
  9. let firstItem=productList.every(item=>{
  10. return item.checked==true;
  11. })//所有二级勾选控制一级勾选,然后让全选勾选,或者不勾选
  12. if(firstItem){
  13. this.checkAll=true;
  14. }else{
  15. this.checkAll=false;
  16. }
  17. }else{
  18. item.checked=false;
  19. this.checkAll=false;
  20. }
  21. },
  1. chooseProduct(){
  2. this.saveSelectProduct=[];
  3. this.productList.forEach(item=>[
  4. item.goodList.forEach(subItem=>{
  5. if(subItem.checked==true){
  6. this.saveSelectProduct.push({
  7. goodName:subItem.goodName,
  8. goodId:subItem.id
  9. })
  10. }
  11. })
  12. ]);
  13. this.productVisible=false;
  14.  
  15. let productNameList=this.saveSelectProduct.map(item=>{
  16. return item.goodName
  17. })
  18. this.ruleForm.productJson=productNameList.toString();
  19.  
  20. },

上面是拿到所有勾选的值,然后该干嘛干嘛

vue项目两级全选(多级原理也一样),感觉有点意思,随手一记的更多相关文章

  1. VUE实现简单的全选/全不选

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  2. vue实现商品购物车全选与全不选项目实战

    项目需求: 实现一个购物车 全选框实现对商家和商品的全选 商家全选框实现对当前商家所有商品的全选 取消其中一个商品则取消对应商家全选和全选框 选中一个商家下的所有商品则勾选对应商家的全选框,不勾选全选 ...

  3. vue中的checkbox全选和反选

    前几天有个博客园的朋友问小颖,小颖之前写的vue2.0在table中实现全选和反选  .Vue.js实现checkbox的全选和反选,为什么他将里面的js复制下来,但是实现不了全选和反选.小颖当时看他 ...

  4. 第八十二篇:Vue购物车(三) 实现全选功能

    好家伙, 继续完善购物车相应功能 1.如何实现全选和反全选 1.1.全选框的状态显示(父传子) 来一波合理分析: 在页面中,有三个商品中 三个商品中的第二个未选择, 我么使用一个计算属性(fullSt ...

  5. vue day7 table checkbox 全选

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  6. vue实现简单的全选、反选、不选

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. vue的el-select标签全选以及出现需要有禁用选项

    首先说一下遇到这种问题的解决思路吧,很简单先去https://element.eleme.cn/#/zh-CN 这个官网上找到对应的需求,然后就是拼接数据的问题. 以下是全选的例子: <el-s ...

  8. vue+vant 购物车的全选和反选

    https://blog.csdn.net/wjswangjinsheng/article/details/91392694

  9. vue 项目 多选 问题

    近期 vue 项目用到多选功能,引用的elementUI的级联多选 Cascader,但是没有效果. 后来发现是elementUI版本问题,我们项目用的是2.7.2版本,版本太低. 后来 卸载了 重新 ...

随机推荐

  1. VMare Workstation 12 安装 AsteriskNow freePBX

    一.准备工作 VMware 12 安装好的电脑 AsteriskNow iso文件  官网地址 https://www.asterisk.org/downloads 本人提供相关分享:https:// ...

  2. Python课程第三天作业

    一.统计⽂件数据中出现的的所有字符与该字符出现的个数(不区分⼤⼩写,标点与空格也算) ⽂件内容: hello friend, can you speak English! # 结果: { 'h': 1 ...

  3. redis在实践中的一些常见问题以及优化思路

    1.fork耗时导致高并发请求延时 RDB和AOF的时候,其实会有生成RDB快照,AOF rewrite,耗费磁盘IO的过程,主进程fork子进程 fork的时候,子进程是需要拷贝父进程的空间内存页表 ...

  4. n2n网络穿透内网

    目录 前言 配置 网络拓扑: 公网服务器的配置 公司电脑的配置 家里笔记本的配置 注意事项 使用n2n网络 n2n的各edge之间传输数据 补充:NAT类型 后记 前言 在家里的时候比较经常需要对公司 ...

  5. python 日期换算星期 蔡勒公式

    #!/usr/bin/env python # encoding: utf-8 #coding=utf-8 date_star={ ':'星期一', ':'星期二', ':'星期三', ':'星期四' ...

  6. matlab-单位圆内射线数次反射

    转载自 https://zhidao.baidu.com/question/2268408219692883828.html 先贴代码和放图,然后我再做出一点解释(其实只是觉得这个思路好厉害,所以想保 ...

  7. Java的注解总结

    java 1.5开始引入了注解和反射,正确的来说注解是反射的一部分,没有反射,注解无法正常使用,但离开注解,反射依旧可以使用.Java的注解详解和自定义注解: https://blog.csdn.ne ...

  8. 1_Python历史及入门

    前提:简述CPU 内存 硬盘 操作系统 应用程序CPU:计算机的运算核心和控制核心,好像人类的”大脑“内存:负责数据与CPU直接数据交流处理,将临时数据和应用程序加载到内存,然后在交由CPU处理. 造 ...

  9. Centos7】hostnamectl 设置主机名

    Centos7中提供了设置主机名的工具 hostnamectl hostname有三种状态 static(永久) transient(瞬态) pretty (灵活) 查看主机名状态 [oracle@h ...

  10. visual studio开启多核编译方法《转》

    原文:https://blog.csdn.net/acaiwlj/article/details/50240625 visual studio在编译时可以启动多核并行编译,以减少编译所需时间.话不多说 ...