diff --git a/src/components/Table/src/BasicTable.vue b/src/components/Table/src/BasicTable.vue index c2af9a7e4c3ffd399eb89862323f3b90e8787ab9..673ba195ca6403872ef158e18ca10cdacc7522ac 100644 --- a/src/components/Table/src/BasicTable.vue +++ b/src/components/Table/src/BasicTable.vue @@ -211,6 +211,7 @@ getColumns, setCacheColumnsByField, setColumns, + updateColumn, getColumnsRef, getCacheColumns, } = useColumns(getProps, getPaginationInfo); @@ -334,6 +335,7 @@ redoHeight, setSelectedRowKeys, setColumns, + updateColumn, setLoading, getDataSource, getDelDataSource, diff --git a/src/components/Table/src/hooks/useColumns.ts b/src/components/Table/src/hooks/useColumns.ts index 57aba47861bc6f1074e5c9895c59bc8a3c828392..26a8da43b25d3008aaeee224e99b741fe7a39bc4 100644 --- a/src/components/Table/src/hooks/useColumns.ts +++ b/src/components/Table/src/hooks/useColumns.ts @@ -5,8 +5,10 @@ import { computed, Ref, ref, toRaw, unref, watch } from 'vue'; import { renderEditCell } from '../components/editable'; import { usePermission } from '/@/hooks/web/usePermission'; import { useI18n } from '/@/hooks/web/useI18n'; -import { isArray, isBoolean, isFunction, isMap, isString } from '/@/utils/is'; -import { cloneDeep, isEqual } from 'lodash-es'; +import { isObject, isArray, isBoolean, isFunction, isMap, isString } from '/@/utils/is'; +import { deepMerge } from '/@/utils'; +import { error } from '/@/utils/log'; +import { cloneDeep, isEqual, uniqBy } from 'lodash-es'; import { formatToDate } from '/@/utils/dateUtil'; import { ACTION_COLUMN_FLAG, DEFAULT_ALIGN, INDEX_COLUMN_FLAG, PAGE_SIZE } from '../const'; @@ -259,6 +261,36 @@ export function useColumns( } } + function updateColumn(data: Partial | Partial[]) { + let updateData: Partial[] = []; + if (isObject(data)) { + updateData.push(data as BasicColumn); + } + if (isArray(data)) { + updateData = [...data]; + } + const hasDataIndex = updateData.every( + (item) => Reflect.has(item, 'dataIndex') && item.dataIndex, + ); + if (!hasDataIndex) { + error('必须包含 dataIndex 字段。'); + return; + } + + const column: BasicColumn[] = []; + updateData.forEach((item) => { + columnsRef.value.forEach((val) => { + if (val.dataIndex === item.dataIndex) { + const newColumn = deepMerge(val, item); + column.push(newColumn as BasicColumn); + } else { + column.push(val); + } + }); + }); + columnsRef.value = uniqBy(column, 'dataIndex'); + } + function getColumns(opt?: GetColumnsParams) { const { ignoreIndex, ignoreAction, sort } = opt || {}; let columns = toRaw(unref(getColumnsRef)); @@ -284,6 +316,7 @@ export function useColumns( getCacheColumns, getColumns, setColumns, + updateColumn, getViewColumns, setCacheColumnsByField, }; diff --git a/src/components/Table/src/hooks/useTable.ts b/src/components/Table/src/hooks/useTable.ts index 022e5cf292cba6f43fef14ea593ebe03c3526b4f..f6e59ad72670327feb7d8e1ed08b0b68ed7c484a 100644 --- a/src/components/Table/src/hooks/useTable.ts +++ b/src/components/Table/src/hooks/useTable.ts @@ -98,6 +98,9 @@ export function useTable(tableProps?: Props): [ setTableData: (values: any[]) => { return getTableInstance().setTableData(values); }, + updateColumn: (column: BasicColumn | BasicColumn[]) => { + getTableInstance().updateColumn(column); + }, setPagination: (info: Partial) => { return getTableInstance().setPagination(info); }, diff --git a/src/components/Table/src/types/table.ts b/src/components/Table/src/types/table.ts index a133e067504077bccc2df699946af4d8e97b99e3..502095e54e41a7aeb6c02d697bc0462520640917 100644 --- a/src/components/Table/src/types/table.ts +++ b/src/components/Table/src/types/table.ts @@ -102,6 +102,7 @@ export interface TableActionType { findTableDataRecord: (rowKey: string | number) => Recordable | void; getColumns: (opt?: GetColumnsParams) => BasicColumn[]; setColumns: (columns: BasicColumn[] | string[]) => void; + updateColumn: (column: BasicColumn | BasicColumn[]) => void; getDataSource: () => T[]; getDelDataSource: () => T[]; getRawDataSource: () => T;