由于表头过多影响体验感,如何实现表格折叠呢?

因为el-table并没有提供表头收缩扩展的功能,可直接用v-if或者v-show去动态的加载表头。

1.自定义需要折叠展开表头名称

  <el-table-column
      show-overflow-tooltip
      headerAlign="center"
      align="center"
      width="210"
    >
      <template #header>
        <div @click="toggleMonthColumns" class="shouzhi align-content fs16">
          <div>1月-12月订货与报单汇总</div>
          <el-icon size="20" color="#409eff" v-if="state.showMonthColumns"
            ><DArrowLeft
          /></el-icon>
          <el-icon size="20" color="#409eff" v-else><DArrowRight /></el-icon>
        </div>
      </template>

</el-table-column>

2. 展开需要显示的表头通过showMonthColumns状态是否示

<template v-if="state.showMonthColumns">
      <el-table-column
        show-overflow-tooltip
        headerAlign="center"
        align="center"
        prop="DH1"
        label="1月订货"
        min-width="90"
        sortable
      ></el-table-column>
      <el-table-column
        show-overflow-tooltip
        headerAlign="center"
        align="center"
        prop="BD1"
        label="1月报单"
        min-width="90"
        sortable
      ></el-table-column>
      <el-table-column
        show-overflow-tooltip
        headerAlign="center"
        align="center"
        prop="DH2"
        label="2月订货"
        min-width="90"
        sortable
      ></el-table-column>
      <el-table-column
        show-overflow-tooltip
        headerAlign="center"
        align="center"
        prop="BD2"
        label="2月报单"
        min-width="90"
        sortable
      ></el-table-column>
      <el-table-column
        show-overflow-tooltip
        headerAlign="center"
        align="center"
        prop="DH3"
        label="3月订货"
        min-width="90"
        sortable
      ></el-table-column>
      <el-table-column
        show-overflow-tooltip
        headerAlign="center"
        align="center"
        prop="BD3"
        label="3月报单"
        min-width="90"
        sortable
      ></el-table-column>
      <el-table-column
        show-overflow-tooltip
        headerAlign="center"
        align="center"
        prop="DH4"
        label="4月订货"
        min-width="90"
        sortable
      ></el-table-column>
      <el-table-column
        show-overflow-tooltip
        headerAlign="center"
        align="center"
        prop="BD4"
        label="4月报单"
        min-width="90"
        sortable
      ></el-table-column>
      <el-table-column
        show-overflow-tooltip
        headerAlign="center"
        align="center"
        prop="DH5"
        label="5月订货"
        min-width="90"
        sortable
      ></el-table-column>
      <el-table-column
        show-overflow-tooltip
        headerAlign="center"
        align="center"
        prop="BD5"
        label="5月报单"
        min-width="90"
        sortable
      ></el-table-column>
      <el-table-column
        show-overflow-tooltip
        headerAlign="center"
        align="center"
        prop="DH6"
        label="6月订货"
        min-width="90"
        sortable
      ></el-table-column>
      <el-table-column
        show-overflow-tooltip
        headerAlign="center"
        align="center"
        prop="BD6"
        label="6月报单"
        min-width="90"
        sortable
      ></el-table-column>
      <el-table-column
        show-overflow-tooltip
        headerAlign="center"
        align="center"
        prop="DH7"
        label="7月订货"
        min-width="90"
        sortable
      ></el-table-column>
    </template>

核心代码:

//根据状态显示是否折叠展开

const toggleMonthColumns = () => {
  state.showMonthColumns = !state.showMonthColumns;
  forceTableRerender();
};

//表格重新渲染,避免表格格式恢复无效

const forceTableRerender = () => {

  state.tableKey += 1;

};

 效果图:

完整代码:

