需求背景

最近一直在将原vue2项目升级到vue3项目,原项目中有一个功能是修改表单,原来使用的组件是form-generator,但该组件在vue3项目中不兼容,最后选择了使用form-create-designer组件。刚开始在网上搜了很多案例,都不是很明白,没弄懂 <fc-designer ref="designer"/>和  <form-create/>有什么区别,后面又去仔细看了看官方文档,总算是会用了。

还是解释一下,我对于<fc-designer ref="designer"/>和  <form-create/>的理解:

<fc-designer ref="designer"/>属于表单设计器组件,用于设计和配置表单的外观、字段和校验规则等信息,我们可以通过可视化操作来创建和定制表单

<form-create/>则属于表单渲染器组件,用于根据表单配置信息动态生成具体的表单界面,我们在fc-designer上设计好表单后,后续可能需要在其他页面使用到我们需要的表单,此时就可以直接使用<form-create/>这个组件来展示

form-create-designer使用


<template>
<fc-designer ref="designer" >
    <template #handle>
      <el-button type="success" size="small" @click="saveForm" round plain><el-icon class="mr5"><Check /></el-icon>保存</el-button>
    </template>
</fc-designer>
</template>
  
<script>
import '@/styles/common.scss'
import { ElMessage  } from 'element-plus'
import {getForm,updateForm} from '@/api/flowable'
let rule= [
  {
    "type": "select",
    "field": "datasource",
    "title": "数据源",
    "info": "",
    "effect": {
      "fetch": ""
    },
    "options": [
      {
        "value": "1",
        "label": "选项1"
      },
      {
        "value": "2",
        "label": "选项2"
      }
    ],
    "_fc_drag_tag": "select",
    "hidden": false,
    "display": true,
    "$required": ""
  },
  {
    "type": "input",
    "field": "sqlText",
    "title": "SQL脚本",
    "info": "",
    "props": {
      "type": "textarea",
      "rows": 8
    },
    "_fc_drag_tag": "input",
    "hidden": false,
    "display": true,
    "$required": ""
  },
  {
    "type": "input",
    "field": "sqlDesc",
    "title": "脚本描述",
    "info": "",
    "props": {
      "type": "textarea",
      "rows": 5
    },
    "_fc_drag_tag": "input",
    "hidden": false,
    "display": true,
    "$required": ""
  }
]
let option={
  "form": {
    "labelPosition": "right",
    "size": "default",
    "labelWidth": "125px",
    "hideRequiredAsterisk": false,
    "showMessage": true,
    "inlineMessage": false
  },
  "submitBtn": false,
  "resetBtn": false
}
export default {
    name: 'app',
    data() {
        return {
            formKey: undefined,
            formData: {
                formKey: undefined,
                formName: '',
                formJson: ''
            }
        };
    },
    created(){
        if (this.$route.query && this.$route.query.formKey) {
            this.formKey = this.$route.query.formKey
            this.formData.formKey=this.$route.query.formKey
            }
            this.getFormData()
           
            // 静态数据测试
           /* const FcDesignerRule = JSON.stringify(rule)
            const FcDesignerOptions = JSON.stringify(option)
            this.$nextTick(()=>{
            console.log(this.$refs.designer);
            // 通过规则在FcDesigner中回显表单
            this.$refs.designer.setRule(FcDesignerRule);
            this.$refs.designer.setOption(FcDesignerOptions); 
            })*/
    },
    methods:{
        // 获取接口表单数据
        getFormData() {
            if (!this.formKey) {
                ElMessage.error('formKey is null')
                return
            }
            getForm({ id: this.formKey }).then(({ data }) => {
                this.formData = data
                const json = this.formData?.formJson || null
                 setTimeout(() => this.$refs.designer.setRule(json), 100)
            })
        },
        // 获取FcDesigner中表单的生成规则
        saveForm(){
            //FcDesigner 生成的`JSON`
            const FcDesignerRule = this.$refs.designer.getRule();
            //FcDesigner 生成的`options`
            const FcDesignerOptions = this.$refs.designer.getOption();
            console.log(FcDesignerRule,FcDesignerOptions);
            this.formData.formJson = JSON.stringify(FcDesignerRule)
            updateForm(this.formData).then(({ msg, data }) => {
                ElMessage.success(msg)
            })
        }
  }
};

</script>

简单介绍form-create-designer

具体内容可参考官网https://designer.form-create.com/

因为我主要的需求只有两点,第一是自己设计表单,第二是根据表单规则在FcDesigner中回显表单

主要用到了两个api

getRule 获取设计器表单区域生成表单的生成规则
setRule 根据表单规则在FcDesigner中回显表单

如何使用在上面代码中已经有展示,官网上也有举例

form-create使用


<template>
    <div class="container">
     测试 <el-icon><CaretBottom /></el-icon>
     <form-create
      v-model="fapi"
      :rule="rule"
      :option="option"
      @submit="onSubmit"
  ></form-create>
</div>
</template>
<style>
</style>
  
<script>
import '@/styles/common.scss'
import formCreate from "@form-create/element-ui";

const FcDesignerRule = '[{"type":"input","field":"cuk5qqdw3umc","title":"输入框","info":"","_fc_drag_tag":"input","hidden":false,"display":true}]';
const FcDesignerOptions = '{"form":{"labelPosition":"right","size":"small","labelWidth":"125px","hideRequiredAsterisk":false,"showMessage":true,"inlineMessage":false}}';

export default {
  name:'test1-1',
  data(){
    return {
      fapi: null,
      rule: formCreate.parseJson(FcDesignerRule),
      option: formCreate.parseJson(FcDesignerOptions)
    }
  },
  methods:{
    onSubmit (formData) {
      //todo 提交表单
      console.log(formData);
    }
  }
}
</script>


form-create中几个参数说明

详细介绍可参考官网https://form-create.com/

fapi 表单实例对象,需要调用方法都可以通过该实例对象来调用,比如表单重置,可直接定义一个重置方法,然后通过this.fapi.resetFields()来实现

rule 表单生成规则 就是你表单的全貌

option 组件参数配置 表单是由多个组件组成的,比如输入框,按钮,多选框等,这些组件label的位置,组件字体的大小,以及是否需要显示提交重置按钮等等配置

formdata 表单数据 根据规则展示出表单后,表单中填写的数据就是formdata,formdata是一个对象,其中的键是对应rule中的field属性,field的值可以在表单设计器中修改

上面代码中的rule和option都是随便写的一个数据,用来测试的,到时候需要用的时候直接从接口获取数据处理就可以

表单设计器的页面

渲染表单的页面

Logo

前往低代码交流专区

更多推荐