From efbdab6bb564a1bde4679b2069acdf3041f96a5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=9F=E8=B4=A4?= Date: Wed, 20 Mar 2024 12:48:00 +0800 Subject: [PATCH] feat(form): ProFormFieldSet support funtion --- packages/form/src/components/Field/index.tsx | 2 +- .../demos/components-other-readonly.tsx | 21 +++++ .../form/src/components/FieldSet/index.tsx | 77 ++++++++++--------- packages/form/src/typing.ts | 2 +- tests/form/__snapshots__/demo.test.ts.snap | 56 ++++++++++++++ 5 files changed, 119 insertions(+), 39 deletions(-) diff --git a/packages/form/src/components/Field/index.tsx b/packages/form/src/components/Field/index.tsx index 18699c47c62d..6946daecd674 100644 --- a/packages/form/src/components/Field/index.tsx +++ b/packages/form/src/components/Field/index.tsx @@ -104,7 +104,7 @@ const BaseProFormField: React.FC< } onChange?.(...restParams); }, - ...children.props, + ...((children?.props as any) || {}), }); } return <>{children}; diff --git a/packages/form/src/components/FieldSet/demos/components-other-readonly.tsx b/packages/form/src/components/FieldSet/demos/components-other-readonly.tsx index a9f85c706f23..676a066b2613 100644 --- a/packages/form/src/components/FieldSet/demos/components-other-readonly.tsx +++ b/packages/form/src/components/FieldSet/demos/components-other-readonly.tsx @@ -103,6 +103,7 @@ const Demo = () => ( name: '蚂蚁金服有限公司', radio: 'a', list: ['1', '2', '3'], + list2: ['1', '2', '5', '5'], select: 'china', 'radio-button': 'a', dragger: [ @@ -339,6 +340,26 @@ const Demo = () => ( - + + ({ startTime: value[0], endTime: value[1] })} + > + {(value) => { + return value?.map((e, index) => { + return ( + + ); + }); + }} + diff --git a/packages/form/src/components/FieldSet/index.tsx b/packages/form/src/components/FieldSet/index.tsx index 80f88e9fd5b0..06ad3fa561f2 100644 --- a/packages/form/src/components/FieldSet/index.tsx +++ b/packages/form/src/components/FieldSet/index.tsx @@ -1,5 +1,5 @@ -import { useRefFunction } from '@ant-design/pro-utils'; -import type { FormItemProps, SpaceProps } from 'antd'; +import { runFunction, useRefFunction } from '@ant-design/pro-utils'; +import type { SpaceProps } from 'antd'; import { Input, Space } from 'antd'; import type { GroupProps } from 'antd/lib/input'; import toArray from 'rc-util/lib/Children/toArray'; @@ -18,7 +18,9 @@ export type ProFormFieldSetProps = { fieldProps?: any; convertValue?: ProFormItemProps['convertValue']; transform?: ProFormItemProps['transform']; - children?: React.ReactNode; + children?: + | ((value: T[], props: ProFormFieldSetProps) => React.ReactNode) + | React.ReactNode; lightProps?: LightWrapperProps; }; @@ -36,19 +38,20 @@ export function defaultGetValueFromEvent(valuePropName: string, ...args: any) { return event; } -const FieldSet: React.FC = ({ - children, - value = [], - valuePropName, - onChange, - fieldProps, - space, - type = 'space', - transform, - convertValue, - lightProps, - ...rest -}) => { +const FieldSet: React.FC = (props) => { + const { + children, + value = [], + valuePropName, + onChange, + fieldProps, + space, + type = 'space', + transform, + convertValue, + lightProps, + ...rest + } = props; /** * 使用方法的引用防止闭包 * @@ -67,7 +70,7 @@ const FieldSet: React.FC = ({ }); let itemIndex = -1; - const list = toArray(children).map((item: any) => { + const list = toArray(runFunction(children, value, props)).map((item: any) => { if (React.isValidElement(item)) { itemIndex += 1; const index = itemIndex; @@ -124,25 +127,25 @@ const FieldSet: React.FC = ({ return {list}; }; -const BaseProFormFieldSet: React.FC = - React.forwardRef(({ children, space, valuePropName, ...rest }, ref) => { - useImperativeHandle(ref, () => ({})); - return ( -
- {children} -
- ); - }); +const BaseProFormFieldSet: React.FC< + Omit & ProFormFieldSetProps +> = React.forwardRef(({ children, space, valuePropName, ...rest }, ref) => { + useImperativeHandle(ref, () => ({})); + return ( +
+ {children} +
+ ); +}); -const ProFormFieldSet = createField( - BaseProFormFieldSet, -) as typeof BaseProFormFieldSet; +const ProFormFieldSet = + createField>(BaseProFormFieldSet); -export default ProFormFieldSet; +export default ProFormFieldSet as typeof BaseProFormFieldSet; diff --git a/packages/form/src/typing.ts b/packages/form/src/typing.ts index 9f6d016d36bb..d454d8c52998 100644 --- a/packages/form/src/typing.ts +++ b/packages/form/src/typing.ts @@ -160,7 +160,7 @@ export type ProFormFieldItemProps, K = any> = { */ footerRender?: LightFilterFooterRender; - children?: React.ReactNode; + children?: any; } & Omit & Pick & ExtendsProps; diff --git a/tests/form/__snapshots__/demo.test.ts.snap b/tests/form/__snapshots__/demo.test.ts.snap index b89069e935f1..4cac917b0082 100644 --- a/tests/form/__snapshots__/demo.test.ts.snap +++ b/tests/form/__snapshots__/demo.test.ts.snap @@ -5863,6 +5863,62 @@ exports[`form demos > 📸 renders ./packages/form/src/components/FieldSet/demos +
+
+
+ +
+
+
+
+
+
+ 1 +
+
+ 2 +
+
+ 5 +
+
+ 5 +
+
+
+
+
+
+