mirror of
https://github.com/nocobase/nocobase
synced 2024-11-15 23:16:03 +00:00
e6a2a292b3
* feat: upgrade formily * fix: upgrade @formily/json-schema * fix: optimizing performance * fix: performance code * refactor: `React.memo` and `observer` component add `displayName` property * fix: add cache to Schema.compile * feat: 优化代码 * fix: 修复卡顿最终的问题 * Update SchemaComponentProvider.tsx * feat: 再次优化代码 * feat: optimized code --------- Co-authored-by: dream2023 <1098626505@qq.com>
111 lines
2.7 KiB
TypeScript
111 lines
2.7 KiB
TypeScript
import { ArrayField } from '@formily/core';
|
|
import { connect, ISchema, observer, RecursionField, useField, useFieldSchema } from '@formily/react';
|
|
import { SchemaComponent, SchemaComponentProvider } from '@nocobase/client';
|
|
import { Table, TableColumnType } from 'antd';
|
|
import React from 'react';
|
|
|
|
const ArrayTable = observer(
|
|
(props: any) => {
|
|
const { rowKey } = props;
|
|
const field = useField<ArrayField>();
|
|
const schema = useFieldSchema();
|
|
const columnSchemas = schema.reduceProperties((buf, s) => {
|
|
if (s['x-component'] === 'ArrayTable.Column') {
|
|
buf.push(s);
|
|
}
|
|
return buf;
|
|
}, []);
|
|
|
|
const columns = columnSchemas.map((s) => {
|
|
return {
|
|
render: (value, record) => {
|
|
return <RecursionField name={record.__path} schema={s} onlyRenderProperties />;
|
|
},
|
|
} as TableColumnType<any>;
|
|
});
|
|
|
|
return <Table rowKey={rowKey} columns={columns} dataSource={field.value} />;
|
|
},
|
|
{ displayName: 'ArrayTable' },
|
|
);
|
|
|
|
const Value = connect((props) => {
|
|
return <li>value: {props.value}</li>;
|
|
});
|
|
|
|
const schema: ISchema = {
|
|
type: 'object',
|
|
properties: {
|
|
objArr: {
|
|
type: 'array',
|
|
default: [
|
|
{ __path: '0', id: 1, value: 't1' },
|
|
{
|
|
__path: '1',
|
|
id: 2,
|
|
value: 't2',
|
|
children: [
|
|
{
|
|
__path: '1.children.0',
|
|
id: 5,
|
|
value: 't5',
|
|
parentId: 2,
|
|
},
|
|
],
|
|
},
|
|
{
|
|
__path: '2',
|
|
id: 3,
|
|
value: 't3',
|
|
children: [
|
|
{
|
|
__path: '2.children.0',
|
|
id: 4,
|
|
value: 't4',
|
|
parentId: 3,
|
|
children: [
|
|
{
|
|
__path: '2.children.0.children.0',
|
|
id: 6,
|
|
value: 't6',
|
|
parentId: 4,
|
|
},
|
|
{
|
|
__path: '2.children.0.children.1',
|
|
id: 7,
|
|
value: 't7',
|
|
parentId: 4,
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
],
|
|
'x-component': 'ArrayTable',
|
|
'x-component-props': {
|
|
rowKey: 'id',
|
|
},
|
|
properties: {
|
|
c1: {
|
|
type: 'void',
|
|
'x-component': 'ArrayTable.Column',
|
|
properties: {
|
|
value: {
|
|
type: 'string',
|
|
'x-component': 'Value',
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
};
|
|
|
|
export default () => {
|
|
return (
|
|
<SchemaComponentProvider components={{ ArrayTable, Value }}>
|
|
<SchemaComponent schema={schema} />
|
|
</SchemaComponentProvider>
|
|
);
|
|
};
|