import { ISchema, observer } from '@formily/react'; import { uid } from '@formily/shared'; import { Action, Input, SchemaComponent, SchemaComponentProvider, Table, useRecord, useRequest } from '@nocobase/client'; import React, { createContext, useContext, useState } from 'react'; const DataSourceContext = createContext(null); const useSelectedRowKeys = () => { const ctx = useContext(DataSourceContext); return [ctx.selectedRowKeys, ctx.setSelectedRowKeys]; }; const useDataSource = (options) => { const ctx = useContext(DataSourceContext); return useRequest( () => { console.log('ctx.dataSource', ctx.dataSource); return Promise.resolve({ data: ctx.dataSource, }); }, { ...options, refreshDeps: [JSON.stringify(ctx.dataSource)], }, ); }; const useCreateAction = () => { const ctx = useContext(DataSourceContext); return { async run() { console.log(ctx.dataSource); const dataSource = ctx.dataSource || []; dataSource.push({ id: uid(), name: uid(), }); ctx.setDataSource([...dataSource]); }, }; }; const useBulkDestroyAction = () => { const ctx = useContext(DataSourceContext); const { selectedRowKeys, setSelectedRowKeys } = ctx; return { async run() { const dataSource = ctx.dataSource || []; ctx.setDataSource( dataSource.filter((item) => { return !selectedRowKeys.includes(item.id); }), ); setSelectedRowKeys([]); }, }; }; const useUpdateAction = () => { const record = useRecord(); // const form = useForm(); const ctx = useContext(DataSourceContext); return { async run() { const dataSource = ctx.dataSource || []; ctx.setDataSource([ ...dataSource.map((item) => { if (record.id === item.id) { record.name = uid(); return record; } return item; }), ]); }, }; }; const useDestroyAction = () => { const record = useRecord(); const ctx = useContext(DataSourceContext); return { async run() { const dataSource = ctx.dataSource || []; ctx.setDataSource( dataSource.filter((item) => { return record.id !== item.id; }), ); }, }; }; const ds = { useSelectedRowKeys, useDataSource, useCreateAction, useBulkDestroyAction, useUpdateAction, useDestroyAction, }; const schema: ISchema = { type: 'object', properties: { context: { type: 'void', 'x-component': 'DataSourceProvider', properties: { action1: { title: '添加', 'x-component': 'Action', 'x-component-props': { useAction: '{{ ds.useCreateAction }}', }, }, action2: { title: '删除', 'x-component': 'Action', 'x-component-props': { useAction: '{{ ds.useBulkDestroyAction }}', }, }, input: { type: 'array', title: `编辑模式`, 'x-component': 'Table.Array', 'x-component-props': { rowKey: 'id', pagination: false, rowSelection: { type: 'checkbox', }, useSelectedRowKeys: '{{ ds.useSelectedRowKeys }}', useDataSource: '{{ ds.useDataSource }}', }, properties: { column1: { type: 'void', title: 'Name', 'x-component': 'Table.Column', properties: { name: { type: 'string', 'x-component': 'Input', 'x-read-pretty': true, }, }, }, column2: { type: 'void', title: 'Actions', 'x-component': 'Table.Column', properties: { action1: { title: '编辑', 'x-component': 'Action', 'x-component-props': { useAction: '{{ ds.useUpdateAction }}', }, }, action2: { title: '删除', 'x-component': 'Action', 'x-component-props': { useAction: '{{ ds.useDestroyAction }}', }, }, }, }, }, }, }, }, }, }; const DataSourceProvider = observer((props) => { const [selectedRowKeys, setSelectedRowKeys] = useState([]); const [dataSource, setDataSource] = useState([]); const service = useRequest( () => { return Promise.resolve({ data: [ { id: 1, name: 'Name1' }, { id: 2, name: 'Name2' }, { id: 3, name: 'Name3' }, ], }); }, { onSuccess(data) { setDataSource(data.data); }, }, ); console.log('dataSource1', dataSource); return ( {props.children} ); }); export default () => { return ( ); };