formily实践经验和踩坑

本文介绍了使用阿里Formily组件库在Vue项目中的实践经验,特别是针对Vue用户的难点。讨论了createForm的hook执行顺序,如onFieldInit、onFieldReact和onFieldChange等,以及如何在这些hook中实现字段联动逻辑。文章还提到了在schema模式下使用外部变量的方法,展示了如何根据字段变化动态设置其他字段的值。此外,作者还分享了自定义组件的封装示例,提供了render和template两种写法。

1 前言

最近深度使用了阿里的formily组件,功能很强大,但是对新手还是有些不友好,特别是vue用户,我使用的formily/element, 详细的可以在对应的网站上查看, formily/element链接 在此,记录一些使用经验和踩过的坑, 下面用的例子都放在github上, 见代码实例

2.createForm和effect

详细的见链接内核文档

2.1 createForm相关hook

  • 初始化的执行顺序是 onFieldInit -> onFieldReact -> onFieldChange
  • 值改变的执行顺序是 onFieldInputValueChange -> onFieldValueChange -> onFieldChange
    在这些hook里面可以做了一些联动逻辑, 例如当field_string字段改变的时候,去修改字段field_number的值,
	import {
	    createForm, onFieldValueChange, onFieldInit, onFieldReact, onFieldChange
	    , onFieldInitialValueChange, onFieldInputValueChange
	} from "@formily/core";
	
   dynamicCreateForm() {
       this.form = createForm(
           {
               values: {
                   field_string: "1234",
                   field_number: 1234,
               },
               initialValues: {
                   field_string: "123",
                   field_number: 123
               },
               effects(form) {
                   // field相关hook,在field初始化时调用
                   // 执行顺序1
                   onFieldInit('field_string', (field) => {
                       console.log("onFieldInit: ", field)
                   })
                   // 执行顺序2
                   onFieldReact('field_string', (field) => {
                       console.log("onFieldReact: ", field)
                   })
                   // 执行顺序3
                   onFieldChange('field_string', (field) => {
                       console.log("onFieldChange: ", field)
                   })

                   // 用户输入(手动setValue或者setValues)改变时hook
                   // 执行顺序1
                 onFieldInputValueChange('field_string', (field) => {
                      console.log("onFieldInputValueChange: ", field)

                      // 当field_string字段的值为999时,将field_number的值也改成999
                      form.setFieldState('field_number', (state) => {
                          if (field.value == "999") {
                              state.setValue(999)
                          } 
                      })
                  })

                   // 执行顺序2
                   onFieldValueChange('field_string', (field) => {
                       console.log("onFieldValueChange: ", field)
                   })

                   // 手动执行setInitValue时触发
                   onFieldInitialValueChange('field_string', (field) => {
                       console.log("onFieldInitialValueChange: ", field)
                   })
               },
           }
       )
   },

2.2 schema模式

  • 在schema里使用外部变量,比如设置Select组件的选项值

需要在SchemaField中传入变量,这样schema中使用才不会报错

<template>
    <Form :form="form">
        <SchemaField :schema="schema"
            :scope="{options1, eventEnums, getArgsOpts, loadArgsData }" />
        <Submit @submit="onSubmit">提交</Submit>
    </Form>
</template>
   field_select: {
       type: "string",
       title: "输入框",
       enum: "{{options1}}",
       "x-decorator": "FormItem",
       "x-component": "Select",
       'x-decorator-props': {
           labelWidth: 100
       },
   },
  • 根据选项自动设置另外一个字段的值和选项
    比如下面这个可以根据事件列表动态设置对应事件的参数和选项, 主要步骤是

监听事件字段的值变化 -> 设置事件参数数组的值 ->参数变动的时候执行x-reactions, 设置option和标题

   input: {
       type: 'number',
       'x-decorator': 'FormItem',
       'x-component': 'Select',
       'x-decorator-props': {
           labelWidth: 100,
           gridSpan: 1,
       },
       'x-reactions': ['{{getArgsOpts(loadArgsData)}}'],
       'x-component-props': {
           'allow-create': true,
           filterable: true,
       },
   },

在这里插入图片描述
其他的联动规则,见官方文档字段联动

2.3 自定义组件

官方对自定义组件的描述不是特别多, 主要是对新手来说不是很友好,在github的disscus和issue中提及的也比较少, 这里给出我自己封装的自定义组件示例
如下图所示, 点击右边的按钮会把左边的路径和值emit出来
在这里插入图片描述
这里给两种写法, 一种是render写法,一种是template写法(需要配合index.js单独导出), 注意,这两种写法都需要使用setup写法,这样才能让formily注入信息,从而获取到form信息和field信息,详细代码见github,这里不做过多赘述
在这里插入图片描述

