vue简易表格全选

最近以为公司业务需要不让用我最爱的**elementUI**了,刚开始感觉没啥,后来真到开始写了,真的就懵逼,组件不让用啥都得自己写了。。

最常用表格全选都都变成了一个坎。

对于表格全选,我们一定能想到就是判断表格的个数和表格选中的个数相比较,相等全选按钮就处于选中状态,不等就不选中,可是这又不是**jQuery**,选择器又不能用。对于刚接触vue半年而且大部分时间都在用饿了么组件的我真的是不知所措。

搜了很多资料,看到很多解决方案都是要在数据中加入**checked**状态,我是拒绝的,就算我愿意后台哥哥也不愿意啊,这不是脏数据嘛!

而且还不是组件式的,谁想用都得copy一大坨代码,我相信我们组长是拒绝的。感觉好难哦。。。

但是问题还是要解决,饭还是要吃的。

回家的想了想,看了看vue的官网,灵感就来了,很快就把解决了。

你以为就这就完了??



全选反选只是checkbox选中,我们的选中是为了获取数据啊,不然选它干啥!

刚开始想为每行的checkbox的click事件传值,后来具体操作发现这是有bug的。然后又各种尝试最后解决了问题。

下面上代码:

Vue.component('check-all', {
  template: '<input type="checkbox" @click="checkall()" />',
  props: {
    // 必须为string类型
    data: {
    type: String,
    },
  },
  methods: {
    checkall: function() {
    var data = this.data?this.data:"list";
    var row = this.$root.$refs[data].rows;
    var arr = [];
    var sels = [];
    for (var i = 1; i < row.length; i++) {
      if (row[i].children[0].children[0].checked) {
      arr.push(row[i].children[0].children[0].checked);
      };
    };
    if (arr.length === row.length - 1) {
      for (var i = 1; i < row.length; i++) {
  
      row[i].children[0].children[0].checked = false;
      }
    } else {
      for (var i = 1; i < row.length; i++) {
      row[i].children[0].children[0].checked = true;
      sels.push(this.$root[data][row[i - 1].rowIndex]);
      }
    }
    this.$emit('ymhy-select-all', sels)
    }
  }
  })
复制代码

Vue.component('check-item', {
  template: '<input type="checkbox" @click="checkitem()" />',
  // 技术上 data 的确是一个函数了,因此 Vue 不会警告,
  // 但是我们却给每个组件实例返回了同一个对象的引用
  props: {
    // 数组/对象的默认值应当由一个工厂函数返回
    data: {
    type: String,
    },
  },
  data: function() {
    return {}
  },
  methods: {
    checkitem: function() {
    var data = this.data ? this.data : "list";
    var row = this.$root.$refs[data].rows;
    var arr = [];
    var sels = [];
    for (var i = 1; i < row.length; i++) {
      if (row[i].children[0].children[0].checked) {
      arr.push(row[i].children[0].children[0].checked);
      sels.push(this.$root[data][row[i - 1].rowIndex]);
      };
    }
   
    if (arr.length === row.length - 1) {
      row[0].children[0].children[0].checked = true;
    } else {
      row[0].children[0].children[0].checked = false;
    }
    this.$emit('ymhy-select-item', sels)
    },
  }
  })
复制代码

想自己动手尝试的同学可以点击[这里](https://jsfiddle.net/Denny_code/84d7224x/2/)

这是的实现方法,如果大家还有更好的方式,还请赐教,


代码拙劣,如有错误,望指出。 

本人原创 如需转载请注明出处 bestzhengke.com/2017/12/14/…







转载于:https://juejin.im/post/5a323e8b5188257dd239abd7

Vue.js中,实现商品表格全选框通常涉及到数据绑定、事件处理以及状态管理。以下是实现这个功能的一般步骤: 1. **HTML结构**: ```html <table> <thead> <tr> <th><input type="checkbox" v-model="selectAll"></th> <!-- 商品列表 --> <th>商品名称</th> <th>价格</th> <!-- 其他列... --> </tr> </thead> <tbody> <tr v-for="(product, index) in products" :key="index"> <td><input type="checkbox" v-model="product.selected" @change="toggleSelection(index)"></td> <!-- 商品详细信息 --> <td>{{ product.name }}</td> <td>{{ product.price }}</td> </tr> </tbody> </table> ``` 这里的`selectAll`是一个Vuex或者计算属性,用于表示所有商品是否被选中;`product.selected`则是每个商品的单独选中状态。 2. **Vue绑定与事件处理**: - `v-model`用于双向数据绑定,当用户点击全选框或单选框时,数据会自动更新。 - `@change`事件监听单选框的变化,触发`toggleSelection(index)`方法。 3. **方法实现**: ```javascript data() { return { selectAll: false, products: [] } }, methods: { toggleSelection(index) { if (this.selectAll) { this.products[index].selected = true; } else { this.products[index].selected = !this.products[index].selected; } // 如果需要,还可以同步全选框的状态 this.selectAll = this.products.every(product => product.selected); }, // 全选或取消全选操作 toggleAllSelection() { this.products.forEach(product => product.selected = this.selectAll); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值