美文网首页
form-create表单生成器 自定义加载异步数据

form-create表单生成器 自定义加载异步数据

作者: 明天丶你好_3f99 | 来源:发表于2021-08-06 16:22 被阅读0次

    form-create 是一个可以通过 JSON 生成具有动态渲染、数据收集、验证和提交功能的表单生成组件。支持3个UI框架,并且支持生成任何 Vue 组件。内置20种常用表单组件和自定义组件,再复杂的表单都可以轻松搞定。

    安装

    // ElementUI 版本
    npm i @form-create/element-ui
    // 工具类
    npm i @form-create/utils
    

    注册

    import Vue from 'vue'
    import ElementUI from 'element-ui';
    import 'element-ui/lib/theme-chalk/index.css';
    
    import formCreate from '@form-create/element-ui'
    
    Vue.use(ElementUI)
    Vue.use(formCreate)
    

    生成表单

    <div id="app1">
        <form-create v-model="fApi" :rule="rule" :option="option" :value.sync="value"></form-create>
    </div>
    

    NodeJs

    export default {
        data() {
            return {
                //实例对象
                fApi: {},
                //表单数据
                value: {},
                //表单生成规则
                rule: [
                    {
                        type: 'input',
                        field: 'goods_name',
                        title: '商品名称'
                    },
                    {
                        type: 'datePicker',
                        field: 'created_at',
                        title: '创建时间'
                    }
                ],
                //组件参数配置
                option: {
                    //表单提交事件
                    onSubmit: function (formData) {
                        alert(JSON.stringify(formData))
                    }
                }
            }
        }
    }
    

    自定义fetch加载异步数据

    fetch类型

    type fetch = string | {
      //接口地址
      action: String;
      //异步数据插入的位置,例如:'options', 'props.options'
      to?: String;
      //解析接口返回的数据,返回最终数据. 默认取 `res.data`
      parse?: (body: any, rule:Rule, fapi:fApi) => any;
      //请求方式, 默认 GET
      method?: String;
      //调用接口附带数据
      data?: Object;
      //调用接口附带数据的提交方式,默认为 `formData`
      dataType?: 'json';
      //自定义 header 头信息
      headers?: Object;
      //接口请求失败回调
      onError?: (e: Error | ProgressEvent) => void;
     }
    

    全局挂载自定义属性扩展, 重写fetch解析函数

    formCreate.register('fetch', {
      init: (option, rule, fapi) => {
        customFetch(option, rule, fapi)
      },
      watch: (option, rule, fapi) => {
        customFetch(option, rule, fapi)
      },
      // //rule加载完成
      // loaded({val}, rule, fapi) {
      // },
      // //组件的值发生变化
      // value({val}, rule, fapi) {
      // },
      // //control 生效
      // control({val}, rule, fapi) {
      // },
      // //rule 移除
      // deleted({val}, rule, fapi) {
      // },
      // //rule 生成
      // mounted({val}, rule, fapi) {
      // }
    });
    

    定义自定义处理事件

    import deepSet from "@form-create/utils/lib/deepset"
    function customFetch(option, rule, fapi) {
      let value = option.value;
      if (value && value.action) {
        request({
          url: value.action,
          method: value.method || 'GET',
          data: value.data,
          header: value.header || {},
        }).then(res => {
          let data = res;
          if (value.parse && typeof value.parse == "function") {
            data = value.parse(res)
          }
          if (value.to) {
            deepSet(rule, value.to, data)
            rule.__fc__.$api.sync(rule)
          }
        }).catch(err => {
          value.onError && value.onError(err)
        })
      }
    }
    

    示例
    通过接口加载select的选项

    <template>
    <div>
        <form-create :rule="rule" v-model="fApi" :option="options"/>
    </div>
    </template>
    
    <script>
        export default {
            data(){
                return {
                    fApi:{},
                    options:{
                        onSubmit:(formData)=>{
                            alert(JSON.stringify(formData))
                        }
                    },
                    rule:[
                        {
                            type:'select',
                            field:'city',
                            title:'城市',
                            value:'',
                            options: [],
                            effect:{
                                fetch: {
                                    action:'http://datavmap-public.oss-cn-hangzhou.aliyuncs.com/areas/csv/100000_province.json',
                                    to: 'options',
                                    method:'GET',
                                    parse(res){
                                        return res.rows.map(row=>{
                                            return {
                                                label: row.name,
                                                value: row.adcode
                                            }
                                        })
                                    }
                                }
                            }
                        }
                    ]
                }
                
            }
        }
    </script>
    
    在这里插入图片描述
    在这里插入图片描述

    如需其他配置请参考官方文档 http://www.form-create.com/

    相关文章

      网友评论

          本文标题:form-create表单生成器 自定义加载异步数据

          本文链接:https://www.haomeiwen.com/subject/blfivltx.html