a-table 子级异步加载

 


<script lang="ts" setup> import type { Dayjs } from 'dayjs'; import { Modal, message } from 'ant-design-vue'; import dayjs from 'dayjs'; import { columns } from './components/columns.tsx'; import MapDialog from './mapDialog.vue'; import mapModalDialog from './mapModalDialog.vue'; import morenum from './morenum.vue'; import defaultImg from '@/assets/images/achieveDisplay/defaltimg.jpg'; type RangeValue = [Dayjs, Dayjs]; const tableRef = ref(); const search = ref({ state: '', }) as any; const createDate = ref<RangeValue>(); const mapDialogRef = ref(); const mapModalDialogRef = ref(); const statusList = ref([ { label: '全部', value: '', }, { label: '未开始', value: 0, }, { label: '未完成', value: 1, }, { label: '正常', value: 2, }, ]); const STATE = { 0: '未开始', 1: '未完成', 2: '正常', }; // 列表数据 const total = ref<number>(0); const treeDate: any = ref([]); async function queryData(params: any) { if (createDate.value && createDate.value.length) { search.value.createStartTime = dayjs(createDate.value[0]).format('YYYY-MM-DD HH:mm:ss'); search.value.createEndTime = dayjs(createDate.value[1]).format('YYYY-MM-DD HH:mm:ss'); } else { search.value.createStartTime = undefined; search.value.createEndTime = undefined; } const res = await getApiModelMakePageQuery({ ...params, ...search.value }); total.value = res?.data?.total ?? 0; const list = res?.data?.records?.map((item, index) => { return { ...item, index: (res.data?.currentPage - 1) * res.data?.pageSize + index + 1, }; }); treeDate.value = list; return list ?? []; } // 重置 function reset() { search.value = {}; search.value.state = ''; createDate.value = undefined; tableRef.value.getList(); } /** * 模型删除 * @param type '1': 列表删除 '2': 单个删除 * @param id */ function deleteItem(_type: string, _id: string) { Modal.confirm({ title: '提示', content: '是否确认删除?', okText: '确认', cancelText: '取消', async onOk() { postApiModelMakeDelete({ id: Number(_id), }).then((res) => { if (res.success) { message.success(res.msg); tableRef.value.getList(); } else { message.error(res.msg); } }); }, }); } function editItem(record: any) { mapDialogRef.value.open(record); } // 查看模型 function viewModal(record: any) { // 等于状态2才表示有模型 才能查看 if (record.state === 2) { mapModalDialogRef.value.open({ id: record }); } else { message.info('当前模型下没有已完成的建模'); } } // 新建模型 function add() { mapDialogRef.value.open(); } // 展示期数 const subItem: any = ref(); const expandedRowKeys: any = ref([]); const defaultExpandedRowKeys: any = ref([]); // 树节点展开方法 点击展开图标时的方法 // 利用es7的async await 可以等数据请求回来之后 进行后续流程,否则就会出现点击两次数据才显示 async function fatherExpand(expanded: any, record: any) { subItem.value = record; if (expanded) { await getChild(record); expandedRowKeys.value.push(record.id); } else { expandedRowKeys.value.splice(expandedRowKeys.value.indexOf(record.id), 1); } } function getChild(record: any) { return new Promise((resolve) => { getApiModelMakePeriodList({ modelMakeId: record.id }).then((res) => { // table默认带树表格,如果使用children作参数名则会出现两个表格 if (res.success) { if (res.data && res.data !== null && res.data.length) { res.data.forEach((item) => { item.children = []; }); record.list = res.data; if (record.list === null || record.list.length === 0) { record.hasChild = false; expandedRowKeys.value.splice(expandedRowKeys.value.indexOf(record.id), 1); } resolve(); } } }); }); } // 期数新增 const morenumRef = ref(); function addNum(item: any) { morenumRef.value.open(item); } // 期数删除 function deleteNum(item: any) { Modal.confirm({ title: '提示', content: '是否确认删除?', okText: '确认', cancelText: '取消', async onOk() { postApiModelMakePeriodDelete({ id: item.id, }).then((res) => { if (res.success) { message.success(res.msg); tableRef.value.getList(); expandedRowKeys.value = []; } else { message.error(res.msg); } }); }, }); } function getNumadd() { tableRef.value.getList(); expandedRowKeys.value = []; } </script> <template> <div class="h-full flex flex-col"> <div class="table_box w-full h-full px-6 flex flex-col min-h-0"> <div class="search_box py-6 flex-none"> <a-form layout="inline" :model="search"> <a-form-item label="模型名称"> <a-input v-model:value="search.name" placeholder="请输入模型名称" /> </a-form-item> <a-form-item label="地址"> <a-input v-model:value="search.address" placeholder="请输入地址" /> </a-form-item> <a-form-item label="创建时间"> <a-range-picker v-model:value="createDate" show-time class="w-80" /> </a-form-item> <a-form-item label="制作状态"> <a-select v-model:value="search.state" style="width: 10rem;" :options="statusList" /> </a-form-item> <a-form-item> <a-button type="primary" @click="tableRef.getList()"> 查询 </a-button> <a-button class="ml-4" @click="reset"> 重置 </a-button> </a-form-item> </a-form> <div class="mt-3"> <a-button type="primary" @click="add"> 新建模型 </a-button> </div> </div> <!-- <TableBox ref="tableRef" :is-opr="false" class="flex-auto min-h-0 overflow-hidden" :total="total" :columns="columns" :query-data="queryData" row-key="id" @expand="getexpand" > --> <TableBox ref="tableRef" :is-opr="false" class="flex-auto min-h-0 overflow-hidden" :total="total" :columns="columns" :query-data="queryData" row-key="id" :expanded-row-keys="expandedRowKeys" :default-expanded-row-keys="defaultExpandedRowKeys" @expand="fatherExpand" > <template #expandedRowRender="{ record }"> <!-- <div v-if="loading" class="w-full flex items-center justify-center h-24"> 加载中<LoadingOutlined class="ml-3" /> </div> --> <div v-if="record.list?.length > 0" class="flex"> <div class="data-list w-94% inline-block"> <div v-for="(item, index) in record.list" :key="index" class="relative inline-block m-r-10px m-b-10px cursor-pointer" @click.stop="viewModal(item)" > <a-image :src="item.url ? item.url : defaultImg" width="100%" height="100%" :preview="false" /> <div class="absolute bottom-0 left-0 right-0 bg-black bg-opacity-70 text-white font-size-12px p-1 flex justify-between" > <div class="left"> 创建时间:{{ item.createTime }} </div> <!-- 期数删除 --> <div class="right"> <PubSvgIcon name="delete_icon" size="1rem" class="m-auto" @click.stop.prevent="deleteNum(item)" /> </div> </div> </div> </div> <div class="w-6%"> <div class="add-btn" @click="addNum(record)"> <PubSvgIcon name="plus" color="#fff" size="1rem" class="m-r-4px" /> 新增 </div> </div> </div> </template> <template #bodyCell="{ column, record }"> <template v-if="column.key === 'address'"> <a-tooltip :title="record.address"> <div class="truncate"> {{ record.address }} </div> </a-tooltip> </template> <template v-if="column.key === 'longitude'"> <div class="flex h-full flex-col"> <ul v-if="record.longitude" class="times"> <li>{{ record.longitude }}</li> </ul> <ul v-if="record.latitude" class="times"> <li>{{ record.latitude }}</li> </ul> </div> </template> <template v-if="column.key === 'state'"> {{ STATE[record.state] }} </template> <!-- 模型操作 --> <template v-if="column.key === 'action'"> <a-tooltip placement="top" title="编辑"> <PubSvgIcon name="edit_icon" size="1rem" class="m-r-6px cursor-pointer" @click="editItem(record)" /> </a-tooltip> <a-tooltip placement="top" title="删除"> <PubSvgIcon name="delete_icon" size="1rem" class="cursor-pointer" @click.stop.prevent="deleteItem('2', record.id)" /> </a-tooltip> </template> </template> </TableBox> </div> <!-- 编辑名称 --> <MapDialog ref="mapDialogRef" @confirm="tableRef.getList()" /> <mapModalDialog ref="mapModalDialogRef" /> <!-- 期数添加 --> <morenum ref="morenumRef" @confirm="getNumadd" /> </div> </template> <style lang="less" scoped> .data-list { // grid布局 display: inline-grid; grid-template-columns: repeat(8, 1fr); } .right { display: flex; align-items: center; justify-content: center; } .add-btn { box-sizing: border-box; display: inline-flex; align-items: center; justify-content: center; padding: 3px 10px; cursor: pointer; background-color: #0c2e52; border: 1px solid #446d9e; border-radius: 4px; } </style>

 

posted @ 2025-03-25 12:54  abcByme  阅读(52)  评论(0)    收藏  举报