Form 表单
封装了表单组件,能快速完成表单的布局、表单验证、复杂对象表单
表单包含了一系列的组件或者方法,包括下面这些
- Form 表单
- Form.Item 表单项
- Form.Submit 表单提交
- Form.Reset 表单重置
- Form.Object 对象表单
- Form.Array 数组表单
- Form.ArrayAction 数组表单操作管理
- Form.useFormContext 获取表单上下文
- Form.useFormItemProxy 给表单代理值和事件
示例
import {
Header, ScrollView, TopView, Form,
Card, Divider, Input, PickerDate,
PickerSelect, Textarea, Row
} from '@/duxui'
const defaultValues = {
}
const rules = {
name: [
{
required: true,
type: 'string',
message: '输入框为必填字段'
}
],
tel: [
{
required: true,
type: 'string',
message: '介绍为必填字段'
}
]
}
export default function FormExample() {
return <TopView>
<Header title='Form' />
<Form onSubmit={console.log} defaultValues={defaultValues}>
<ScrollView>
<Card margin verticalPadding={false}>
<Divider.Group>
<Form.Item label='输入框' field='name' rules={rules.name}>
<Input placeholder='请输入' align='right' grow />
</Form.Item>
<Form.Item label='介绍的输入' field='tel' desc='输入框介绍,这是输入框介绍' rules={rules.tel}>
<Input placeholder='请输入' />
</Form.Item>
<Form.Item label='日期' field='date'>
<PickerDate title='日期' placeholder='请选择日期' grow />
</Form.Item>
<Form.Item label='选择' field='sex'>
<PickerSelect title='选择' placeholder='请选择性别' range={['男', '女']} grow />
</Form.Item>
<Form.Item label='介绍' field='desc' direction='vertical' >
<Textarea placeholder='请输入介绍' maxlength={100} />
</Form.Item>
</Divider.Group>
</Card>
<Row className='p-3 gap-3'>
<Form.Reset className='flex-grow'>重置</Form.Reset>
<Form.Submit className='flex-grow' type='primary'>提交</Form.Submit>
</Row>
</ScrollView>
</Form>
</TopView>
}
Props
defaultValues
表单默认值,也可以是一个异步函数,其返回值作为默认值,用在一些需要远程加载数据的场景
类型 | 必填 | 默认值 |
---|---|---|
object | () => Promise<{}> | 否 |
onChange
表单改变事件
类型 | 必填 | 默认值 |
---|---|---|
(values: object) => void | 否 |
onSubmit
表单提交事件,通常是由 Form.Submit
提交的
类型 | 必填 | 默认值 |
---|---|---|
(values: object) => void | 否 |
disabled
是否禁用表单
类型 | 必填 | 默认值 |
---|---|---|
boolean | 否 | false |
vertical
表单项是否垂直布局
类型 | 必填 | 默认值 |
---|---|---|
boolean | 否 | false |
labelProps
全局传递给标签的属性
类型 | 必填 | 默认值 |
---|---|---|
TextProps | 否 |
containerProps
全局传递给项目容器的属性
类型 | 必填 | 默认值 |
---|---|---|
SpaceProps | 否 |
itemPadding
是否使用项目的内边距,关闭内边距后需要自己控制项目边距
类型 | 必填 | 默认值 |
---|---|---|
boolean | 否 | true |
children
传入子元素或者一个函数组件,从这个组件中可以获取到当前表单的多个属性,对标单进行操作
类型 | 必填 | 默认值 |
---|---|---|
ReactElement | Component | 否 |
方法
useFormContext()
获取当前表单上下文,需要在Form范围内使用,单独使用无效
其返回值 和Form实例属性和实例方法一样,用于获取表单属性和操作表单
useFormItemProxy(props)
并非用在表单中的,而是用在对其他表单的封装
例如在对Input的封装中这样用,封装后组件的值既可以外部控制,也可以内部控制
export const Input = ({
grow,
shrink,
self,
align,
className,
style,
value,
onChange,
...props
}) => {
const [val, setVal] = Form.useFormItemProxy({ value, onChange })
return <TaroInput
onInput={setVal}
className={classNames(
'DuxInput',
grow && 'flex-grow',
shrink && 'flex-shrink',
self && 'self-' + self,
align && 'text-' + align,
className
)}
style={style}
placeholderTextColor={duxappTheme.textColor3}
placeholderStyle={`color: ${duxappTheme.textColor3}`}
{...props}
value={val}
/>
}
props参数
名称 | 类型 | 说明 |
---|---|---|
value | string | 传入的value |
onChange | (val: string | any) => void | 传入的value |
defaultValue | string | any | 默认值 |
给表单代理值和事件
实例属性
values
当前表单值
defaultValues
经过计算之后的默认值
data
表单结果值 将会在点击提交按钮时改变
实例方法
setValue(name, value)
设置表单值
名称 | 类型 | 说明 |
---|---|---|
name | string | 字段名 |
value | any | 字段值 |
setValues(values)
批量设置表单值,values将会和当前表单值进行合并
名称 | 类型 | 说明 |
---|---|---|
values | object | 多个要设置的值 |
submit()
提交表单
reset()
重置表单
validate()
验证表单
Form.Item Props
表单项,需要放在Form内,其子元素需要是一个表单,且只能有一个子元素
继承自ColumnProps