elementui-table列隐藏展示:支持全选反选重置,以及列字段值错位问题解决

该博客详细介绍了如何在Vue.js应用中实现表格组件的列展示与隐藏功能,包括全选、重置、列选择的交互逻辑,并展示了搜索和刷新操作。代码中使用了Element UI库,通过监听列选择变化来动态调整表格列显示,同时提供了搜索和刷新按钮的交互处理。此外,还展示了如何根据用户选择的列进行表格的重绘和布局更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先来看看效果图

默认加载效果:

 全选后的效果:

 后台框架是若依系统,不多说线上组件代码,代码写在了若依的RightToolbar中,代码如下

<template>
  <div class="top-right-btn">
    <el-row>
      <el-tooltip
        class="item"
        effect="dark"
        content="列展示隐藏"
        placement="top"
        v-if="showColumn"
      >
        <el-popover :width="popoverWidth" trigger="click">
          <el-checkbox
            v-model="checkAll"
            label="全选"
            :indeterminate="isIndeterminateModel"
            @change="handleCheckAllChange"
            class="mb10"
          />
          <el-button type="text" @click="initColumn" class="ml20">
            重置
          </el-button>
          <el-checkbox-group
            v-model="selecteds"
            @change="handleCheckedmodelChange"
          >
            <el-checkbox
              v-for="item in columnHeadersArr"
              :label="item.title"
              :key="item.title"
              class="el-checkbox-width"
            ></el-checkbox>
          </el-checkbox-group>
          <el-button
            size="mini"
            slot="reference"
            circle
            icon="el-icon-s-operation"
          />
        </el-popover>
      </el-tooltip>
      <el-tooltip
        class="item ml10"
        effect="dark"
        :content="showSearch ? '隐藏搜索' : '显示搜索'"
        placement="top"
        v-if="showSearchIcon"
      >
        <el-button
          size="mini"
          circle
          icon="el-icon-search"
          @click="toggleSearch()"
        />
      </el-tooltip>
      <el-tooltip class="item" effect="dark" content="刷新" placement="top">
        <el-button
          size="mini"
          circle
          icon="el-icon-refresh"
          @click="refresh()"
        />
      </el-tooltip>
    </el-row>
  </div>
</template>
<script>
import { deepClone } from "@/utils/index";
export default {
  name: "RightToolbar",
  data() {
    return {
      //初始化隐藏展示
      initSelecteds: [],
      //已选择的项
      selecteds: [],
      //所有数据
      allColumns: [],
      columnHeadersArr: [],
      checkAll: false,
      isIndeterminateModel: false
    };
  },
  props: {
    //默认不展示列的展示与隐藏按钮
    showColumn: {
      type: Boolean,
      default: false
    },
    //弹出框宽度
    popoverWidth: {
      type: Number,
      default: 200
    },
    //表格所有列头
    columnHeaders: {
      type: Array,
      default: () => []
    },
    //选中展示的列
    columnSelecteds: {
      type: Array,
      default: () => []
    },
    showSearch: {
      type: Boolean,
      default: true
    },
    showSearchIcon: {
      type: Boolean,
      default: true
    }
  },
  watch: {
    //监听列展示与隐藏
    selecteds(newArrayVal) {
      // 计算为被选中的列标题数组
      var nonSelecteds = this.columnHeaders
        .filter(item => newArrayVal.indexOf(item.title) == -1)
        .map(item => item.title);
      // 根据计算结果进行表格重绘
      this.columnHeaders.filter(item => {
        let isNonSelected = nonSelecteds.indexOf(item.title) != -1;
        if (isNonSelected) {
          // 隐藏未选中的列
          item.isShow = false;
          this.$nextTick(() => {
            this.$emit("handleTableColumn", newArrayVal);
          });
        } else {
          // 显示已选中的列
          item.isShow = true;
          this.$nextTick(() => {
            this.$emit("handleTableColumn", newArrayVal);
          });
        }
      });
    }
  },
  mounted() {
    if (this.showColumn) {
      setTimeout(() => {
        this.initSelecteds = deepClone(this.columnSelecteds);
        this.selecteds = deepClone(this.columnSelecteds);
        this.allColumns = [];
        for (let item of this.columnHeaders) {
          if (item.selectShow == 1) {
            this.allColumns.push(item.title);
          }
        }
        //弹窗只展示需要控制的字段
        let arr = this.columnHeaders.filter(item => {
          return item.selectShow == 1;
        });
        this.columnHeadersArr = arr;
      }, 20);
    }
  },
  methods: {
    //初始化隐藏展示列
    initColumn() {
      this.selecteds = deepClone(this.initSelecteds);
      this.isIndeterminateModel = false;
      this.$nextTick(() => {
        this.$emit("handleTableColumn", this.selecteds);
      });
      this.checkAll = false;
      this.$forceUpdate();
    },
    //全选、反选
    handleCheckAllChange(val) {
      this.selecteds = val ? this.allColumns : [];
      this.isIndeterminateModel = false;
    },
    handleCheckedmodelChange(value) {
      const modelLength = value.length;
      this.checkAll = modelLength === this.allColumns.length;
      this.isIndeterminateModel =
        modelLength > 0 && modelLength < this.allColumns.length;
    },
    //搜索
    toggleSearch() {
      this.$emit("update:showSearch", !this.showSearch);
    },
    //刷新
    refresh() {
      this.$emit("queryTable");
    }
  }
};
</script>
<style lang="scss" scoped>
.el-checkbox-width {
  width: 100px;
  height: 25px;
}
</style>

