Skip to content

feat: table 的列信息本地缓存支持配置 Close: #11850 #11855

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 15, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

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

### 列配置属性表

Expand Down
10 changes: 8 additions & 2 deletions packages/amis-core/src/store/table.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ import {
hasVisibleExpression,
sortArray
} from '../utils/helper';
import {evalExpression} from '../utils/tpl';
import {evalExpression, filter} from '../utils/tpl';
import {IFormStore} from './form';
import {getStoreById} from './manager';
import {getPageId} from '../utils/getPageId';
Expand Down Expand Up @@ -593,7 +593,8 @@ export const TableStore = iRendererStore
searchFormExpanded: false, // 用来控制搜索框是否展开了,那个自动根据 searchable 生成的表单 autoGenerateFilter
lazyRenderAfter: 100,
tableLayout: 'auto',
theadHeight: 0
theadHeight: 0,
persistKey: ''
})
.views(self => {
function getColumnsExceptBuiltinTypes() {
Expand Down Expand Up @@ -851,6 +852,10 @@ export const TableStore = iRendererStore
getSelectionUpperLimit,

get columnsKey() {
if (self.persistKey) {
return filter(self.persistKey, self.data);
}

const fn = getEnv(self).getPageId || getPageId;
return fn() + self.path;
},
Expand Down Expand Up @@ -1218,6 +1223,7 @@ export const TableStore = iRendererStore
(self.tableLayout = config.tableLayout);

config.showIndex !== undefined && (self.showIndex = config.showIndex);
config.persistKey !== undefined && (self.persistKey = config.persistKey);

if (config.columns && Array.isArray(config.columns)) {
let columns: Array<SColumn> = config.columns
Expand Down
24 changes: 17 additions & 7 deletions packages/amis-core/src/store/table2.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ import {Api, Payload, fetchOptions, ApiObject} from '../types';
import {ServiceStore} from './service';
import {IFormStore} from './form';
import {getPageId} from '../utils/getPageId';
import {filter} from '../utils/tpl';

class ServerError extends Error {
type = 'ServerError';
}
Expand Down Expand Up @@ -216,7 +218,8 @@ export const TableStore2 = ServiceStore.named('TableStore2')
dragging: false,
rowSelectionKeyField: 'id',
formsRef: types.optional(types.array(types.frozen()), []),
canAccessSuperData: false
canAccessSuperData: false,
persistKey: ''
})
.views(self => {
function getToggable() {
Expand Down Expand Up @@ -455,6 +458,7 @@ export const TableStore2 = ServiceStore.named('TableStore2')
(self.columnsTogglable = config.columnsTogglable);
config.canAccessSuperData !== undefined &&
(self.canAccessSuperData = !!config.canAccessSuperData);
config.persistKey !== undefined && (self.persistKey = config.persistKey);

if (typeof config.orderBy === 'string') {
setOrderByInfo(
Expand Down Expand Up @@ -506,12 +510,20 @@ export const TableStore2 = ServiceStore.named('TableStore2')
persistSaveToggledColumns();
}

function persistSaveToggledColumns() {
function getPersistKey() {
if (self.persistKey) {
return filter(self.persistKey, self.data);
}

const fn = getEnv(self).getPageId || getPageId;
return fn() + self.path;
}

function persistSaveToggledColumns() {
const key =
fn() +
self.path +
getPersistKey() +
self.toggableColumns.map(item => item.name || item.index).join('-');

localStorage.setItem(
key,
JSON.stringify(self.activeToggaleColumns.map(item => item.index))
Expand Down Expand Up @@ -824,10 +836,8 @@ export const TableStore2 = ServiceStore.named('TableStore2')
if (!isAlive(self)) {
return;
}
const fn = getEnv(self).getPageId || getPageId;
const key =
fn() +
self.path +
getPersistKey() +
self.toggableColumns.map(item => item.name || item.index).join('-');

const data = localStorage.getItem(key);
Expand Down
14 changes: 11 additions & 3 deletions packages/amis/src/renderers/Table/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -375,6 +375,11 @@ export interface TableSchema extends BaseSchema {
* 懒加载 API,当行数据中用 defer: true 标记了,则其孩子节点将会用这个 API 来拉取数据。
*/
deferApi?: SchemaApi;

/**
* 持久化 key
*/
persistKey?: string;
}

export interface TableProps extends RendererProps, SpinnerExtraProps {
Expand Down Expand Up @@ -654,7 +659,8 @@ export default class Table<
lazyRenderAfter,
tableLayout,
resolveDefinitions,
showIndex
showIndex,
persistKey
} = props;

let combineNum = props.combineNum;
Expand Down Expand Up @@ -689,7 +695,8 @@ export default class Table<
canAccessSuperData,
lazyRenderAfter,
tableLayout,
showIndex
showIndex,
persistKey
},
{
resolveDefinitions
Expand Down Expand Up @@ -983,7 +990,8 @@ export default class Table<
'canAccessSuperData',
'lazyRenderAfter',
'tableLayout',
'showIndex'
'showIndex',
'persistKey'
],
prevProps,
props,
Expand Down
8 changes: 5 additions & 3 deletions packages/amis/src/renderers/Table2/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -554,14 +554,16 @@ export default class Table2 extends React.Component<Table2Props, object> {
rowSelection,
keyField,
primaryField,
canAccessSuperData
canAccessSuperData,
persistKey
} = props;

store.update({
columnsTogglable,
columns,
canAccessSuperData,
rowSelectionKeyField: primaryField || rowSelection?.keyField || keyField
rowSelectionKeyField: primaryField || rowSelection?.keyField || keyField,
persistKey
});
Table2.syncRows(store, props, undefined) && this.syncSelected();

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

changedEffect(
['orderBy', 'columnsTogglable', 'canAccessSuperData'],
['orderBy', 'columnsTogglable', 'canAccessSuperData', 'persistKey'],
prevProps,
props,
changes => {
Expand Down
Loading