Commit eecde4c7e947cf392dbd8eace2db8ed9aea417b1

Authored by vben
1 parent 968f791f

perf: perf excel comp code

CHANGELOG.zh_CN.md
1 # Wip 1 # Wip
2 2
  3 +### 🎫 Chores
  4 +
  5 +- 表格默认不显示边框
  6 +
3 ### ⚡ Performance Improvements 7 ### ⚡ Performance Improvements
4 8
5 - 优化首屏体积大小 9 - 优化首屏体积大小
src/components/Authority/index.tsx
@@ -19,16 +19,17 @@ export default defineComponent({ @@ -19,16 +19,17 @@ export default defineComponent({
19 const getModeRef = computed(() => { 19 const getModeRef = computed(() => {
20 return appStore.getProjectConfig.permissionMode; 20 return appStore.getProjectConfig.permissionMode;
21 }); 21 });
  22 +
22 /** 23 /**
23 * 渲染角色按钮 24 * 渲染角色按钮
24 */ 25 */
25 function renderRoleAuth() { 26 function renderRoleAuth() {
26 const { value } = props; 27 const { value } = props;
27 if (!value) { 28 if (!value) {
28 - return getSlot(slots, 'default'); 29 + return getSlot(slots);
29 } 30 }
30 const { hasPermission } = usePermission(); 31 const { hasPermission } = usePermission();
31 - return hasPermission(value) ? getSlot(slots, 'default') : null; 32 + return hasPermission(value) ? getSlot(slots) : null;
32 } 33 }
33 34
34 /** 35 /**
@@ -38,11 +39,12 @@ export default defineComponent({ @@ -38,11 +39,12 @@ export default defineComponent({
38 function renderCodeAuth() { 39 function renderCodeAuth() {
39 const { value } = props; 40 const { value } = props;
40 if (!value) { 41 if (!value) {
41 - return getSlot(slots, 'default'); 42 + return getSlot(slots);
42 } 43 }
43 const { hasPermission } = usePermission(); 44 const { hasPermission } = usePermission();
44 - return hasPermission(value) ? getSlot(slots, 'default') : null; 45 + return hasPermission(value) ? getSlot(slots) : null;
45 } 46 }
  47 +
46 return () => { 48 return () => {
47 const mode = unref(getModeRef); 49 const mode = unref(getModeRef);
48 // 基于角色渲染 50 // 基于角色渲染
@@ -53,7 +55,7 @@ export default defineComponent({ @@ -53,7 +55,7 @@ export default defineComponent({
53 if (mode === PermissionModeEnum.BACK) { 55 if (mode === PermissionModeEnum.BACK) {
54 return renderCodeAuth(); 56 return renderCodeAuth();
55 } 57 }
56 - return getSlot(slots, 'default'); 58 + return getSlot(slots);
57 }; 59 };
58 }, 60 },
59 }); 61 });
src/components/Drawer/src/BasicDrawer.tsx
@@ -33,18 +33,7 @@ export default defineComponent({ @@ -33,18 +33,7 @@ export default defineComponent({
33 props: basicProps, 33 props: basicProps,
34 emits: ['visible-change', 'ok', 'close', 'register'], 34 emits: ['visible-change', 'ok', 'close', 'register'],
35 setup(props, { slots, emit, attrs }) { 35 setup(props, { slots, emit, attrs }) {
36 - // const { currentRoute } = useRouter();  
37 const scrollRef = ref<any>(null); 36 const scrollRef = ref<any>(null);
38 - // /**  
39 - // * @description: 获取配置ScrollContainer  
40 - // */  
41 - // const getScrollOptions = computed(  
42 - // (): ScrollContainerOptions => {  
43 - // return {  
44 - // ...(props.scrollOptions as any),  
45 - // };  
46 - // }  
47 - // );  
48 37
49 const visibleRef = ref(false); 38 const visibleRef = ref(false);
50 const propsRef = ref<Partial<DrawerProps> | null>(null); 39 const propsRef = ref<Partial<DrawerProps> | null>(null);
@@ -85,7 +74,6 @@ export default defineComponent({ @@ -85,7 +74,6 @@ export default defineComponent({
85 watch( 74 watch(
86 () => visibleRef.value, 75 () => visibleRef.value,
87 (visible) => { 76 (visible) => {
88 - // appStore.commitLockMainScrollState(visible);  
89 nextTick(() => { 77 nextTick(() => {
90 emit('visible-change', visible); 78 emit('visible-change', visible);
91 }); 79 });
@@ -95,27 +83,6 @@ export default defineComponent({ @@ -95,27 +83,6 @@ export default defineComponent({
95 } 83 }
96 ); 84 );
97 85
98 - // function scrollBottom() {  
99 - // const scroll = unref(scrollRef);  
100 - // if (scroll) {  
101 - // scroll.scrollBottom();  
102 - // }  
103 - // }  
104 -  
105 - // function scrollTo(to: number) {  
106 - // const scroll = unref(scrollRef);  
107 - // if (scroll) {  
108 - // scroll.scrollTo(to);  
109 - // }  
110 - // }  
111 -  
112 - // function getScrollWrap() {  
113 - // const scroll = unref(scrollRef);  
114 - // if (scroll) {  
115 - // return scroll.getScrollWrap();  
116 - // }  
117 - // return null;  
118 - // }  
119 // 取消事件 86 // 取消事件
120 async function onClose(e: any) { 87 async function onClose(e: any) {
121 const { closeFunc } = unref(getProps); 88 const { closeFunc } = unref(getProps);
@@ -219,12 +186,6 @@ export default defineComponent({ @@ -219,12 +186,6 @@ export default defineComponent({
219 ); 186 );
220 } 187 }
221 188
222 - // const currentInstance = getCurrentInstance() as any;  
223 - // if (getCurrentInstance()) {  
224 - // currentInstance.scrollBottom = scrollBottom;  
225 - // currentInstance.scrollTo = scrollTo;  
226 - // currentInstance.getScrollWrap = getScrollWrap;  
227 - // }  
228 const drawerInstance: DrawerInstance = { 189 const drawerInstance: DrawerInstance = {
229 setDrawerProps: setDrawerProps, 190 setDrawerProps: setDrawerProps,
230 }; 191 };
@@ -253,15 +214,6 @@ export default defineComponent({ @@ -253,15 +214,6 @@ export default defineComponent({
253 class={[!unref(getProps).loading ? 'hidden' : '']} 214 class={[!unref(getProps).loading ? 'hidden' : '']}
254 tip="加载中..." 215 tip="加载中..."
255 /> 216 />
256 - {/* <ScrollContainer  
257 - ref={scrollRef}  
258 - {...{ ...attrs, ...unref(getScrollOptions) }}  
259 - style={{  
260 - height: `calc(100% - ${footerHeight})`,  
261 - }}  
262 - >  
263 - {() => getSlot(slots, 'default')}  
264 - </ScrollContainer> */}  
265 <div 217 <div
266 ref={scrollRef} 218 ref={scrollRef}
267 {...attrs} 219 {...attrs}
src/components/Excel/index.ts
1 -export { default as ImportExcel } from './src/ImportExcel'; 1 +export { default as ImportExcel } from './src/ImportExcel.vue';
2 export { default as ExportExcelModel } from './src/ExportExcelModel.vue'; 2 export { default as ExportExcelModel } from './src/ExportExcelModel.vue';
3 3
4 export { jsonToSheetXlsx, aoaToSheetXlsx } from './src/Export2Excel'; 4 export { jsonToSheetXlsx, aoaToSheetXlsx } from './src/Export2Excel';
src/components/Excel/src/ExportExcelModel.vue
@@ -55,12 +55,13 @@ @@ -55,12 +55,13 @@
55 ]; 55 ];
56 export default defineComponent({ 56 export default defineComponent({
57 components: { BasicModal, BasicForm }, 57 components: { BasicModal, BasicForm },
  58 + emits: ['success', 'register'],
58 setup(_, { emit }) { 59 setup(_, { emit }) {
59 const [registerForm, { validateFields }] = useForm(); 60 const [registerForm, { validateFields }] = useForm();
60 const [registerModal, { closeModal }] = useModalInner(); 61 const [registerModal, { closeModal }] = useModalInner();
61 62
62 async function handleOk() { 63 async function handleOk() {
63 - const res: ExportModalResult = await validateFields(); 64 + const res = (await validateFields()) as ExportModalResult;
64 const { filename, bookType } = res; 65 const { filename, bookType } = res;
65 66
66 emit('success', { 67 emit('success', {
@@ -69,6 +70,7 @@ @@ -69,6 +70,7 @@
69 }); 70 });
70 closeModal(); 71 closeModal();
71 } 72 }
  73 +
72 return { 74 return {
73 schemas, 75 schemas,
74 handleOk, 76 handleOk,
src/components/Excel/src/ImportExcel.tsx renamed to src/components/Excel/src/ImportExcel.vue
1 -import { defineComponent, ref, unref } from 'vue';  
2 -import XLSX from 'xlsx';  
3 -import { getSlot } from '/@/utils/helper/tsxHelper'; 1 +<template>
  2 + <div>
  3 + <input
  4 + ref="inputRef"
  5 + type="file"
  6 + v-show="false"
  7 + accept=".xlsx, .xls"
  8 + @change="handleInputClick"
  9 + />
  10 + <div @click="handleUpload"><slot /></div>
  11 + </div>
  12 +</template>
  13 +<script lang="ts">
  14 + import { defineComponent, ref, unref } from 'vue';
  15 + import XLSX from 'xlsx';
4 16
5 -import type { ExcelData } from './types';  
6 -export default defineComponent({  
7 - name: 'ImportExcel',  
8 - setup(_, { slots, emit }) {  
9 - const inputRef = ref<HTMLInputElement | null>(null);  
10 - const loadingRef = ref<Boolean>(false); 17 + import type { ExcelData } from './types';
  18 + export default defineComponent({
  19 + name: 'ImportExcel',
  20 + emits: ['success'],
  21 + setup(_, { emit }) {
  22 + const inputRef = ref<HTMLInputElement | null>(null);
  23 + const loadingRef = ref<Boolean>(false);
11 24
12 - /**  
13 - * @description: 第一行作为头部  
14 - */  
15 - function getHeaderRow(sheet: XLSX.WorkSheet) {  
16 - if (!sheet || !sheet['!ref']) return [];  
17 - const headers: string[] = [];  
18 - // A3:B7=>{s:{c:0, r:2}, e:{c:1, r:6}}  
19 - const range = XLSX.utils.decode_range(sheet['!ref']); 25 + /**
  26 + * @description: 第一行作为头部
  27 + */
  28 + function getHeaderRow(sheet: XLSX.WorkSheet) {
  29 + if (!sheet || !sheet['!ref']) return [];
  30 + const headers: string[] = [];
  31 + // A3:B7=>{s:{c:0, r:2}, e:{c:1, r:6}}
  32 + const range = XLSX.utils.decode_range(sheet['!ref']);
20 33
21 - const R = range.s.r;  
22 - /* start in the first row */  
23 - for (let C = range.s.c; C <= range.e.c; ++C) {  
24 - /* walk every column in the range */  
25 - const cell = sheet[XLSX.utils.encode_cell({ c: C, r: R })];  
26 - /* find the cell in the first row */  
27 - let hdr = 'UNKNOWN ' + C; // <-- replace with your desired default  
28 - if (cell && cell.t) hdr = XLSX.utils.format_cell(cell);  
29 - headers.push(hdr); 34 + const R = range.s.r;
  35 + /* start in the first row */
  36 + for (let C = range.s.c; C <= range.e.c; ++C) {
  37 + /* walk every column in the range */
  38 + const cell = sheet[XLSX.utils.encode_cell({ c: C, r: R })];
  39 + /* find the cell in the first row */
  40 + let hdr = 'UNKNOWN ' + C; // <-- replace with your desired default
  41 + if (cell && cell.t) hdr = XLSX.utils.format_cell(cell);
  42 + headers.push(hdr);
  43 + }
  44 + return headers;
30 } 45 }
31 - return headers;  
32 - }  
33 46
34 - /**  
35 - * @description: 获得excel数据  
36 - */  
37 - function getExcelData(workbook: XLSX.WorkBook) {  
38 - const excelData: ExcelData[] = [];  
39 - for (const sheetName of workbook.SheetNames) {  
40 - const worksheet = workbook.Sheets[sheetName];  
41 - const header: string[] = getHeaderRow(worksheet);  
42 - const results = XLSX.utils.sheet_to_json(worksheet);  
43 - excelData.push({  
44 - header,  
45 - results,  
46 - meta: {  
47 - sheetName,  
48 - }, 47 + /**
  48 + * @description: 获得excel数据
  49 + */
  50 + function getExcelData(workbook: XLSX.WorkBook) {
  51 + const excelData: ExcelData[] = [];
  52 + for (const sheetName of workbook.SheetNames) {
  53 + const worksheet = workbook.Sheets[sheetName];
  54 + const header: string[] = getHeaderRow(worksheet);
  55 + const results = XLSX.utils.sheet_to_json(worksheet);
  56 + excelData.push({
  57 + header,
  58 + results,
  59 + meta: {
  60 + sheetName,
  61 + },
  62 + });
  63 + }
  64 + return excelData;
  65 + }
  66 +
  67 + /**
  68 + * @description: 读取excel数据
  69 + */
  70 + function readerData(rawFile: File) {
  71 + loadingRef.value = true;
  72 + return new Promise((resolve, reject) => {
  73 + const reader = new FileReader();
  74 + reader.onload = async (e) => {
  75 + try {
  76 + const data = e.target && e.target.result;
  77 + const workbook = XLSX.read(data, { type: 'array' });
  78 + // console.log(workbook);
  79 + /* DO SOMETHING WITH workbook HERE */
  80 + const excelData = getExcelData(workbook);
  81 + emit('success', excelData);
  82 + resolve();
  83 + } catch (error) {
  84 + reject(error);
  85 + } finally {
  86 + loadingRef.value = false;
  87 + }
  88 + };
  89 + reader.readAsArrayBuffer(rawFile);
49 }); 90 });
50 } 91 }
51 - return excelData;  
52 - }  
53 92
54 - /**  
55 - * @description: 读取excel数据  
56 - */  
57 - function readerData(rawFile: File) {  
58 - loadingRef.value = true;  
59 - return new Promise((resolve, reject) => {  
60 - const reader = new FileReader();  
61 - reader.onload = async (e) => {  
62 - try {  
63 - const data = e.target && e.target.result;  
64 - const workbook = XLSX.read(data, { type: 'array' });  
65 - // console.log(workbook);  
66 - /* DO SOMETHING WITH workbook HERE */  
67 - const excelData = getExcelData(workbook);  
68 - emit('success', excelData);  
69 - resolve();  
70 - } catch (error) {  
71 - reject(error);  
72 - } finally {  
73 - loadingRef.value = false;  
74 - }  
75 - };  
76 - reader.readAsArrayBuffer(rawFile);  
77 - });  
78 - } 93 + async function upload(rawFile: File) {
  94 + const inputRefDom = unref(inputRef);
  95 + if (inputRefDom) {
  96 + // fix can't select the same excel
  97 + inputRefDom.value = '';
  98 + }
  99 + readerData(rawFile);
  100 + }
  101 +
  102 + /**
  103 + * @description: 触发选择文件管理器
  104 + */
  105 + function handleInputClick(e: Event) {
  106 + const files = e && (e.target as HTMLInputElement).files;
  107 + const rawFile = files && files[0]; // only use files[0]
  108 + if (!rawFile) return;
  109 + upload(rawFile);
  110 + }
79 111
80 - async function upload(rawFile: File) {  
81 - const inputRefDom = unref(inputRef);  
82 - if (inputRefDom) {  
83 - // fix can't select the same excel  
84 - inputRefDom.value = ''; 112 + /**
  113 + * @description: 点击上传按钮
  114 + */
  115 + function handleUpload() {
  116 + const inputRefDom = unref(inputRef);
  117 + inputRefDom && inputRefDom.click();
85 } 118 }
86 - readerData(rawFile);  
87 - }  
88 - /**  
89 - * @description: 触发选择文件管理器  
90 - */  
91 - function handleInputClick(e: Event) {  
92 - const files = e && (e.target as HTMLInputElement).files;  
93 - const rawFile = files && files[0]; // only use files[0]  
94 - if (!rawFile) return;  
95 - upload(rawFile);  
96 - }  
97 - /**  
98 - * @description: 点击上传按钮  
99 - */  
100 - function handleUpload() {  
101 - const inputRefDom = unref(inputRef);  
102 - inputRefDom && inputRefDom.click();  
103 - }  
104 119
105 - return () => {  
106 - return (  
107 - <div>  
108 - <input  
109 - ref={inputRef}  
110 - type="file"  
111 - accept=".xlsx, .xls"  
112 - style=" z-index: -9999; display: none;"  
113 - onChange={handleInputClick}  
114 - />  
115 - <div onClick={handleUpload}>{getSlot(slots)}</div>  
116 - </div>  
117 - );  
118 - };  
119 - },  
120 -}); 120 + return { handleUpload, handleInputClick, inputRef };
  121 + },
  122 + });
  123 +</script>
src/router/routes/modules/demo/excel.ts
@@ -9,7 +9,7 @@ export default { @@ -9,7 +9,7 @@ export default {
9 component: PAGE_LAYOUT_COMPONENT, 9 component: PAGE_LAYOUT_COMPONENT,
10 redirect: '/excel/customExport', 10 redirect: '/excel/customExport',
11 meta: { 11 meta: {
12 - icon: 'ant-design:area-chart-outlined', 12 + icon: 'mdi:microsoft-excel',
13 title: 'Excel', 13 title: 'Excel',
14 }, 14 },
15 }, 15 },
@@ -18,7 +18,7 @@ export default { @@ -18,7 +18,7 @@ export default {
18 { 18 {
19 path: '/customExport', 19 path: '/customExport',
20 name: 'CustomExport', 20 name: 'CustomExport',
21 - component: () => import('/@/views/demo/echarts/excel/CustomExport.vue'), 21 + component: () => import('/@/views/demo/excel/CustomExport.vue'),
22 meta: { 22 meta: {
23 title: '选择导出格式', 23 title: '选择导出格式',
24 }, 24 },
@@ -26,7 +26,7 @@ export default { @@ -26,7 +26,7 @@ export default {
26 { 26 {
27 path: '/jsonExport', 27 path: '/jsonExport',
28 name: 'JsonExport', 28 name: 'JsonExport',
29 - component: () => import('/@/views/demo/echarts/excel/JsonExport.vue'), 29 + component: () => import('/@/views/demo/excel/JsonExport.vue'),
30 meta: { 30 meta: {
31 title: 'JSON数据导出', 31 title: 'JSON数据导出',
32 }, 32 },
@@ -34,7 +34,7 @@ export default { @@ -34,7 +34,7 @@ export default {
34 { 34 {
35 path: '/arrayExport', 35 path: '/arrayExport',
36 name: 'ArrayExport', 36 name: 'ArrayExport',
37 - component: () => import('/@/views/demo/echarts/excel/ArrayExport.vue'), 37 + component: () => import('/@/views/demo/excel/ArrayExport.vue'),
38 meta: { 38 meta: {
39 title: 'Array数据导出', 39 title: 'Array数据导出',
40 }, 40 },
@@ -42,12 +42,10 @@ export default { @@ -42,12 +42,10 @@ export default {
42 { 42 {
43 path: '/importExcel', 43 path: '/importExcel',
44 name: 'ImportExcel', 44 name: 'ImportExcel',
45 - component: () => import('/@/views/demo/echarts/excel/ImportExcel.vue'), 45 + component: () => import('/@/views/demo/excel/ImportExcel.vue'),
46 meta: { 46 meta: {
47 title: '导入', 47 title: '导入',
48 }, 48 },
49 }, 49 },
50 - // ],  
51 - // },  
52 ], 50 ],
53 } as AppRouteModule; 51 } as AppRouteModule;
src/router/routes/modules/demo/tree.ts
@@ -9,7 +9,7 @@ export default { @@ -9,7 +9,7 @@ export default {
9 component: PAGE_LAYOUT_COMPONENT, 9 component: PAGE_LAYOUT_COMPONENT,
10 redirect: '/tree/basic', 10 redirect: '/tree/basic',
11 meta: { 11 meta: {
12 - icon: 'ant-design:table-outlined', 12 + icon: 'clarity:tree-view-line',
13 title: 'Tree', 13 title: 'Tree',
14 }, 14 },
15 }, 15 },
src/views/demo/echarts/excel/ArrayExport.vue renamed to src/views/demo/excel/ArrayExport.vue
src/views/demo/echarts/excel/CustomExport.vue renamed to src/views/demo/excel/CustomExport.vue
src/views/demo/echarts/excel/ImportExcel.vue renamed to src/views/demo/excel/ImportExcel.vue
src/views/demo/echarts/excel/JsonExport.vue renamed to src/views/demo/excel/JsonExport.vue
src/views/demo/echarts/excel/data.ts renamed to src/views/demo/excel/data.ts