调用组件:

<right-toolbar
    :popoverWidth="500"
    :showColumn="true"
    :columnHeaders="columnHeaders"
    :columnSelecteds="columnSelecteds"
    @handleTableColumn="handleTableColumn"
   :showSearch.sync="showSearch"
   @queryTable="getList"
>
</right-toolbar>

<el-table
        ref="dataTable"
        v-loading="loading"
        :data="dataTable"
        @selection-change="handleSelectionChange"
        stripe
        v-show="columnSelecteds.length > 0"
      >
        <el-table-column
          v-if="columnHeaders[0].isShow"
          :key="columnHeaders[0].index"
          type="selection"
          width="45"
          align="center"
        />
        <el-table-column
          v-if="columnHeaders[1].isShow"
          :key="columnHeaders[1].index"
          label="用户ID"
          align="center"
          prop="personId"
        />
        <el-table-column
          v-if="columnHeaders[2].isShow"
          :key="columnHeaders[2].index"
          label="注册时间"
          align="center"
          width="100"
          prop="personCreateTime"
        />
        <el-table-column
          v-if="columnHeaders[3].isShow"
          :key="columnHeaders[3].index"
          label="姓名"
          align="center"
          width="100"
          prop="personName"
        />
        <el-table-column
          v-if="columnHeaders[4].isShow"
          :key="columnHeaders[4].index"
          label="医院"
          align="center"
          prop="hospitalName"
        />
        <el-table-column
          v-if="columnHeaders[5].isShow"
          :key="columnHeaders[5].index"
          label="性别"
          align="center"
          prop="personSex"
        >
          <template slot-scope="scope">
            <span v-if="scope.row.personSex == 1">男</span>
            <span v-if="scope.row.personSex == 2">女</span>
          </template>
        </el-table-column>
        <el-table-column
          v-if="columnHeaders[6].isShow"
          :key="columnHeaders[6].index"
          label="手机"
          align="center"
          prop="personPhone"
          width="120px"
        />
        <el-table-column
          v-if="columnHeaders[7].isShow"
          :key="columnHeaders[7].index"
          label="责任医生"
          :show-overflow-tooltip="true"
          align="center"
          prop="nickName"
        />
        <el-table-column
          v-if="columnHeaders[8].isShow"
          :key="columnHeaders[8].index"
          label="健康管理师"
          align="center"
          width="120"
          prop="otherInformation.healthyManageUserName"
        />
        <!-- :show-overflow-tooltip="true" -->
        <el-table-column
          v-if="columnHeaders[9].isShow"
          :key="columnHeaders[9].index"
          label="疾病信息"
          align="center"
          prop="illStr"
        />
        <!-- <el-table-column
          v-if="columnHeaders[10].isShow"
          :key="columnHeaders[10].index"
          label="干预开始时间"
          :show-overflow-tooltip="true"
          align="center"
          prop="gykssj"
        />
        <el-table-column
          v-if="columnHeaders[11].isShow"
          :key="columnHeaders[11].index"
          label="干预结束时间"
          :show-overflow-tooltip="true"
          align="center"
          prop="gyjssj"
        /> -->

        <template v-if="showWeight">
          <el-table-column
            v-if="columnHeaders[12].isShow"
            :key="columnHeaders[12].index"
            label="身高(cm)"
            align="center"
            prop="personHeight"
          />
          <el-table-column
            v-if="columnHeaders[13].isShow"
            :key="columnHeaders[13].index"
            label="BMI"
            align="center"
            prop="bmi"
          />
          <el-table-column
            v-if="columnHeaders[14].isShow"
            :key="columnHeaders[14].index"
            label="原始体重(kg)"
            :show-overflow-tooltip="true"
            align="center"
            prop="personWeight"
          />
          <el-table-column
            v-if="columnHeaders[15].isShow"
            :key="columnHeaders[15].index"
            label="最新体重(kg)"
            :show-overflow-tooltip="true"
            align="center"
            prop="personNewWeight"
          />
          <el-table-column
            v-if="columnHeaders[16].isShow"
            :key="columnHeaders[16].index"
            label="理想体重(kg)"
            align="center"
            width="120"
            prop="idealWeight"
          />
        </template>
        <template v-if="showExamination">
          <el-table-column
            v-if="columnHeaders[17].isShow"
            :key="columnHeaders[17].index"
            label="体检日期"
            width="100"
            align="center"
            prop="detectionDay"
          />
          <el-table-column
            v-if="columnHeaders[18].isShow"
            :key="columnHeaders[18].index"
            label="体检次数"
            align="center"
            prop="detectionNum"
          />
          <el-table-column
            v-if="columnHeaders[19].isShow"
            :key="columnHeaders[19].index"
            label="体检单位"
            align="center"
            prop="detectionHospital"
          />
        </template>
        <el-table-column
          v-if="columnHeaders[20].isShow"
          :key="columnHeaders[20].index"
          label="评估状态"
          align="center"
          prop="assessmentStatus"
        />
        <!-- <el-table-column
        label="干预类型"
        align="center"
        prop="personInter"
        width="125px"
      >
        <template slot-scope="scope">
          <el-select
            v-model="scope.row.personInter"
            placeholder="请选择"
            @change="changeInter(this, scope)"
          >
            <el-option
              v-for="item in options"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            >
            </el-option>
          </el-select>
        </template>
      </el-table-column> -->
        <el-table-column
          v-if="columnHeaders[21].isShow"
          :key="columnHeaders[21].index"
          label="患者方案"
          align="center"
          prop="planType"
        >
          <template slot-scope="scope">
            <el-button
              size="mini"
              type="text"
              v-if="scope.row.planType == 1"
              @click="toPersonScheme(scope.row)"
            >
              智能方案
            </el-button>
            <span v-if="scope.row.planType == 2">强化干预</span>
            <span v-if="scope.row.planType == 0"></span>
          </template>
        </el-table-column>
        <el-table-column
          v-if="columnHeaders[22].isShow"
          :key="columnHeaders[22].index"
          label="回访时间"
          align="center"
          prop="lastRecordTime"
        />
      </el-table>