<template>
  <el-table
    :data="state.list"
    :key="state.tableKey"
    border
    stripe
    row-key="Lv"
    default-expand-all
    :header-cell-style="headerCellStyle"
  >
    <el-table-column label="序号" type="index" width="55" align="center" />
    <el-table-column
      show-overflow-tooltip
      headerAlign="center"
      align="center"
      prop="Lv"
      min-width="90"
      label="层次"
    >
    </el-table-column>
    <el-table-column prop="date" label="Date" />
    <el-table-column prop="name" label="Name" />
    <el-table-column prop="address" label="Address" />

    <!-- 月份汇总列(折叠状态显示) -->
    <el-table-column
      show-overflow-tooltip
      headerAlign="center"
      align="center"
      width="210"
      :cell-style="tableRowClassName"
    >
      <template #header>
        <div @click="toggleMonthColumns" class="shouzhi align-content fs16">
          <div>1月-12月订货与报单汇总</div>
          <el-icon size="20" color="#409eff" v-if="state.showMonthColumns"
            ><DArrowLeft
          /></el-icon>
          <el-icon size="20" color="#409eff" v-else><DArrowRight /></el-icon>
        </div>
      </template>
      <template #default="scope">
        <el-tooltip placement="top">
          <template #content>
            <div>
              1月订货: {{ scope.row.DH1 || 0 }} —— 1月报单:
              {{ scope.row.BD1 || 0 }}
            </div>
            <div>
              2月订货: {{ scope.row.DH2 || 0 }} —— 2月报单:
              {{ scope.row.BD2 || 0 }}
            </div>
            <div>
              3月订货: {{ scope.row.DH3 || 0 }} —— 3月报单:
              {{ scope.row.BD3 || 0 }}
            </div>
            <div>
              4月订货: {{ scope.row.DH4 || 0 }} —— 4月报单:
              {{ scope.row.BD4 || 0 }}
            </div>
            <div>
              5月订货: {{ scope.row.DH5 || 0 }} —— 5月报单:
              {{ scope.row.BD5 || 0 }}
            </div>
            <div>
              6月订货: {{ scope.row.DH6 || 0 }} —— 6月报单:
              {{ scope.row.BD6 || 0 }}
            </div>
          </template>
          <el-text type="primary"> 查看详情 </el-text>
        </el-tooltip>
      </template>
    </el-table-column>

    <!-- 月份详细列(展开状态显示) -->
    <template v-if="state.showMonthColumns">
      <el-table-column
        show-overflow-tooltip
        headerAlign="center"
        align="center"
        prop="DH1"
        label="1月订货"
        min-width="90"
        sortable
      ></el-table-column>
      <el-table-column
        show-overflow-tooltip
        headerAlign="center"
        align="center"
        prop="BD1"
        label="1月报单"
        min-width="90"
        sortable
      ></el-table-column>
      <el-table-column
        show-overflow-tooltip
        headerAlign="center"
        align="center"
        prop="DH2"
        label="2月订货"
        min-width="90"
        sortable
      ></el-table-column>
      <el-table-column
        show-overflow-tooltip
        headerAlign="center"
        align="center"
        prop="BD2"
        label="2月报单"
        min-width="90"
        sortable
      ></el-table-column>
      <el-table-column
        show-overflow-tooltip
        headerAlign="center"
        align="center"
        prop="DH3"
        label="3月订货"
        min-width="90"
        sortable
      ></el-table-column>
      <el-table-column
        show-overflow-tooltip
        headerAlign="center"
        align="center"
        prop="BD3"
        label="3月报单"
        min-width="90"
        sortable
      ></el-table-column>
      <el-table-column
        show-overflow-tooltip
        headerAlign="center"
        align="center"
        prop="DH4"
        label="4月订货"
        min-width="90"
        sortable
      ></el-table-column>
      <el-table-column
        show-overflow-tooltip
        headerAlign="center"
        align="center"
        prop="BD4"
        label="4月报单"
        min-width="90"
        sortable
      ></el-table-column>
      <el-table-column
        show-overflow-tooltip
        headerAlign="center"
        align="center"
        prop="DH5"
        label="5月订货"
        min-width="90"
        sortable
      ></el-table-column>
      <el-table-column
        show-overflow-tooltip
        headerAlign="center"
        align="center"
        prop="BD5"
        label="5月报单"
        min-width="90"
        sortable
      ></el-table-column>
      <el-table-column
        show-overflow-tooltip
        headerAlign="center"
        align="center"
        prop="DH6"
        label="6月订货"
        min-width="90"
        sortable
      ></el-table-column>
      <el-table-column
        show-overflow-tooltip
        headerAlign="center"
        align="center"
        prop="BD6"
        label="6月报单"
        min-width="90"
        sortable
      ></el-table-column>
    </template>

    <el-table-column
      show-overflow-tooltip
      headerAlign="center"
      align="center"
      prop="CDType"
      label="参加方式"
      min-width="90"
    ></el-table-column>

    <el-table-column
      show-overflow-tooltip
      headerAlign="center"
      align="center"
      prop="FCName"
      width="90"
    >
      <template #header>
        <div @click="toggleFCNameColumns" class="shouzhi align-content fs16">
          <div>扶持人</div>
          <el-icon size="20" color="#52c41a" v-if="state.showFCNameColumns"
            ><DArrowLeft
          /></el-icon> 
          <el-icon size="20" color="#52c41a" v-else><DArrowRight /></el-icon>
        </div>
      </template>
      <template v-if="state.showFCNameColumns">
        <el-table-column
          show-overflow-tooltip
          headerAlign="center"
          align="center"
          prop="FCName1"
          label="扶持人1"
          min-width="90"
        >
        </el-table-column>
        <el-table-column
          show-overflow-tooltip
          headerAlign="center"
          align="center"
          prop="FCName2"
          label="扶持人2"
          min-width="90"
        >
        </el-table-column>
      </template>
    </el-table-column>

    <el-table-column
      show-overflow-tooltip
      headerAlign="center"
      align="center"
      prop="FCUId"
      label="扶持人ID"
      min-width="90"
    ></el-table-column>
    <el-table-column
      show-overflow-tooltip
      headerAlign="center"
      align="center"
      prop="FCProduct"
      label="扶持产品"
      min-width="90"
    ></el-table-column>
  </el-table>
