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/