【多选框、表格全选】element el-checkbox、el-table

Vue.js实现表格全选与多选功能,
这篇文章展示了如何在Vue.js应用中实现多选框全选功能,特别是针对表格数据。通过使用el-checkbox组件来处理全选和单选的逻辑,以及el-table的selection-change事件来跟踪选中项。同时,文章也提到了分页和部门列表的加载。

话不多说 先看效果:
多选框:
请添加图片描述
表格全选:
请添加图片描述

<template>
  <div>
        <div class="titleLabel">
          <div class="lineStyle"></div>
          统计部门
        </div>
        <div style="display: flex">
          <el-checkbox
            style="margin-right: 20px"
            :indeterminate="isIndeterminate"
            v-model="departmentCheckAll"
            @change="handleCheckAllChange"
            >全选</el-checkbox
          >
          <el-checkbox-group
            v-model="selectedItems"
            @change="handleCheck(selectedItems)"
          >
            <el-checkbox
              v-for="item in department"
              :key="item.id"
              :label="item.id"
              >{{ item.name }}</el-checkbox
            >
          </el-checkbox-group>
        </div>
      <div>
          <el-tabs v-model="form.pageTab" @tab-click="changeTab">
            <el-tab-pane name="1">
                <div slot="label">已关联({{sumAll['rel']}}</div>
            </el-tab-pane>
            <el-tab-pane name="0">
                <div slot="label">未关联({{sumAll['notRel']}}</div>
            </el-tab-pane>
        </el-tabs>
        <el-table :data="tableData" stripe border :header-cell-style="{'text-align':'center'}" size="small" ref="table"
                  @selection-change="handleChange" :row-key="row=>row.id">
            <el-table-column type="selection" :reserve-selection="true" :selectable="selectableAll" align="center"></el-table-column>
            <el-table-column label="单位名称" align="center" prop="name"></el-table-column>
            <el-table-column label="统一社会信用代码" align="center"></el-table-column>
        </el-table>
        <br>
        <!-- 分页-->
        <el-form :inline="true">
            <el-form-item >
                <div v-if="where">
                    <span v-if="!selectAll">
                    已选:{{ relIds.length }}/{{ total }}
                    </span>
                    <span v-else> 已选:{{ total }}/{{ total }} </span>
                    <span>
                        <el-button
                            style="margin-left: 10px"
                            type="primary"
                            v-if="!selectAll"
                            plain
                            size="small"
                            @click="all()"
                            >全选所有
                        </el-button>
                        <el-button
                            style="margin-left: 10px"
                            type="primary"
                            v-else
                            plain
                            size="small"
                            @click="all()"
                            >取消全选
                        </el-button>
                    </span>
                </div>
            </el-form-item>
            <el-form-item style="float: right">
                <!-- 分页-->
                <el-pagination
                    align="right"
                    background
                    layout="prev, pager, next,total"
                    :current-page.sync="form['pageNum']"
                    :page-size.sync="form['pageSize']"
                    @current-change="jump"
                    @size-change="resize"
                    :total="total"
                ></el-pagination>
            </el-form-item>
        </el-form>
      </div>
    </el-dialog>
  </div>
</template>

<script>
import { departmentList } from "@/api/assets/assetArchives";
export default {
  data() {
    return {
      form: {},
      dialogVisible: false,
      isIndeterminate: false,
      department: [], //部门
      departmentCheckAll: false,
      selectedItems: [],

      relIds:[],
      total:0,
      selectAll:false, //表格是否全选
    };
  },
  methods: {
		    show() {
		      this.departmentList();
		      this.dialogVisible = true;
		    },
		    departmentList() {
		      departmentList({ type: "INNER", pagination: false }).then((data) => {
		        this.department = data["items"];
		        // this.selectedItems = [132,51] //回显选中的部门(到时候应该是把check为true的id筛选出来)
		      });
		    },
		    handleCheck(value) {
		      let checkedCount = value.length;
		      this.departmentCheckAll = checkedCount === this.department.length;
		      this.isIndeterminate =
		        checkedCount > 0 && checkedCount < this.department.length;
		    },
		    handleCheckAllChange(val) {
		      this.selectedItems = val
		        ? this.department.map((item) => {
		            return item.id;
		          })
		        : [];
		      this.isIndeterminate = false;
		    },
                //选择
            handleChange(val) {
                let arr = []
                val.map(item => {
                    arr.push(item.id)
                })
                this.relIds = arr;
            },
   
            //全选
            all() {
                let title = this.selectAll ? "取消默认全选" : "默认全选";
                this.$confirm("此操作将" + title + "所有,是否确认继续?", "提示", {
                    confirmButtonText: "确定",
                    cancelButtonText: "取消",
                    type: "warning",
                }).then(() => {
                    // 全选表格中的所有数据
                    this.selectAll = !this.selectAll;
                    if (this.selectAll) this.toggleSelection(this.tableData);
                    else this.toggleSelection();
                });
            },
            //点击全选时  默认不能进行修改
            selectableAll() {
                return !this.selectAll;
            },
            //选中状态标志
            toggleSelection(rows) {
                if (this.relIds) this.$refs.table.clearSelection();
                if (rows) {
                    rows.forEach((row) => {
                    this.$refs.table.toggleRowSelection(row);
                    });
                } else {
                    this.$refs.table.clearSelection();
                }
            },
            //分页情况
            jump(e) {
                this.form.pageNum = e;
                this.list();
            },
            resize(e) {
                this.form.pageSize = e;
                this.list();
            },
  },
};
</script>
在 Vue3 中使用 `el-table` 组件时,如果希望隐藏全选复选框(即表格左上角的复选框),可以通过设置 `type="selection"` 的列来控制其显示或隐藏。Element Plus 提供了 `show-overflow-tooltip` 和 `reserve-selection` 等属性,但并没有直接提供 `hide-select-all` 的选项。因此,可以通过 CSS 或 JavaScript 的方式实现隐藏全选复选框的效果。 ### 方法一:使用 CSS 隐藏全选复选框 通过定位 `.el-table__header` 中的全选复选框,使用 CSS 隐藏它: ```css .el-table__header th.el-table__cell .el-checkbox { display: none; } ``` 这种方法适用于全局隐藏所有 `el-table` 的全选复选框,如果只想对特定表格生效,可以添加自定义类名限定选择器范围。 --- ### 方法二:通过设置 `type="selection"` 列的 `reserve-selection` 属性 虽然 `reserve-selection` 本身用于保留某些行的选中状态,但结合其他逻辑,可以间接实现隐藏全选功能。例如: ```vue <template> <el-table :data="tableData" style="width: 100%"> <el-table-column type="selection" :reserve-selection="true"></el-table-column> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> </el-table> </template> ``` 这种方式并不能完全隐藏全选复选框,但可以控制某些行不被取消选中。 --- ### 方法三:自定义列渲染,完全不渲染 selection 列 如果不希望渲染任何与 selection 相关的内容,可以直接不在模板中添加 `type="selection"` 的列,而是通过自定义列和事件处理实现部分行的选中功能。例如: ```vue <template> <el-table :data="tableData" style="width: 100%" @selection-change="handleSelectionChange"> <!-- 手动添加一个自定义列 --> <el-table-column label="选择"> <template #default="scope"> <el-checkbox v-model="scope.row.selected" @change="toggleRowSelection(scope.row)"></el-checkbox> </template> </el-table-column> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> </el-table> </template> <script setup> import { ref } from 'vue'; const tableData = ref([ { id: 1, name: '张三', age: 25, selected: false }, { id: 2, name: '李四', age: 30, selected: false }, ]); const handleSelectionChange = (selection) => { // 处理选中行变化逻辑 }; const toggleRowSelection = (row) => { row.selected = !row.selected; }; </script> ``` 这种方法完全绕过了 `type="selection"` 的列,实现了更灵活的控制,同时避免了全选复选框的出现[^3]。 --- ### 总结 - **CSS 隐藏**:适用于快速实现,但影响所有表格- **`reserve-selection` 属性**:不能完全隐藏全选复选框,但可以控制某些行的选中状态。 - **自定义列渲染**:最灵活的方式,适合需要精细控制选中逻辑的场景。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值