当前位置: 首页 > news >正文

formily实践经验和踩坑

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,这里不做过多赘述
在这里插入图片描述

相关文章:

  • 论文题目<mark>
  • Linux基础操作 常用命令 Centos
  • async 与 await
  • 深入理解【正则化的L1-lasso回归和L2-岭回归】以及相关代码复现
  • Linux内核设计与实现第四章学习笔记
  • <c++> 四、模板初阶
  • 两种编程思维
  • 图书馆管理系统(Java编写,思路及源代码)
  • 算法练习:动态规划(最长公共子串问题)
  • 【lm401】解决malloc动态申请内存时内存不足的问题
  • 【Python】ChineseCalendar包简介
  • 前端八股——JS高级学习
  • 【CSS系列】第二章 · CSS选择器
  • vue尚品汇商城项目-day04【27.分页器静态组件(难点)】
  • JavaScript技术干货第二弹,有需自取!
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • Asm.js的简单介绍
  • C++类的相互关联
  • golang 发送GET和POST示例
  • gops —— Go 程序诊断分析工具
  • JavaScript服务器推送技术之 WebSocket
  • java概述
  • js ES6 求数组的交集,并集,还有差集
  • JSDuck 与 AngularJS 融合技巧
  • select2 取值 遍历 设置默认值
  • TypeScript实现数据结构(一)栈,队列,链表
  • Vue2 SSR 的优化之旅
  • vue学习系列(二)vue-cli
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 测试如何在敏捷团队中工作?
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 创建一个Struts2项目maven 方式
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 分享几个不错的工具
  • 构建二叉树进行数值数组的去重及优化
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 如何在GitHub上创建个人博客
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 听说你叫Java(二)–Servlet请求
  • 一个项目push到多个远程Git仓库
  • Mac 上flink的安装与启动
  • 如何在招聘中考核.NET架构师
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • # .NET Framework中使用命名管道进行进程间通信
  • #FPGA(基础知识)
  • ${factoryList }后面有空格不影响
  • $NOIp2018$劝退记
  • ()、[]、{}、(())、[[]]命令替换
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (三十)Flask之wtforms库【剖析源码上篇】
  • (四)linux文件内容查看
  • (转)linux下的时间函数使用