验证码: 看不清楚,换一张 查询 注册会员,免验证
  • {{ basic.site_slogan }}
  • 打开微信扫一扫,
    您还可以在这里找到我们哟

    关注我们

elementplus怎么实现多级表格

阅读:534 来源:乙速云 作者:代码code

elementplus怎么实现多级表格

想要实现的效果

elementplus怎么实现多级表格

总共四级 前三级是表格 第四级使用图片展示; 看了一下官网 计划使用官网的树形结构, 但是发现并不能满足最后一个是图片形式的展示

最后利用了表格的expand;
在过程中主要需要解决的问题有:vue3 递归使用组件;递归处理数据;展开全部级。

递归处理数据

首先需要处理一下数据,把他们弄成字段一致的,如果后端处理过,前端也会需要处理一下,用于前端自己新增使用的字段 ,我这边 新增了三个字段

  • disableExpand: 用于我的展开表格 单行能不能展开

  • id: 后端没有给id字段 用于唯一标识

  • level: 判断当前数据是第几级数据

const getOverviewList = async () => {
  if (!searchParams.value.train_type_id) {
    return;
  }
  const resp = await Pepper.get('/api/match/detail', {
    params: searchParams.value
  });
  overviewTotal.value = resp.data.list.length;
  overviewList.value = handleOverviewList(resp.data.list);
};
const handleOverviewList = (data: OverviewListModel[], listLevel = 1) => {
  const result: OverviewListModel[] = data.map((item, index) => {
    return {
      ...item,
      // 新增字段
      disableExpand: !!item.sub_number,
      level: listLevel,
      id: listLevel + '-' + index,
      // 处理list
      list: item.list && item.list.length ? handleOverviewList(item.list as OverviewListModel[], listLevel + 1) : []
    };
  });
  return result;
};

递归调用组件

因为字段一致所以我使用的是同一个组件,需要说明的是 vue3使用自己组件的时候直接使用即可
在外层:传入所有的data

    

在OverviewTable组件中 直接使用OverviewTable就可;下面这个包括展开所有级的代码
展开所有级 利用@expand=“handleExpand” 修改expandKeys即可


      
      ....
      
        
          {{ row.sub_number }}
        
      
      
    
    
  
import { computed, ref, inject, nextTick } from 'vue'; import ExpandTable from '@/components/table/ExpandTable.vue'; import OverviewTableDetail from './OverviewTableDetail.vue'; import ImageDetailDialog from '../../original/stop/ImageDetailDialog.vue'; import OperationColumn, { OperationOptionModel } from '@/components/table/OperationColumn.vue'; import { PageAware } from '@/model'; import { ConfigModel } from 'public/config'; import { OverviewListModel } from '@/model/registration'; import { PhotoListModel } from '@/model/original'; const props = withDefaults(   defineProps<{     data: OverviewListModel[];     total: number;     tableLevel?: number;   }>(),   {     data: () => [],     tableLevel: 1   } ); const pageParams = ref({   page_no: 1,   page_size: (inject('global') as ConfigModel).registration.registrationLimit }); const tableRef = ref>(); const overviewDetailRefs = ref({}); const imageDetailDialogRef = ref>(); const expandKeys = ref([]); const operationOptions = computed(() => {   return [     {       icon: 'icon-upload',       title: '上传',       hidden: props.tableLevel !== 1,       onClick: () => {}     },     {       icon: 'icon-compute',       title: '计算',       hidden: props.tableLevel !== 2,       disabled: (row: OverviewListModel) => {         return row.state !== '待计算';       },       onClick: () => {}     }   ]; }); // 动态ref const setOverviewDetailRef = (el: any, id: number) => {   if (el) {     overviewDetailRefs.value[id] = el;   } }; // 打开弹窗 const openDialog = (index: any, data: PhotoListModel[]) => {   imageDetailDialogRef.value?.open(index, data); }; // 单击展开/关闭 const rowClick = (row: OverviewListModel) => {   if (expandKeys.value.includes(row.id)) {     tableRef.value?.closeRowExpansion(row);   } else {     expandKeys.value.push(row.id);   } }; // 展开全部 const handleExpand = (ids: number[] | string[]) => {   // 情况1:一级全部展开 点击其他的时候 只展开下一级   // const handleExpand = (ids: number[] | string[], autoExpand) => {   // autoExpand.value = autoExpandEd ? autoExpandEd : props.tableLevel === 1;   // if (!autoExpand.value) {   //   return;   // }   //  情况3:点击一级 只展开到三级   // if (props.tableLevel !== 1) {   //   return;   // }   ids.forEach(async id => {     await nextTick();     const stopOverviewDetailRef = overviewDetailRefs.value[id];     if (stopOverviewDetailRef) {       await stopOverviewDetailRef?.openRowExpansion();     }   }); }; const openRowExpansion = () => {   //情况1:一级全部展开 点击其他的时候 只展开下一级   // const ids = (props.data as OverviewListModel[]).map(i => i.id);   // handleExpand(ids, true);   // 情况2:点击任何一级 他下面的都展开   props.data.map(item => {     if (!item.disableExpand) {       return;     }     if (!expandKeys.value.includes(item.id)) {       expandKeys.value.push(item.id);     }   }); }; const reset = () => {   // 重新搜索的时候 关闭展开的   tableRef.value?.closeAllExpand();   expandKeys.value = []; }; defineExpose({   reset,   expandKeys,   openRowExpansion }); :deep(.el-table__expanded-cell[class*='cell']) {   padding: 0; } :deep(.el-button + .el-button) {   margin-left: 0; } .no-sub {   color: #b9bdc9; } // 防止弹框样式有问题 :deep(.el-table .el-table__row) {   position: relative;   z-index: 0; }
分享到:
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: hlamps#outlook.com (#换成@)。
相关文章
{{ v.title }}
{{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
你可能感兴趣
推荐阅读 更多>