Skip to content

Commit 39531ce

Browse files
authored
feat: table 的列信息本地缓存支持配置 Close: #11850 (#11855)
1 parent 38ca42c commit 39531ce

File tree

5 files changed

+42
-15
lines changed

5 files changed

+42
-15
lines changed

Diff for: docs/zh-CN/components/table.md

+1
Original file line numberDiff line numberDiff line change
@@ -2043,6 +2043,7 @@ popOver 的其它配置请参考 [popover](./popover)
20432043
| lazyRenderAfter | `number` | `100` | 用来控制从第几行开始懒渲染行,用来渲染大表格时有用 | |
20442044
| tableLayout | `auto` \| `fixed` | `auto` | 当配置为 fixed 时,内容将不会撑开表格,自动换行 | |
20452045
| reUseRow | `false` \| `match` | | 默认,当 API 返回数据与当前一致时,不会触发表格行重渲染(省性能但可能导致数据渲染不同步);为 false,则总会触发重渲染;为 match,尽量复用返回数据中 id 一致的对象,性能可认为是默认和 false 两者的折中 | |
2046+
| persistKey | `string` | | 用于配置列排序、列显示的本地缓存所使用的 key | |
20462047

20472048
### 列配置属性表
20482049

Diff for: packages/amis-core/src/store/table.ts

