diff --git a/src/components/Table/src/BasicTable.vue b/src/components/Table/src/BasicTable.vue index 5a6d0e9c188..e114611ac91 100644 --- a/src/components/Table/src/BasicTable.vue +++ b/src/components/Table/src/BasicTable.vue @@ -129,6 +129,7 @@ getDataSource, setTableData, updateTableDataRecord, + findTableDataRecord, fetch, getRowKey, reload, @@ -266,6 +267,7 @@ setPagination, setTableData, updateTableDataRecord, + findTableDataRecord, redoHeight, setSelectedRowKeys, setColumns, diff --git a/src/components/Table/src/hooks/useDataSource.ts b/src/components/Table/src/hooks/useDataSource.ts index f03c796e3b3..fe6ab3a890a 100644 --- a/src/components/Table/src/hooks/useDataSource.ts +++ b/src/components/Table/src/hooks/useDataSource.ts @@ -149,18 +149,8 @@ export function useDataSource( rowKey: string | number, record: Recordable ): Recordable | undefined { - if (!dataSourceRef.value || dataSourceRef.value.length == 0) return; - const rowKeyName = unref(getRowKey); - if (!rowKeyName) { - return; - } - const row = dataSourceRef.value.find((r) => { - if (typeof rowKeyName === 'function') { - return (rowKeyName(r) as string) === rowKey; - } else { - return Reflect.has(r, rowKeyName) && r[rowKeyName] === rowKey; - } - }); + const row = findTableDataRecord(rowKey); + if (row) { for (const field in row) { if (Reflect.has(record, field)) row[field] = record[field]; @@ -169,6 +159,43 @@ export function useDataSource( } } + function findTableDataRecord(rowKey: string | number) { + if (!dataSourceRef.value || dataSourceRef.value.length == 0) return; + + const rowKeyName = unref(getRowKey); + if (!rowKeyName) return; + + const { childrenColumnName = 'children' } = unref(propsRef); + + const findRow = (array: any[]) => { + let ret; + array.some(function iter(r) { + if (typeof rowKeyName === 'function') { + if ((rowKeyName(r) as string) === rowKey) { + ret = r; + return true; + } + } else { + if (Reflect.has(r, rowKeyName) && r[rowKeyName] === rowKey) { + ret = r; + return true; + } + } + return r[childrenColumnName] && r[childrenColumnName].some(iter); + }); + return ret; + }; + + // const row = dataSourceRef.value.find(r => { + // if (typeof rowKeyName === 'function') { + // return (rowKeyName(r) as string) === rowKey + // } else { + // return Reflect.has(r, rowKeyName) && r[rowKeyName] === rowKey + // } + // }) + return findRow(dataSourceRef.value); + } + async function fetch(opt?: FetchParams) { const { api, searchInfo, fetchSetting, beforeFetch, afterFetch, useSearchForm, pagination } = unref(propsRef); @@ -280,6 +307,7 @@ export function useDataSource( reload, updateTableData, updateTableDataRecord, + findTableDataRecord, handleTableChange, }; } diff --git a/src/components/Table/src/hooks/useTable.ts b/src/components/Table/src/hooks/useTable.ts index 2a9d35ad07e..e20d67febeb 100644 --- a/src/components/Table/src/hooks/useTable.ts +++ b/src/components/Table/src/hooks/useTable.ts @@ -122,6 +122,9 @@ export function useTable(tableProps?: Props): [ updateTableDataRecord: (rowKey: string | number, record: Recordable) => { return getTableInstance().updateTableDataRecord(rowKey, record); }, + findTableDataRecord: (rowKey: string | number) => { + return getTableInstance().findTableDataRecord(rowKey); + }, getRowSelection: () => { return toRaw(getTableInstance().getRowSelection()); }, diff --git a/src/components/Table/src/types/table.ts b/src/components/Table/src/types/table.ts index 56c539c3f0d..56bf2c8c609 100644 --- a/src/components/Table/src/types/table.ts +++ b/src/components/Table/src/types/table.ts @@ -95,6 +95,7 @@ export interface TableActionType { setPagination: (info: Partial) => void; setTableData: (values: T[]) => void; updateTableDataRecord: (rowKey: string | number, record: Recordable) => Recordable | void; + findTableDataRecord: (rowKey: string | number) => Recordable | void; getColumns: (opt?: GetColumnsParams) => BasicColumn[]; setColumns: (columns: BasicColumn[] | string[]) => void; getDataSource: () => T[];