2025 Formily 完全学习指南:从新手到专家的进阶之路
你还在为复杂表单开发头疼吗?数据联动繁琐、校验规则复杂、UI组件适配困难?本文将带你系统掌握 Formily——这款跨设备高性能表单解决方案,从基础安装到高级特性,从场景实战到源码解析,让你7天内从入门到精通,轻松应对各类表单需求。
什么是 Formily?
Formily 是一个专注于表单领域的解决方案,支持 React/React Native/Vue 2/Vue 3 等多框架,提供了普通表单、动态表单(JSON Schema)和表单构建器等功能。其核心优势在于高性能的数据处理和跨设备兼容性,能够帮助开发者快速构建复杂表单应用。
官方文档:docs/guide/index.md
核心源码:packages/core/src/
项目概述:README.md
入门篇:快速上手 Formily
环境准备与安装
Formily 的使用需要安装核心库和相应的 UI 桥接库。以下是针对不同框架的安装命令:
核心库安装
npm install --save @formily/core
React 用户
npm install --save @formily/react
Vue 用户
npm install --save @formily/vue
此外,Formily 还提供了与主流 UI 组件库的集成,如 Ant Design 和 Element UI:
Ant Design 集成
npm install --save antd moment @formily/antd
Element UI 集成
npm install --save element-ui @formily/element
详细安装指南:docs/guide/quick-start.md
React 适配器源码:packages/react/
Vue 适配器源码:packages/vue/
第一个 Formily 表单
以下是一个简单的 Formily 表单示例,使用 React 和 Ant Design:
import React from 'react'
import { createForm } from '@formily/core'
import { FormProvider, Field } from '@formily/react'
import { FormItem, Input, FormButtonGroup, Submit } from '@formily/antd'
const form = createForm()
export default () => (
<FormProvider form={form}>
<Field
name="username"
title="用户名"
required
initialValue="Formily"
decorator={[FormItem]}
component={[Input]}
/>
<FormButtonGroup>
<Submit onSubmit={values => console.log(values)}>提交</Submit>
</FormButtonGroup>
</FormProvider>
)
这个示例展示了 Formily 的核心概念:
createForm创建表单实例FormProvider提供表单上下文Field定义表单字段FormItem和Input作为装饰器和组件
完整示例代码:docs/guide/quick-start.md
Form 组件 API:packages/core/src/models/form.ts
进阶篇:核心概念与高级特性
核心概念解析
Formily 基于 MVVM 设计模式,将表单分为数据层、逻辑层和视图层:
- 数据层:由
@formily/core提供,负责数据管理、校验和联动 - 逻辑层:通过响应式系统实现数据驱动视图
- 视图层:由 UI 适配器(如
@formily/react)提供组件
核心概念文档:docs/guide/learn-formily.md
响应式系统源码:packages/reactive/src/
高级特性应用
1. 动态表单与 JSON Schema
Formily 支持通过 JSON Schema 定义动态表单,特别适合需要后端配置的场景:
import { createForm } from '@formily/core'
import { FormProvider, SchemaField } from '@formily/react'
import { FormItem, Input, NumberPicker } from '@formily/antd'
const form = createForm()
const schema = {
type: 'object',
properties: {
name: {
type: 'string',
title: '姓名',
required: true
},
age: {
type: 'number',
title: '年龄',
minimum: 0,
maximum: 120
}
}
}
export default () => (
<FormProvider form={form}>
<SchemaField schema={schema}>
<SchemaField.String
name="name"
x-decorator={[FormItem]}
x-component={[Input]}
/>
<SchemaField.Number
name="age"
x-decorator={[FormItem]}
x-component={[NumberPicker]}
/>
</SchemaField>
</FormProvider>
)
JSON Schema 支持:packages/json-schema/src/
动态表单示例:docs/guide/advanced/
2. 复杂联动与依赖
Formily 提供了强大的联动能力,支持字段间的复杂依赖关系:
// 省份和城市联动示例
<Field
name="province"
title="省份"
component={[Select, {
options: [/* 省份列表 */]
}]}
/>
<Field
name="city"
title="城市"
component={[Select]}
reactions={(field) => {
const province = field.query('province').value()
if (province) {
// 根据省份加载城市数据
field.loadRemoteOptions({ url: `/api/cities?province=${province}` })
}
}}
/>
联动功能文档:docs/guide/advanced/linkages.md
Reactions API:packages/core/src/effects/reactions.ts
实战篇:典型场景解决方案
登录注册表单
登录注册是最常见的表单场景,Formily 提供了完善的解决方案:
// 登录表单示例
<Field
name="username"
title="用户名"
required
component={[Input]}
validator={[
{
validator: (value) => value.length >= 6 || '用户名至少6位'
}
]}
/>
<Field
name="password"
title="密码"
required
component={[Password]}
/>
登录注册场景文档:docs/guide/scenes/login-register.md
验证码组件示例:docs/guide/scenes/VerifyCode.tsx
分步表单
对于复杂表单,可以拆分为多个步骤,提高用户体验:
import { FormStep } from '@formily/antd'
export default () => (
<FormStep>
<FormStep.Step title="基本信息">
{/* 第一步表单内容 */}
</FormStep.Step>
<FormStep.Step title="详细信息">
{/* 第二步表单内容 */}
</FormStep.Step>
</FormStep>
)
分步表单场景文档:docs/guide/scenes/step-form.md
FormStep 组件源码:packages/antd/src/form-step/
精通篇:源码解析与定制开发
Formily 架构解析
Formily 采用 monorepo 结构,主要包含以下包:
@formily/core:核心逻辑@formily/react/@formily/vue:框架适配@formily/antd/@formily/element:UI 组件集成@formily/reactive:响应式系统
项目架构文档:docs/guide/contribution.md
Monorepo 配置:lerna.json
自定义组件开发
开发自定义 Formily 组件需要实现适配层,以下是一个自定义输入组件示例:
import { connect, mapProps } from '@formily/react'
import { Input } from 'antd'
// 将 Ant Design Input 转换为 Formily 组件
export const MyInput = connect(
Input,
mapProps((props) => ({
value: props.value,
onChange: props.onChange,
placeholder: props.title
}))
)
自定义组件文档:docs/guide/advanced/custom.md
组件连接工具:packages/react/src/connect.ts
学习资源与社区
官方资源
- 完整文档:docs/guide/
- API 参考:packages/core/src/
- 示例项目:docs/guide/scenes/
开发工具
Formily 提供了 Chrome 开发者工具扩展,帮助调试表单:
开发工具源码:devtools/chrome-extension/
安装指南:devtools/chrome-extension/README.md
总结与展望
通过本文的学习,你已经掌握了 Formily 的核心概念、使用方法和高级特性。Formily 作为一款成熟的表单解决方案,正在不断发展,未来将支持更多场景和功能。
建议继续深入学习以下内容:
- 表单性能优化
- 跨端适配
- 大规模表单设计模式
贡献指南:docs/guide/contribution.md
升级日志:CHANGELOG.md
希望本文能帮助你在表单开发的道路上更进一步,如有任何问题,欢迎参与社区讨论!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



