根据需求的不同,三种使用方式可以做到组件状态完全交给Form接管,会使组件看起来更加完整,可以减少冗余代码,其他人看你这部分代码的时候,不需要知道Form内部做了什么,只需要关心组件状态的变化,增加代码的可读性。
1、noStyle shouldUpdate
当组件中内部元素需要进行联动去控制状态,例如:通过开关去控制组件内其他元素的显示隐藏;这时候Form无法做到完全接管组件状态,必须通过Switch的onChange事件去控制,导致组件状态过多,代码冗余,组件完整度不够,这时候就可以使用noStyle、shouldUpdate的方式。
2、Form List
Form去管理一个数组的时候使用,例如:动态添加删除表单;
3、Item children

import React, { FC, useEffect } from 'react';import { Form, Switch, Input, Button } from 'antd';import { MinusCircleOutlined } from '@ant-design/icons'import FormItemChildrenTest from './components/formItemChildrenTest';const { Item, List, useForm } = Form;/** Form管理测试组件 */const Test: FC = props => {const [form] = useForm();useEffect(() => {form.setFields([{ name: 'children', value: { a: '1', b: '2' } }])}, []);return (<Form form={form} onValuesChange={values => console.log(values)}>{/* noStyle shouldUpdate用法 */}<Item noStyle shouldUpdate={(prev, current) => prev.switch !== current.switch}>{({ getFieldValue }) => {const testSwitch = getFieldValue('switch');return <><Item name='switch' valuePropName='checked'><Switch /></Item>{testSwitch && <Item name='content'><div>noStyle shouldUpdate 用法</div></Item>}</>}}</Item>{/* children的用法 */}<Item name='children'><FormItemChildrenTest /></Item></Form>);};export default Test;
import React, { FC } from 'react';import { Form, Switch } from 'antd';import $ from './style.less';interface Props {/** Item为children添加的 */value?: string;/** Item为children添加的 */onChange?: (value: any) => void;}/** FormItem子组件测试*/const ItemChildrenTest: FC<Props> = props => {/*** @desc value初始值可以直接通过父组件form.setFieldsValue()设置* ItemChildrenTest的状态可以通过Item为children添加的onChange事件传递给父组件* 在父组件中通过onValuesChange直接获取到*/const { value, onChange } = props;return (<div onClick={() => typeof onChange === 'function' && onChange('可以直接在父组件中拿到')}>测试</div>);};export default ItemChildrenTest;
import React, { FC, useEffect } from 'react';import { Form, Switch, Input, Button } from 'antd';import { MinusCircleOutlined } from '@ant-design/icons'import FormItemChildrenTest from './components/formItemChildrenTest';const { Item, List, useForm } = Form;/** Form管理测试组件 */const Test: FC = props => {const [form] = useForm();useEffect(() => {form.setFields([{ name: 'children', value: { a: '1', b: '2' } }])}, []);return (<Form form={form} onValuesChange={values => console.log(values)}><List name='list'>{(fields, { add, remove }, { errors }) => (<>{fields.map((field, index) => {// console.log(fields)// console.log(add)// console.log(field)return <Itemlabel={`添加的第${index + 1}行`}required={false}key={field.key}><Item{...field}validateTrigger={['onChange', 'onBlur']}noStyle><Input /></Item>{fields.length > 1? <MinusCircleOutlined onClick={() => remove(field.name)} />: null}</Item>})}<Item><Button onClick={() => add()}>添加一行</Button><Button onClick={() => add('defaultValue', 0)}>在顶部添加一行</Button><Form.ErrorList errors={errors} /></Item></>)}</List></Form>);};export default Test;
