Commit 72f953c8d3413a7f5482793258503017a81cc759
Committed by
GitHub
1 parent
d76cfd7f
fix(table): recursive updateTableDataRecord (#1024)
无刷新更新表格数据时,支持递归查找,用于树状数据时。同时新增 findTableDataRecord 函数,用于支持无刷新新增数据到树状表格中
Showing
4 changed files
with
46 additions
and
12 deletions
src/components/Table/src/BasicTable.vue
... | ... | @@ -129,6 +129,7 @@ |
129 | 129 | getDataSource, |
130 | 130 | setTableData, |
131 | 131 | updateTableDataRecord, |
132 | + findTableDataRecord, | |
132 | 133 | fetch, |
133 | 134 | getRowKey, |
134 | 135 | reload, |
... | ... | @@ -266,6 +267,7 @@ |
266 | 267 | setPagination, |
267 | 268 | setTableData, |
268 | 269 | updateTableDataRecord, |
270 | + findTableDataRecord, | |
269 | 271 | redoHeight, |
270 | 272 | setSelectedRowKeys, |
271 | 273 | setColumns, | ... | ... |
src/components/Table/src/hooks/useDataSource.ts
... | ... | @@ -149,18 +149,8 @@ export function useDataSource( |
149 | 149 | rowKey: string | number, |
150 | 150 | record: Recordable |
151 | 151 | ): Recordable | undefined { |
152 | - if (!dataSourceRef.value || dataSourceRef.value.length == 0) return; | |
153 | - const rowKeyName = unref(getRowKey); | |
154 | - if (!rowKeyName) { | |
155 | - return; | |
156 | - } | |
157 | - const row = dataSourceRef.value.find((r) => { | |
158 | - if (typeof rowKeyName === 'function') { | |
159 | - return (rowKeyName(r) as string) === rowKey; | |
160 | - } else { | |
161 | - return Reflect.has(r, rowKeyName) && r[rowKeyName] === rowKey; | |
162 | - } | |
163 | - }); | |
152 | + const row = findTableDataRecord(rowKey); | |
153 | + | |
164 | 154 | if (row) { |
165 | 155 | for (const field in row) { |
166 | 156 | if (Reflect.has(record, field)) row[field] = record[field]; |
... | ... | @@ -169,6 +159,43 @@ export function useDataSource( |
169 | 159 | } |
170 | 160 | } |
171 | 161 | |
162 | + function findTableDataRecord(rowKey: string | number) { | |
163 | + if (!dataSourceRef.value || dataSourceRef.value.length == 0) return; | |
164 | + | |
165 | + const rowKeyName = unref(getRowKey); | |
166 | + if (!rowKeyName) return; | |
167 | + | |
168 | + const { childrenColumnName = 'children' } = unref(propsRef); | |
169 | + | |
170 | + const findRow = (array: any[]) => { | |
171 | + let ret; | |
172 | + array.some(function iter(r) { | |
173 | + if (typeof rowKeyName === 'function') { | |
174 | + if ((rowKeyName(r) as string) === rowKey) { | |
175 | + ret = r; | |
176 | + return true; | |
177 | + } | |
178 | + } else { | |
179 | + if (Reflect.has(r, rowKeyName) && r[rowKeyName] === rowKey) { | |
180 | + ret = r; | |
181 | + return true; | |
182 | + } | |
183 | + } | |
184 | + return r[childrenColumnName] && r[childrenColumnName].some(iter); | |
185 | + }); | |
186 | + return ret; | |
187 | + }; | |
188 | + | |
189 | + // const row = dataSourceRef.value.find(r => { | |
190 | + // if (typeof rowKeyName === 'function') { | |
191 | + // return (rowKeyName(r) as string) === rowKey | |
192 | + // } else { | |
193 | + // return Reflect.has(r, rowKeyName) && r[rowKeyName] === rowKey | |
194 | + // } | |
195 | + // }) | |
196 | + return findRow(dataSourceRef.value); | |
197 | + } | |
198 | + | |
172 | 199 | async function fetch(opt?: FetchParams) { |
173 | 200 | const { api, searchInfo, fetchSetting, beforeFetch, afterFetch, useSearchForm, pagination } = |
174 | 201 | unref(propsRef); |
... | ... | @@ -280,6 +307,7 @@ export function useDataSource( |
280 | 307 | reload, |
281 | 308 | updateTableData, |
282 | 309 | updateTableDataRecord, |
310 | + findTableDataRecord, | |
283 | 311 | handleTableChange, |
284 | 312 | }; |
285 | 313 | } | ... | ... |
src/components/Table/src/hooks/useTable.ts
... | ... | @@ -122,6 +122,9 @@ export function useTable(tableProps?: Props): [ |
122 | 122 | updateTableDataRecord: (rowKey: string | number, record: Recordable) => { |
123 | 123 | return getTableInstance().updateTableDataRecord(rowKey, record); |
124 | 124 | }, |
125 | + findTableDataRecord: (rowKey: string | number) => { | |
126 | + return getTableInstance().findTableDataRecord(rowKey); | |
127 | + }, | |
125 | 128 | getRowSelection: () => { |
126 | 129 | return toRaw(getTableInstance().getRowSelection()); |
127 | 130 | }, | ... | ... |
src/components/Table/src/types/table.ts
... | ... | @@ -95,6 +95,7 @@ export interface TableActionType { |
95 | 95 | setPagination: (info: Partial<PaginationProps>) => void; |
96 | 96 | setTableData: <T = Recordable>(values: T[]) => void; |
97 | 97 | updateTableDataRecord: (rowKey: string | number, record: Recordable) => Recordable | void; |
98 | + findTableDataRecord: (rowKey: string | number) => Recordable | void; | |
98 | 99 | getColumns: (opt?: GetColumnsParams) => BasicColumn[]; |
99 | 100 | setColumns: (columns: BasicColumn[] | string[]) => void; |
100 | 101 | getDataSource: <T = Recordable>() => T[]; | ... | ... |