data() {
//表头信息
//selectShow:在筛选弹窗李是否需要展示
      columnHeaders: [
        { index: -1, title: "选择框", isShow: true, selectShow: 1 },
        { index: 0, title: "用户ID", isShow: true, selectShow: 1 },
        { index: 1, title: "注册时间", isShow: false, selectShow: 1 },
        { index: 2, title: "姓名", isShow: true, selectShow: 1 },
        { index: 3, title: "医院", isShow: false, selectShow: 1 },
        { index: 4, title: "性别", isShow: true, selectShow: 1 },
        { index: 5, title: "手机", isShow: true, selectShow: 1 },
        { index: 6, title: "责任医生", isShow: true, selectShow: 1 },
        { index: 7, title: "健康管理师", isShow: false, selectShow: 1 },
        { index: 8, title: "疾病信息", isShow: true, selectShow: 1 },
        { index: 9, title: "干预开始时间", isShow: true, selectShow: 0 },
        { index: 10, title: "干预结束时间", isShow: true, selectShow: 0 },
        { index: 11, title: "身高(cm)", isShow: false, selectShow: 1 },
        { index: 12, title: "BMI", isShow: false, selectShow: 1 },
        { index: 13, title: "原始体重(kg)", isShow: true, selectShow: 1 },
        { index: 14, title: "最新体重(kg)", isShow: true, selectShow: 1 },
        { index: 15, title: "理想体重(kg)", isShow: false, selectShow: 1 },
        { index: 16, title: "体检日期", isShow: false, selectShow: 1 },
        { index: 17, title: "体检次数", isShow: false, selectShow: 1 },
        { index: 18, title: "体检单位", isShow: false, selectShow: 1 },
        { index: 19, title: "评估状态", isShow: false, selectShow: 1 },
        { index: 20, title: "患者方案", isShow: true, selectShow: 1 },
        { index: 21, title: "回访时间", isShow: false, selectShow: 1 }
      ],
      //默认展示已选择的项
      columnSelecteds: [
        "选择框",
        "用户ID",
        "姓名",
        "性别",
        "手机",
        "责任医生",
        "疾病信息",
        "原始体重(kg)",
        "最新体重(kg)",
        "患者方案"
      ],
}


//展示隐藏列后table重绘
    handleTableColumn(val) {
      this.columnSelecteds = val;
      this.$nextTick(() => {
        this.$refs.dataTable.doLayout();
      });
    },

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值