</template>

<script setup lang="ts">
import { DArrowRight, DArrowLeft } from "@element-plus/icons-vue";
import { reactive } from "vue";

const state = reactive({
  list: [
    {
      Lv: 0,
      date: "2019-05-01",
      name: "001",
      address: "xxx",
      DH1: "1",
      BD1: "1",
      DH2: "2",
      BD2: "2",
      DH3: "3",
      BD3: "3",
      DH4: "4",
      BD4: "4",
      DH5: "5",
      BD5: "5",
      DH6: "6",
      BD6: "6",
      CDType: "活动",
      children: [
        {
          Lv: 1,
          date: "2020-05-01",
          name: "002",
          address: "xxxx",
        },
        {
          Lv: 2,
          date: "2021-05-01",
          name: "003",
          address: "xxxxxx",
        },
      ],
    },
  ],
  tableKey: 0,
  showMonthColumns: false, // 控制月份列的显示
  showFCNameColumns: false,
});

// 切换月份列的显示
const toggleMonthColumns = () => {
  state.showMonthColumns = !state.showMonthColumns;
  forceTableRerender();
};

const toggleFCNameColumns = () => {
  state.showFCNameColumns = !state.showFCNameColumns;
  forceTableRerender();
};

const forceTableRerender = () => {
  state.tableKey += 1;
};

const headerCellStyle = ({ row, column, rowIndex, columnIndex }: any) => {  
  if (column.property === undefined && columnIndex === 5) { // 第6列(索引5)
    return {
      backgroundColor: '#e6f7ff',
      color: '#1890ff',
      fontWeight: 'bold',
    };
  }
  
  if (column.property === 'FCName' || column.property === 'FCName1' || column.property === 'FCName2') {
    return {
      backgroundColor: '#f6ffed',
      color: '#52c41a',
      fontWeight: 'bold',
    };
  }
  
  // 默认样式
  return {
    backgroundColor: '#fafafa',
    fontWeight: 'bold'
  };
};


</script>
<style>
.shouzhi {
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}
</style>

更多推荐