<think> 嗯,用户想要了解Formily的详细介绍、使用方法应用场景。从引用内容来看,Formily是一个跨框架的表单解决方案,支持React、Vue等主流框架,特别擅长处理复杂表单场景。 用户可能是前端开发者,正在寻找高效的表单解决方案。从引用[3]看,用户似乎已经尝试过学习Formily但觉得学习成本较高,需要更系统的指导。用户特别关注三个方面:框架介绍、具体使用方法适用场景。 关于详细介绍,需要突出Formily的核心优势: - 跨框架特性(React/Vue等) - 数据与UI分离架构 - 响应式设计 - 高性能表单渲染 引用[1]提到其核心概念包括字段管理、生命周期扩展机制,这些是区别于普通表单库的关键。 使用方法部分要结构化呈现: 1. 安装指南要区分React/Vue版本 2. 创建表单的核心步骤(字段定义、校验规则、布局) 3. 推荐从JSX SchemaForm入门(如引用[3]建议) 需要强调effects系统Rxjs集成这个独特功能,虽然学习曲线陡峭但能解决复杂异步逻辑。 应用场景要突出差异化价值: - 动态表单(如引用[2]提到的企业级应用) - 多步骤流程表单 - 字段联动的场景(如省市区三级联动) 特别要说明为何普通表单库在这些场景不足,而Formily能提升300%效率(引用[2]数据) 考虑到用户可能遇到的障碍: - 学习成本问题(准备补充学习资源推荐) - Schema语法转换(JSX/JSON切换技巧) - 性能优化实践 最后生成的问题要引导用户深入: 1. 学习路径问题针对引用[3]的学习难点 2. 性能优化呼应引用[2]的效率宣称 3. 架构设计问题帮助理解核心机制 </think>以下是关于Formily的详细介绍、核心使用方法典型应用场景的全面解析: --- ### **Formily简介** Formily 是由阿里巴巴开源的**跨终端动态表单解决方案**,支持 React/React Native/Vue 2/Vue 3 等框架。其核心价值在于: 1. **高性能**:通过响应式数据流精确渲染优化,轻松处理千级字段的表单[^1] 2. **解耦设计**:逻辑(Effects)、数据(Model)、UI(Components)三层分离,维护性极强[^3] 3. **生态丰富**:提供 Formily Ant Design/Vant 等组件库,开箱即用[^2] --- ### **核心使用方法** #### 1. **基础表单构建** ```jsx import { createForm } from '@formily/core' import { FormProvider, Field } from '@formily/react' // 创建表单实例 const form = createForm() // 渲染表单 <FormProvider form={form}> <Field name="name" title="用户名" component="Input" /> <Field name="age" title="年龄" component="NumberPicker" /> </FormProvider> ``` #### 2. **复杂场景实现** - **动态联动**(使用 Effects 响应式系统): ```js import { onFieldValueChange } from '@formily/core' form.addEffects('effect1', () => { onFieldValueChange('showExtra', (field) => { form.setFieldState('extraInfo', state => state.visible = field.value) }) }) ``` - **异步校验**: ```js const validator = (value) => fetch('/check', { value }).then(res => res.valid? '' : '校验失败') ``` #### 3. **JSON Schema 驱动**(推荐后端集成) ```json { "type": "object", "properties": { "email": { "type": "string", "title": "邮箱", "x-component": "Input", "required": true, "x-validator": "email" } } } ``` --- ### **典型应用场景** 1. **企业级后台表单** - 动态渲染数百字段的表单 - 实现字段间复杂联动(如选择国家后加载省份)[^2] 2. **低代码平台** - 通过 JSON Schema 动态生成表单结构 - 可视化配置校验规则与布局[^1] 3. **跨端应用** - 同一套逻辑兼容 Web/React Native 应用 - 统一管理多平台表单行为[^1] 4. **流程审批系统** - 根据审批步骤动态变更字段权限 - 实时保存草稿数据 --- ### **学习路径建议** 1. **基础入门**:从 JSX SchemaForm 开始(平衡灵活性与复杂度)[^3] 2. **核心概念**: - **Field**:字段管理(数据、校验、状态) - **Effects**:事件流处理(RxJS 驱动) - **Schema**:JSON 描述表单结构 3. **进阶**: - 掌握 `createEffectHook` 自定义事件[^3] - 学习扩展自定义组件 > 提示:Formily Antd 提供 50+ 企业级组件,可减少70%开发量[^2] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值