前端开发者对表单场景应该都不陌生 - 从简单的登录注册到复杂的B端业务系统,表单几乎无处不在。但真正做过企业级复杂表单的同行都清楚,随着业务逻辑的叠加,表单代码会迅速演变成难以维护的"意大利面条":
传统解决方案要么需要手动编写大量胶水代码(如在React中管理各种useState),要么采用重量级表单方案导致包体积膨胀。这正是Formily试图解决的问题 - 它通过声明式API和响应式编程模型,将复杂表单的开发体验简化到极致。
校验逻辑的复杂度往往与业务复杂度成正比。新版本重构了校验引擎,主要改进包括:
jsx复制validator: (value) => {
return fetch('/checkUsername', {
method: 'POST',
body: JSON.stringify({ username: value })
}).then(res => {
if (!res.available) {
throw new Error('用户名已存在')
}
})
}
jsx复制<Field
name="password"
validator={(value, { form }) => {
if (value !== form.values.confirmPassword) {
throw new Error('两次密码输入不一致')
}
}}
/>
jsx复制<FormProvider validateMessages={{
required: '该字段为必填项',
// 自定义校验模板
custom: '${label}校验失败: ${message}'
}}>
针对大型表单的渲染性能问题,2.3.0版本实现了:
实测数据显示,在100+字段的表单中,交互响应速度提升约40%。
typescript复制interface FormValues {
user: {
name: string
age: number
}
address?: string[]
}
const form = createForm<FormValues>()
让我们通过一个真实的电商后台订单表单案例,演示Formily的威力:
jsx复制<Form layout="vertical">
<Card title="基本信息">
<Field name="orderType" component="Select" />
<Field name="customer" component="CustomerPicker" />
</Card>
<ArrayField name="products" title="商品清单">
{(index) => (
<div key={index}>
<Field name="sku" component="SkuSelector" />
<Field name="quantity" component="NumberPicker" />
</div>
)}
</ArrayField>
</Form>
当订单类型变化时自动更新运费计算:
jsx复制<Field
name="shippingFee"
reactions={(field) => {
const orderType = field.query('orderType').value()
field.value = calculateFee(orderType)
}}
/>
根据用户等级应用不同的优惠券校验:
jsx复制<Field
name="coupon"
validator={(value) => {
const userLevel = form.values.user?.level
if (userLevel === 'VIP' && !value) {
throw new Error('VIP用户必须使用优惠券')
}
}}
/>
jsx复制import { batch } from '@formily/core'
batch(() => {
form.setValues({ ... })
form.validate()
})
jsx复制<SchemaField>
<SchemaFragment name="baseInfo" schema={baseSchema} />
{showAdvance && <SchemaFragment name="advance" schema={advanceSchema} />}
</SchemaField>
editable属性validator返回的是Promise(异步校验)validateMessages配置field.query而不是直接访问form.valuescreateForm<T>()声明类型Formily的强大之处还在于其丰富的生态系统:
bash复制# Ant Design
npm install @formily/antd
# Element Plus
npm install @formily/element
# Vant
npm install @formily/vant
配合Formily Designer可实现:
通过@formily/next支持:
从2.0到2.3版本,Formily已经逐步成长为前端表单领域的事实标准。特别是在中后台复杂业务场景下,其声明式API和响应式编程模型能显著降低开发复杂度。新版本在性能、类型支持和开发者体验方面的改进,使得它成为处理动态表单、多步骤流程等场景的首选方案。
在实际项目中落地时,建议团队建立统一的表单规范:
这样的架构既能享受Formily的便利性,又能保证大型项目的可维护性。