最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

elementplus實現(xiàn)多級表格(最后一級展示圖片)

 更新時間:2023年05月04日 08:30:21   作者:xiaaaa.z  
本文主要介紹了elementplus實現(xiàn)多級表格(最后一級展示圖片),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

想要實現(xiàn)的效果

總共四級 前三級是表格 第四級使用圖片展示; 看了一下官網(wǎng) 計劃使用官網(wǎng)的樹形結(jié)構(gòu), 但是發(fā)現(xiàn)并不能滿足最后一個是圖片形式的展示

最后利用了表格的expand;
在過程中主要需要解決的問題有:vue3 遞歸使用組件;遞歸處理數(shù)據(jù);展開全部級。

遞歸處理數(shù)據(jù)

首先需要處理一下數(shù)據(jù),把他們弄成字段一致的,如果后端處理過,前端也會需要處理一下,用于前端自己新增使用的字段 ,我這邊 新增了三個字段

  • disableExpand: 用于我的展開表格 單行能不能展開
  • id: 后端沒有給id字段 用于唯一標識
  • level: 判斷當前數(shù)據(jù)是第幾級數(shù)據(jù)
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;
};

遞歸調(diào)用組件

因為字段一致所以我使用的是同一個組件,需要說明的是 vue3使用自己組件的時候直接使用即可
在外層:傳入所有的data

    <overview-table
      ref="overviewTableRef"
      :total="overviewTotal"
      :data="overviewList"
    />

在OverviewTable組件中 直接使用OverviewTable就可;下面這個包括展開所有級的代碼
展開所有級 利用@expand=“handleExpand” 修改expandKeys即可

<template>
? <div>
? ? <expand-table
? ? ? ref="tableRef"
? ? ? :data="data"
? ? ? :total="total"
? ? ? :pageParams="pageParams"
? ? ? v-model:expandRowKeys="expandKeys"
? ? ? v-bind="$attrs"
? ? ? @oneClick="rowClick"
? ? ? @expand="handleExpand"
? ? >
? ? ? <template #expand="{ row }">
? ? ? ? <overview-table
? ? ? ? ? :ref="el => setOverviewDetailRef(el, row.id)"
? ? ? ? ? v-if="row.level !== 3"
? ? ? ? ? :data="row.list"
? ? ? ? ? :total="row.list.length"
? ? ? ? ? :show-header="false"
? ? ? ? ? :height="2000"
? ? ? ? ? :table-level="row.level + 1"
? ? ? ? />
? ? ? ? <overview-table-detail
? ? ? ? ? v-else
? ? ? ? ? :data="row.list"
? ? ? ? ? @openDialog="openDialog"
? ? ? ? />
? ? ? </template>
? ? ? <el-table-column
? ? ? ? prop="name"
? ? ? ? min-width="10%"
? ? ? ? label="數(shù)據(jù)類型"
? ? ? />
? ? ? ....
? ? ? <el-table-column
? ? ? ? prop="sub_number"
? ? ? ? min-width="10%"
? ? ? ? label="包含下級數(shù)"
? ? ? >
? ? ? ? <template #default="{ row }">
? ? ? ? ? <span :class="!row.sub_number ? 'no-sub' : ''">{{ row.sub_number }}</span>
? ? ? ? </template>
? ? ? </el-table-column>
? ? ? <operation-column
? ? ? ? min-width="10%"
? ? ? ? :operationOptions="operationOptions"
? ? ? />
? ? </expand-table>
? ? <image-detail-dialog
? ? ? :showDeleteBtn="false"
? ? ? ref="imageDetailDialogRef"
? ? />
? </div>
</template>
<script setup lang="ts">
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<PageAware>({
? page_no: 1,
? page_size: (inject('global') as ConfigModel).registration.registrationLimit
});
const tableRef = ref<InstanceType<typeof ExpandTable>>();
const overviewDetailRefs = ref<any>({});
const imageDetailDialogRef = ref<InstanceType<typeof ImageDetailDialog>>();
const expandKeys = ref<string[]>([]);
const operationOptions = computed<OperationOptionModel[]>(() => {
? 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: () => {}
? ? }
? ];
});
// 動態(tài)ref
const setOverviewDetailRef = (el: any, id: number) => {
? if (el) {
? ? overviewDetailRefs.value[id] = el;
? }
};
// 打開彈窗
const openDialog = (index: any, data: PhotoListModel[]) => {
? imageDetailDialogRef.value?.open(index, data);
};
// 單擊展開/關(guān)閉
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 = () => {
? // 重新搜索的時候 關(guān)閉展開的
? tableRef.value?.closeAllExpand();
? expandKeys.value = [];
};
defineExpose({
? reset,
? expandKeys,
? openRowExpansion
});
</script>
<style lang="scss" scoped>
: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;
}
</style>

到此這篇關(guān)于elementplus 實現(xiàn)多級表格 最后一級展示圖片的文章就介紹到這了,更多相關(guān)elementplus 多級表格 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

仙居县| 高安市| 兰西县| 磐安县| 武威市| 镇康县| 柳林县| 广饶县| 木里| 山东省| 安多县| 无锡市| 潢川县| 揭东县| 仁布县| 吐鲁番市| 万荣县| 开鲁县| 陈巴尔虎旗| 乌苏市| 阿图什市| 呼图壁县| 泾阳县| 会宁县| 宁明县| 凌海市| 中卫市| 信阳市| 磴口县| 贵港市| 上虞市| 措勤县| 射阳县| 阿尔山市| 甘泉县| 嘉善县| 黔西县| 济源市| 缙云县| 永新县| 佛冈县|