当前位置:首页 > VUE

vue实现列全选框

2026-01-20 06:18:15VUE

实现全选框的基本逻辑

在Vue中实现表格列的全选框功能,需要结合v-model和计算属性来管理选中状态。全选框的状态应反映当前页所有行的选中情况,同时点击全选框应能切换所有行的选中状态。

vue实现列全选框

<template>
  <table>
    <thead>
      <tr>
        <th>
          <input 
            type="checkbox" 
            v-model="allSelected"
            @change="toggleAll"
          >
        </th>
        <!-- 其他表头列 -->
      </tr>
    </thead>
    <tbody>
      <tr v-for="item in items" :key="item.id">
        <td>
          <input 
            type="checkbox" 
            v-model="selectedItems"
            :value="item.id"
          >
        </td>
        <!-- 其他数据列 -->
      </tr>
    </tbody>
  </table>
</template>

核心代码实现

<script>
export default {
  data() {
    return {
      items: [...], // 表格数据
      selectedItems: [] // 存储选中项的ID
    }
  },
  computed: {
    allSelected: {
      get() {
        return this.selectedItems.length === this.items.length && 
               this.items.length > 0
      },
      set(value) {
        this.selectedItems = value ? this.items.map(item => item.id) : []
      }
    }
  },
  methods: {
    toggleAll() {
      this.allSelected = !this.allSelected
    }
  }
}
</script>

处理分页场景

当表格存在分页时,需要区分"当前页全选"和"全部数据全选"两种模式:

vue实现列全选框

computed: {
  currentPageAllSelected() {
    const currentPageIds = this.paginatedItems.map(item => item.id)
    return currentPageIds.every(id => this.selectedItems.includes(id))
  }
},
methods: {
  toggleCurrentPage() {
    const currentPageIds = this.paginatedItems.map(item => item.id)
    const allSelected = currentPageIds.every(id => 
      this.selectedItems.includes(id)
    )

    if (allSelected) {
      this.selectedItems = this.selectedItems.filter(
        id => !currentPageIds.includes(id)
      )
    } else {
      const newSelected = [...new Set([
        ...this.selectedItems,
        ...currentPageIds
      ])]
      this.selectedItems = newSelected
    }
  }
}

样式优化建议

为提升用户体验,可以添加以下CSS样式:

<style scoped>
/* 使复选框对齐 */
th, td {
  text-align: center;
}

/* 悬浮效果 */
tr:hover {
  background-color: #f5f5f5;
}

/* 选中行高亮 */
tr.selected {
  background-color: #e6f7ff;
}
</style>

性能优化方案

对于大数据量场景,建议使用以下优化手段:

// 使用Set代替数组提高查找效率
computed: {
  selectedItemsSet() {
    return new Set(this.selectedItems)
  },
  allSelected() {
    return this.items.length > 0 && 
           this.items.every(item => this.selectedItemsSet.has(item.id))
  }
}

完整组件示例

<template>
  <div>
    <div class="controls">
      <span>已选择 {{ selectedItems.length }} 项</span>
      <button 
        v-if="selectedItems.length"
        @click="selectedItems = []"
      >
        取消选择
      </button>
    </div>

    <table>
      <thead>
        <tr>
          <th>
            <input
              type="checkbox"
              :indeterminate="indeterminate"
              v-model="allSelected"
            >
          </th>
          <!-- 其他列 -->
        </tr>
      </thead>
      <tbody>
        <tr 
          v-for="item in items" 
          :key="item.id"
          :class="{ selected: isSelected(item.id) }"
        >
          <td>
            <input
              type="checkbox"
              v-model="selectedItems"
              :value="item.id"
            >
          </td>
          <!-- 其他列 -->
        </tr>
      </tbody>
    </table>
  </div>
</template>

<script>
export default {
  props: ['items'],
  data() {
    return {
      selectedItems: []
    }
  },
  computed: {
    allSelected: {
      get() {
        return this.selectedItems.length === this.items.length && 
               this.items.length > 0
      },
      set(value) {
        this.selectedItems = value ? this.items.map(item => item.id) : []
      }
    },
    indeterminate() {
      return this.selectedItems.length > 0 && 
             this.selectedItems.length < this.items.length
    }
  },
  methods: {
    isSelected(id) {
      return this.selectedItems.includes(id)
    }
  }
}
</script>

标签: 全选vue
分享给朋友:

相关文章

vue 实现拖拽

vue 实现拖拽

Vue 实现拖拽功能 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性和相关事件实现拖拽功能。 <template> &l…

vue实现fullpage

vue实现fullpage

Vue 实现 FullPage 效果 在 Vue 中实现全屏滚动(FullPage)效果可以通过多种方式完成,以下是几种常见的方法: 使用现有库 vue-fullpage.js 安装 vue-ful…

vue拖动实现

vue拖动实现

实现 Vue 拖动功能的方法 使用 HTML5 拖放 API 在 Vue 中可以利用 HTML5 的原生拖放 API 实现拖动功能。通过 draggable 属性标记可拖动元素,结合 @dragsta…

vue实现menu

vue实现menu

Vue 实现 Menu 的方法 使用 Element UI 的 Menu 组件 Element UI 提供了现成的 Menu 组件,适合快速实现导航菜单。安装 Element UI 后,可以直接使用…

vue 实现跳转

vue 实现跳转

Vue 实现页面跳转的方法 在 Vue 中实现页面跳转通常可以通过以下几种方式实现,具体选择取决于项目需求和技术栈(如是否使用 Vue Router)。 使用 Vue Router 进行编程式导航…

vue实现uuid

vue实现uuid

使用 uuid 库生成 UUID 在 Vue 项目中,可以使用 uuid 库来生成 UUID。安装依赖: npm install uuid 在 Vue 组件中使用: import { v4 as…