2行JS代码实现Vue全选和反选

实现效果:

第一行:子选项的选中状态 等于 全选框的状态

this.letters.forEach(item => item.check = this.checkAll)

第二行: 使用数组 every 方法的特性,数组的每一项均满足某一条件时,结果为 true

也可以使用数组的 filter方法,判断返回子选项为 true的列表的长度,等同于数据源的长度时,可认定为全选状态,否则非全选

this.checkAll = this.letters.filter(item => item.check).length == this.letters.length

this.checkAll = this.letters.every(item => item.check)

完整 demo 参考:

<template>
  <div>
    <table border="1">
      <thead>
        <tr>
          <th><input type="checkbox" v-model="checkAll" @change="checkAllChange"> </th>
          <th>字母</th>
          <th>操作</th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="item in letters" :key="item.id">
          <td><input type="checkbox" v-model="item.check" @change="checkChange"></td>
          <td>{{item.letter}}</td>
          <td><button>删除</button></td>
        </tr>
      </tbody>
    </table>
  </div>
</template>
<script>
export default {
  data() {
    return {
      checkAll: false,
      letters: [
        { letter: 'A', id: 'A', check: false },
        { letter: 'B', id: 'B', check: false },
        { letter: 'C', id: 'C', check: false },
        { letter: 'D', id: 'D', check: false },
        { letter: 'E', id: 'E', check: false },
        { letter: 'F', id: 'F', check: false }
      ]
    }
  },
  methods: {
    checkAllChange() {
      this.letters.forEach(item => item.check = this.checkAll)
    },
    checkChange() {
      //   this.checkAll = this.letters.filter(item => item.check).length == this.letters.length   // 1. 使用 filter方法
      this.checkAll = this.letters.every(item => item.check)   // 2. 使用 every 方法
    }
  }
}

</script>
<style scoped>
table {
  border: 1px solid #ccc;
  width: 500px;
  text-align: center;
  line-height: 37px;
  border-collapse: collapse;
}
button {
  border-radius: 5px;
  border: 1px solid #ccc;
  padding: 2px 10px;
}
</style>
posted @ 2022-09-01 07:31  Echoyya、  阅读(93)  评论(0编辑  收藏  举报