Form 表单
封装了表单组件,能快速完成表单的布局、表单验证、复杂对象表单
表单包含了一系列的组件或者方法,包括下面这些
- Form 表单
- FormItem 表单项
- FormSubmit 表单提交
- FormReset 表单重置
- FormObject 对象表单
- FormArray 数组表单
- FormArrayAction 数组表单操作管理
- useFormContext 获取表单上下文
- useFormItemProxy 给表单代理值和事件
示例
import { Header, ScrollView, TopView, Form, Card, Input, PickerDate, PickerSelect, Textarea, Row, DividerGroup, FormItem, FormSubmit, FormReset, confirm, route } from '@/duxuiExample'
// 默认值支持多种形式 会直接定义值 函数返回值 异步函数返回值
const defaultValues = async () => {
return {
text: '这是默认值'
}
}
const rules = {
text: [
{
required: true,
type: 'string',
message: '输入框为必填字段'
}
],
desc: [
{
required: true,
type: 'string',
message: '介绍为必填字段'
}
]
}
export default function FormExample() {
const submit = async data => {
console.log(data)
await confirm({
title: '提交成功',
content: '表单缓存将被清除,再次进入表单需要重新填写'
})
route.back()
return true
}
return <TopView>
<Header title='Form' />
<Form cache='duxui-form' onSubmit={submit} defaultValues={defaultValues}>
<ScrollView>
<Card margin verticalPadding={false}>
<DividerGroup>
<FormItem label='输入框' name='text' rules={rules.text}>
<Input placeholder='请输入' align='right' grow />
</FormItem>
<FormItem label='介绍的输入' name='desc' desc='输入框介绍,这是输入框介绍' rules={rules.desc}>
<Input placeholder='请输入' />
</FormItem>
<FormItem label='日期' name='date'>
<PickerDate title='日期' placeholder='请选择日期' grow />
</FormItem>
<FormItem label='选择' name='sex'>
<PickerSelect title='选择' placeholder='请选择性别' range={['男', '女']} grow />
</FormItem>
<FormItem label='介绍' name='info' direction='vertical' >
<Textarea placeholder='请输入介绍' maxlength={100} />
</FormItem>
</DividerGroup>
</Card>
<Row className='p-3 gap-3'>
<FormReset className='flex-grow'>重置</FormReset>
<FormSubmit className='flex-grow' type='primary'>提交</FormSubmit>
</Row>
</ScrollView>
</Form>
</TopView>
}
Props
defaultValues
表单默认值,也可以是一个异步函数,其返回值作为默认值,用在一些需要远程加载数据的场景
类型 | 必填 | 默认值 |
---|---|---|
object | () => Promise<{}> | Promise<{}> | 否 |
onChange
表单改变事件
类型 | 必填 | 默 认值 |
---|---|---|
(values: object) => void | 否 |
onSubmit
表单提交事件,通常是由 FormSubmit
提交的
类型 | 必填 | 默认值 |
---|---|---|
(values: object) => void | boolean | Promise<boolean> | 否 |
cache
是否开启表单填写缓存
填写一个用于保存缓存的字段名,即表示开启
开启后,会将当前填写的数据进行缓存,如果未提交保存,下次打开使用这个缓存加载
在 onSubmit 事件返回true的时候将会把这个缓存清除
如果 onSubmit 提交事件之后,表单继续被编辑,表单还会被保存,请处理这个逻辑
如果读取到 cache,优先级高于 defaultValues
类型 | 必填 | 默认值 |
---|---|---|
string | 否 |
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] = 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(checkAll)
验证表单
checkAll 是否检查全部表单项目 默认 true,传入false可以在检查到验证未通过的时候终止检查
FormItem Props
表单项,需要放在Form内,其子元素需要是一个表单,且只能有一个子元素
继承自ColumnProps
name
字段名称
类型 | 必填 | 默认值 |
---|---|---|
string | number | 否 |
wholeForm
控制是否管理整个表单的值
开启后,子表单的 value 将是整个表单的值,onChange 相当于 setValues
此参数和 name
不能同时使用
类型 | 必填 | 默认值 |
---|---|---|
boolean | 否 | false |
label
标题
如果未传入属性则只会显示子元素
如果传入一个空字符串怎不会显示label 但是会显示 错误提示 desc 项目内边距
类型 | 必填 | 默认值 |
---|---|---|
string | 否 |
labelProps
标题属性
类型 | 必填 | 默认值 |
---|---|---|
TextProps | 否 |
form
如果子元素是多个组件,或者嵌套,用于指定表单项目
会在所有子元素中递归查找到这个类型的元素作为表单项