From 125a7d14831642c9cbb2e4b3e75953c3b2e2cdef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=97=A0=E6=9C=A8?= Date: Mon, 7 Jun 2021 12:37:21 +0800 Subject: [PATCH] feat(table): support columns-change event MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加列改变事件(含排序、可见性、固定列)。该事件仅由表格设置组件中人为触发。 --- src/components/Table/src/BasicTable.vue | 19 ++++++++++-- .../Table/src/components/TableHeader.vue | 16 +++++++--- .../src/components/settings/ColumnSetting.vue | 29 ++++++++++++++----- .../Table/src/components/settings/index.vue | 13 ++++++--- .../Table/src/hooks/useTableHeader.ts | 9 ++++-- src/components/Table/src/types/table.ts | 12 ++++++++ src/views/demo/table/Basic.vue | 9 +++++- src/views/demo/table/UseTable.vue | 5 +++- 8 files changed, 91 insertions(+), 21 deletions(-) diff --git a/src/components/Table/src/BasicTable.vue b/src/components/Table/src/BasicTable.vue index bf6047e1555..546af304ed5 100644 --- a/src/components/Table/src/BasicTable.vue +++ b/src/components/Table/src/BasicTable.vue @@ -32,13 +32,19 @@ diff --git a/src/components/Table/src/components/settings/ColumnSetting.vue b/src/components/Table/src/components/settings/ColumnSetting.vue index 9c78c826997..e77dae9b673 100644 --- a/src/components/Table/src/components/settings/ColumnSetting.vue +++ b/src/components/Table/src/components/settings/ColumnSetting.vue @@ -114,7 +114,7 @@ import { getPopupContainer } from '/@/utils'; import { omit } from 'lodash-es'; - import type { BasicColumn } from '../../types/table'; + import type { BasicColumn, ColumnChangeParam } from '../../types/table'; interface State { checkAll: boolean; @@ -141,8 +141,9 @@ Divider, Icon, }, + emits: ['columns-change'], - setup() { + setup(_, { emit }) { const { t } = useI18n(); const table = useTableContext(); @@ -234,10 +235,10 @@ const checkList = plainOptions.value.map((item) => item.value); if (e.target.checked) { state.checkedList = checkList; - table.setColumns(checkList); + setColumns(checkList); } else { state.checkedList = []; - table.setColumns([]); + setColumns([]); } } @@ -257,7 +258,7 @@ checkedList.sort((prev, next) => { return sortList.indexOf(prev) - sortList.indexOf(next); }); - table.setColumns(checkedList); + setColumns(checkedList); } // reset columns @@ -266,7 +267,7 @@ state.checkAll = true; plainOptions.value = unref(cachePlainOptions); plainSortOptions.value = unref(cachePlainOptions); - table.setColumns(table.getCacheColumns()); + setColumns(table.getCacheColumns()); } // Open the pop-up window for drag and drop initialization @@ -298,7 +299,7 @@ plainSortOptions.value = columns; plainOptions.value = columns; - table.setColumns(columns); + setColumns(columns); }, }); initSortable(); @@ -335,7 +336,21 @@ item.width = 100; } table.setCacheColumnsByField?.(item.dataIndex, { fixed: isFixed }); + setColumns(columns); + } + + function setColumns(columns: BasicColumn[] | string[]) { table.setColumns(columns); + const data: ColumnChangeParam[] = unref(plainOptions).map((col) => { + const visible = + columns.findIndex( + (c: BasicColumn | string) => + c === col.value || (typeof c !== 'string' && c.dataIndex === col.value) + ) !== -1; + return { dataIndex: col.value, fixed: col.fixed, visible }; + }); + + emit('columns-change', data); } return { diff --git a/src/components/Table/src/components/settings/index.vue b/src/components/Table/src/components/settings/index.vue index ed07999344b..4c0b054d052 100644 --- a/src/components/Table/src/components/settings/index.vue +++ b/src/components/Table/src/components/settings/index.vue @@ -2,13 +2,13 @@
- +
diff --git a/src/components/Table/src/hooks/useTableHeader.ts b/src/components/Table/src/hooks/useTableHeader.ts index 93c3ef4a6f1..a3e77a29aeb 100644 --- a/src/components/Table/src/hooks/useTableHeader.ts +++ b/src/components/Table/src/hooks/useTableHeader.ts @@ -1,5 +1,5 @@ import type { ComputedRef, Slots } from 'vue'; -import type { BasicTableProps } from '../types/table'; +import type { BasicTableProps, InnerHandlers } from '../types/table'; import { unref, computed, h } from 'vue'; import TableHeader from '../components/TableHeader.vue'; @@ -7,7 +7,11 @@ import TableHeader from '../components/TableHeader.vue'; import { isString } from '/@/utils/is'; import { getSlot } from '/@/utils/helper/tsxHelper'; -export function useTableHeader(propsRef: ComputedRef, slots: Slots) { +export function useTableHeader( + propsRef: ComputedRef, + slots: Slots, + handlers: InnerHandlers +) { const getHeaderProps = computed((): Recordable => { const { title, showTableSetting, titleHelpMessage, tableSetting } = unref(propsRef); const hideTitle = !slots.tableTitle && !title && !slots.toolbar && !showTableSetting; @@ -26,6 +30,7 @@ export function useTableHeader(propsRef: ComputedRef, slots: Sl titleHelpMessage, showTableSetting, tableSetting, + onColumnsChange: handlers.onColumnsChange, } as Recordable, { ...(slots.toolbar diff --git a/src/components/Table/src/types/table.ts b/src/components/Table/src/types/table.ts index 7e61c015c31..9b5b217abfb 100644 --- a/src/components/Table/src/types/table.ts +++ b/src/components/Table/src/types/table.ts @@ -381,6 +381,8 @@ export interface BasicTableProps { * @param expandedRows */ onExpandedRowsChange?: (expandedRows: string[] | number[]) => void; + + onColumnsChange?: (data: ColumnChangeParam[]) => void; } export type CellFormat = @@ -427,3 +429,13 @@ export interface BasicColumn extends ColumnProps { // 业务控制是否显示 ifShow?: boolean | ((column: BasicColumn) => boolean); } + +export type ColumnChangeParam = { + dataIndex: string; + fixed: boolean | 'left' | 'right' | undefined; + visible: boolean; +}; + +export interface InnerHandlers { + onColumnsChange: (data: ColumnChangeParam[]) => void; +} diff --git a/src/views/demo/table/Basic.vue b/src/views/demo/table/Basic.vue index 48cde076cbb..4d8e88cd17c 100644 --- a/src/views/demo/table/Basic.vue +++ b/src/views/demo/table/Basic.vue @@ -11,6 +11,7 @@ :bordered="border" showTableSetting :pagination="pagination" + @columns-change="handleColumnChange" >