在vue3中使用form-create-designer

需求背景

最近一直在将原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都是随便写的一个数据,用来测试的,到时候需要用的时候直接从接口获取数据处理就可以

表单设计器的页面

渲染表单的页面

Vue3 Form-Create-Designer是一个基于Vue3的表单设计器,支持自定义组件。如果你想要添加自定义组件,可以按照以下步骤进行操作: 1. 创建自定义组件 首先需要创建一个Vue3组件,可以通过Vue CLI等工具进行创建。在组件内部实现自己的功能和样式,并在最后通过export default导出该组件。 例如,我们创建了一个名为MyInput的组件: ```vue <template> <div> <input v-model="value" :placeholder="placeholder" /> </div> </template> <script> import { defineComponent } from 'vue' export default defineComponent({ props: { value: { type: String, default: '' }, placeholder: { type: String, default: '请输入' } } }) </script> <style scoped> div { border: 1px solid #ccc; padding: 10px; } input { width: 100%; height: 32px; border: none; border-bottom: 1px solid #ccc; } </style> ``` 2. 注册自定义组件 在使用Form-Create-Designer的页面,需要通过Vue3的全局组件注册方式来注册自定义组件。在代码引入MyInput组件,并使用Vue3的component方法进行注册。 例如: ```vue <template> <div> <form-create-designer v-model="form" :schema="schema" /> </div> </template> <script> import { defineComponent } from 'vue' import FormCreateDesigner from 'vue3-form-create-designer' import MyInput from './MyInput.vue' export default defineComponent({ components: { FormCreateDesigner, MyInput }, data() { return { form: {}, schema: { fields: [ { type: 'MyInput', model: 'input', label: '自定义输入框' } ] } } } }) </script> ``` 在上面的代码,我们将MyInput组件注册为全局组件,并在schema使用了type为MyInput的自定义组件。 3. 使用自定义组件 在注册好自定义组件后,就可以在Schema使用该自定义组件了。可以在Schema使用type属性指定该字段的类型为我们刚刚注册的自定义组件。 例如: ```js { type: 'MyInput', model: 'input', label: '自定义输入框' } ``` 这样就可以在Form-Create-Designer使用自定义组件了。 希望这个回答对你有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值