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

2021-08-06  本文已影响0人  明天丶你好_3f99

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/

上一篇下一篇

猜你喜欢

热点阅读