From e2f063907e9342bba8e1c30eb73ac1d1619bd91f Mon Sep 17 00:00:00 2001 From: dap <15891557205@163.com> Date: Wed, 28 Jan 2026 19:30:02 +0800 Subject: [PATCH] =?UTF-8?q?refactor(views):=20=E6=9B=BF=E6=8D=A2=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E5=8A=9F=E8=83=BD=E4=B8=BA=20useBlobExport=20?= =?UTF-8?q?=E9=92=A9=E5=AD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构字典类型和字典数据页面的导出功能,使用新的 useBlobExport 组合式 API 替代原有的 commonDownloadExcel 方法,以提供更好的加载状态管理和文件名构建功能。同时在字典数据页面中修复事件监听器内存泄漏问题,在组件卸载时移除事件监听。 --- .../src/views/system/dict/data/index.vue | 30 ++++++++++++++----- .../src/views/system/dict/type/index.vue | 20 ++++++++----- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/apps/web-antd/src/views/system/dict/data/index.vue b/apps/web-antd/src/views/system/dict/data/index.vue index a0fbed1d..0f2afad5 100644 --- a/apps/web-antd/src/views/system/dict/data/index.vue +++ b/apps/web-antd/src/views/system/dict/data/index.vue @@ -5,7 +5,7 @@ import type { VxeGridProps } from '#/adapter/vxe-table'; import type { PageQuery } from '#/api/common'; import type { DictData } from '#/api/system/dict/dict-data-model'; -import { ref } from 'vue'; +import { onBeforeUnmount, onMounted, ref } from 'vue'; import { useVbenDrawer } from '@vben/common-ui'; @@ -17,7 +17,7 @@ import { dictDataList, dictDataRemove, } from '#/api/system/dict/dict-data'; -import { commonDownloadExcel } from '#/utils/file/download'; +import { useBlobExport } from '#/utils/file/export'; import { emitter } from '../mitt'; import { columns, querySchema } from './data'; @@ -112,13 +112,25 @@ function handleMultiDelete() { }); } -function handleDownloadExcel() { - commonDownloadExcel(dictDataExport, '字典数据', tableApi.formApi.form.values); +const { exportBlob, exportLoading, buildExportFileName } = + useBlobExport(dictDataExport); +async function handleExport() { + // 构建表单请求参数 + const formValues = await tableApi.formApi.getValues(); + formValues.dictType = dictType.value; + // 文件名 + const fileName = buildExportFileName('字典数据'); + exportBlob({ data: formValues, fileName }); } -emitter.on('rowClick', async (value) => { - dictType.value = value; - await tableApi.query(); +onMounted(() => { + emitter.on('rowClick', async (value) => { + dictType.value = value; + await tableApi.query(); + }); +}); +onBeforeUnmount(() => { + emitter.off('rowClick'); }); @@ -129,7 +141,9 @@ emitter.on('rowClick', async (value) => { {{ $t('pages.common.export') }} diff --git a/apps/web-antd/src/views/system/dict/type/index.vue b/apps/web-antd/src/views/system/dict/type/index.vue index 87d6b3e4..c23d3c7f 100644 --- a/apps/web-antd/src/views/system/dict/type/index.vue +++ b/apps/web-antd/src/views/system/dict/type/index.vue @@ -17,7 +17,7 @@ import { dictTypeRemove, refreshDictTypeCache, } from '#/api/system/dict/dict-type'; -import { commonDownloadExcel } from '#/utils/file/download'; +import { useBlobExport } from '#/utils/file/export'; import { emitter } from '../mitt'; import { columns, querySchema } from './data'; @@ -121,12 +121,14 @@ async function handleRefreshCache() { await tableApi.query(); } -function handleDownloadExcel() { - commonDownloadExcel( - dictTypeExport, - '字典类型数据', - tableApi.formApi.form.values, - ); +const { exportBlob, exportLoading, buildExportFileName } = + useBlobExport(dictTypeExport); +async function handleExport() { + // 构建表单请求参数 + const formValues = await tableApi.formApi.getValues(); + // 文件名 + const fileName = buildExportFileName('字典类型数据'); + exportBlob({ data: formValues, fileName }); } @@ -143,7 +145,9 @@ function handleDownloadExcel() { {{ $t('pages.common.export') }}