+8-2
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import {
3232
hasVisibleExpression,
3333
sortArray
3434
} from '../utils/helper';
35-
import {evalExpression} from '../utils/tpl';
35+
import {evalExpression, filter} from '../utils/tpl';
3636
import {IFormStore} from './form';
3737
import {getStoreById} from './manager';
3838
import {getPageId} from '../utils/getPageId';
@@ -593,7 +593,8 @@ export const TableStore = iRendererStore
593593
searchFormExpanded: false, // 用来控制搜索框是否展开了,那个自动根据 searchable 生成的表单 autoGenerateFilter
594594
lazyRenderAfter: 100,
595595
tableLayout: 'auto',
596-
theadHeight: 0
596+
theadHeight: 0,
597+
persistKey: ''
597598
})
598599
.views(self => {
599600
function getColumnsExceptBuiltinTypes() {
@@ -851,6 +852,10 @@ export const TableStore = iRendererStore
851852
getSelectionUpperLimit,
852853

853854
get columnsKey() {
855+
if (self.persistKey) {
856+
return filter(self.persistKey, self.data);
857+
}
858+
854859
const fn = getEnv(self).getPageId || getPageId;
855860
return fn() + self.path;
856861
},
@@ -1218,6 +1223,7 @@ export const TableStore = iRendererStore
12181223
(self.tableLayout = config.tableLayout);
12191224

12201225
config.showIndex !== undefined && (self.showIndex = config.showIndex);
1226+
config.persistKey !== undefined && (self.persistKey = config.persistKey);
12211227

12221228
if (config.columns && Array.isArray(config.columns)) {
12231229
let columns: Array<SColumn> = config.columns

Diff for: packages/amis-core/src/store/table2.ts

+17-7
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ import {Api, Payload, fetchOptions, ApiObject} from '../types';
3232
import {ServiceStore} from './service';
3333
import {IFormStore} from './form';
3434
import {getPageId} from '../utils/getPageId';
35+
import {filter} from '../utils/tpl';
36+
3537
class ServerError extends Error {
3638
type = 'ServerError';
3739
}
@@ -216,7 +218,8 @@ export const TableStore2 = ServiceStore.named('TableStore2')
216218
dragging: false,
217219
rowSelectionKeyField: 'id',
218220
formsRef: types.optional(types.array(types.frozen()), []),
219-
canAccessSuperData: false
221+
canAccessSuperData: false,
222+
persistKey: ''
220223
})
221224
.views(self => {
222225
function getToggable() {
@@ -455,6 +458,7 @@ export const TableStore2 = ServiceStore.named('TableStore2')
455458
(self.columnsTogglable = config.columnsTogglable);
456459
config.canAccessSuperData !== undefined &&
457460
(self.canAccessSuperData = !!config.canAccessSuperData);
461+
config.persistKey !== undefined && (self.persistKey = config.persistKey);
458462

459463
if (typeof config.orderBy === 'string') {
460464
setOrderByInfo(
@@ -506,12 +510,20 @@ export const TableStore2 = ServiceStore.named('TableStore2')
506510
persistSaveToggledColumns();
507511
}
508512

509-
function persistSaveToggledColumns() {
513+
function getPersistKey() {
514+
if (self.persistKey) {
515+
return filter(self.persistKey, self.data);
516+
}
517+
510518
const fn = getEnv(self).getPageId || getPageId;
519+
return fn() + self.path;
520+
}
521+
522+
function persistSaveToggledColumns() {
511523
const key =
512-
fn() +
513-
self.path +
524+
getPersistKey() +
514525
self.toggableColumns.map(item => item.name || item.index).join('-');
526+
515527
localStorage.setItem(
516528
key,
517529
JSON.stringify(self.activeToggaleColumns.map(item => item.index))
@@ -824,10 +836,8 @@ export const TableStore2 = ServiceStore.named('TableStore2')
824836
if (!isAlive(self)) {
825837
return;
826838
}
827-
const fn = getEnv(self).getPageId || getPageId;
828839
const key =
829-
fn() +
830-
self.path +
840+
getPersistKey() +
831841
self.toggableColumns.map(item => item.name || item.index).join('-');
832842

833843
const data = localStorage.getItem(key);

Diff for: packages/amis/src/renderers/Table/index.tsx

+11-3
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,11 @@ export interface TableSchema extends BaseSchema {
375375
* 懒加载 API,当行数据中用 defer: true 标记了,则其孩子节点将会用这个 API 来拉取数据。
376376
*/
377377
deferApi?: SchemaApi;
378+
379+
/**
380+
* 持久化 key
381+
*/
382+
persistKey?: string;
378383
}
379384

380385
export interface TableProps extends RendererProps, SpinnerExtraProps {
@@ -654,7 +659,8 @@ export default class Table<
654659
lazyRenderAfter,
655660
tableLayout,
656661
resolveDefinitions,
657-
showIndex
662+
showIndex,
663+
persistKey
658664
} = props;
659665

660666
let combineNum = props.combineNum;
@@ -689,7 +695,8 @@ export default class Table<
689695
canAccessSuperData,
690696
lazyRenderAfter,
691697
tableLayout,
692-
showIndex
698+
showIndex,
699+
persistKey
693700
},
694701
{
695702
resolveDefinitions
@@ -983,7 +990,8 @@ export default class Table<
983990
'canAccessSuperData',
984991
'lazyRenderAfter',
985992
'tableLayout',
986-
'showIndex'
993+
'showIndex',
994+
'persistKey'
987995
],
988996
prevProps,
989997
props,

Diff for: packages/amis/src/renderers/Table2/index.tsx

+5-3
Original file line numberDiff line numberDiff line change
@@ -554,14 +554,16 @@ export default class Table2 extends React.Component<Table2Props, object> {
554554
rowSelection,
555555
keyField,
556556
primaryField,
557-
canAccessSuperData
557+
canAccessSuperData,
558+
persistKey
558559
} = props;
559560

560561
store.update({
561562
columnsTogglable,
562563
columns,
563564
canAccessSuperData,
564-
rowSelectionKeyField: primaryField || rowSelection?.keyField || keyField
565+
rowSelectionKeyField: primaryField || rowSelection?.keyField || keyField,
566+
persistKey
565567
});
566568
Table2.syncRows(store, props, undefined) && this.syncSelected();
567569

@@ -710,7 +712,7 @@ export default class Table2 extends React.Component<Table2Props, object> {
710712
const store = props.store;
711713

712714
changedEffect(
713-
['orderBy', 'columnsTogglable', 'canAccessSuperData'],
715+
['orderBy', 'columnsTogglable', 'canAccessSuperData', 'persistKey'],
714716
prevProps,
715717
props,
716718
changes => {

0 commit comments

Comments
 (0)