[开源]致力打造开源最强Vue动态表单组件,拖拽快速生成表单页面
![[开源]致力打造开源最强Vue动态表单组件,拖拽快速生成表单页面](https://yy123.ink/api/img/1782588375777-qx5yz4.jpg)
一、开源项目简介
ng-form 致力打造开源最强vue动态表单组件
NG-FORM-ELEMENTPLUS
基于vue和element-plus实现的表单设计器。通过拖拽方式快速生成一个表单页面,表单可以导出json格式,也可以将其他人绘制的表单通过json导入方式进行还原。
二、开源协议
使用MIT开源协议
三、界面展示

四、功能概述
动态表单,VUE动态表单。基于vue+elementplus实现动态表单组件,通过拖拽组件到面板即可实现一个表单。支持各个组件的动态隐藏显示,动态表格弹窗式维护。致力打造开源最强vue动态表单组件,持续维护。
和其他开源表单的差异
- 每个组件可以动态隐藏和显示,并且提供除了“必填”以外的多种规则验证,支持表达式验证和正则验证
- 隐藏的组件绑定值可以配置不输出,减少输出数据大小
- 针对选择性控件(radio,select,checkbox)提供选择后触发调用,支持表达式。对选择性控件支持数据联动功能,通过此功能可以做多级联动
- 动态表格提供单独的弹框进行填写和编辑
- 布局方式多样化,提供栅格,表格等多种布局方式
- 支持表单预览模式,表单内容全部非组件化,全部文本显示
- 针对选择性控件(radio,select,checkbox)选择后将对应的label进行单独存储,方便展示
组件
- ng-form-design 表单设计器(基于可视化操作快速设计出表单页面,生成配置json或页面)
- ng-form-build 表单构建器(根据设计器中获取的配置json数据,快速构建出表单页面,添加readonly属性后展现预览表单)
特性
统一规范
element-ui、iview版本配置和组件命名一致,切换ui无需改动任何代码。
使用方式
支持npm yarn模块化安装,对于历史传统项目,也支持cdn方式引用。
强大功能
支持每个组件的动态显隐,正则、表达式级别的数据校验,支持自定义组件,满足各种需求。
五、技术选型
安装
npm install --save ng-form-elementplus
引用
// 导入组件库 import NgFormElementPlus from 'ng-form-elementplus' import 'ng-form-elementplus/packages/form/src/form-design.css'
注册
// 注册组件库 Vue.use(NgFormElementPlus)
页面引用
<div id="app">
<ng-form-design />
</div>
API 说明
1. 表单绘制组件 ng-form-design
方法:
方法名称
参数
说明
initModel
json
初始化动态表单内容,参数为动态表单json模板
getModel
N/A
返回当前正在编辑得动态表单信息
属性:
属性名
说明
格式
默认值
customComponents
自定义组件的配置,具体参加最下方自定义组件示例中的格式
array
N/A
config
表单的一些基础配置,主要为http的一些参数,譬如在http请求中给header增加参数:config: { httpConfig: (config)=>{ config.headers['aaaa'] = 'bbbb' return config } }
object
N/A
clear
是否显示面板上清除按钮
boolean
true
preview
是否显示面板上预览按钮
boolean
true
reder
是否显示面板上渲染按钮
boolean
true
imp
是否显示面板上导入按钮
boolean
true
exp
是否显示面板上导出按钮
boolean
true
basic-item
基础组件是否要展示或待选组件列表集合
boolean/Array
true
personal-item
个性化组件是否要展示或待选组件列表集合
boolean/Array
true
layout-item
布局组件是否要展示或待选组件列表集合
boolean/Array
true
插槽:
插槽名称
说明
drag
左侧组件面板插槽,可以在组件面板上面填充一个区域展示内容
formName
当前动态表单名称
controlButton
功能区按钮,如果需要自定义功能按钮可以在这里自定义
插槽示例:
<ng-form-design >
<template slot="controlButton" >
<el-button type="text" size="large" @click="initDemo(1)">示例1</el-button>
<el-button type="text" size="large" @click="initDemo(2)">示例2</el-button>
<el-button type="text" size="large" @click="initDemo(3)">示例3</el-button>
</template>
<template slot="formName">
<span> vue-drag-formdesign 示例 </span>
</template>
</ng-form-design>
2. 表单查看/填报组件 ng-form-build
方法:
方法名称
参数
说明
reset
N/A
重置动态表单内容
validator
N/A
根据设置的规则验证当前表单内容,返回Promise
getData
N/A
表单验证后,获取当前表单数据,返回Promise
属性:
属性名
说明
格式
默认值
formTemplate
表单模板
json
无
models
表单填充数据
json
无
disabled
是否禁用
boolean
false
renderPreview
当前是否为预览模式
boolean
false
config
表单的一些基础配置,主要为http的一些参数,譬如在http请求中给header增加参数:config: { httpConfig: (config)=>{ config.headers['aaaa'] = 'bbbb' return config } }
object
N/A
customComponents
自定义组件的配置,具体参加最下方自定义组件示例中的格式
array
N/A
使用示例:
<template>
<div id="app">
<ng-form-build :formTemplate="formTemplate" :models="models"/>
</div>
</template>
<script>
export default {
data(){
return {
models: {} ,
formTemplate: {}
}
},
created() {
this.formTemplate = require('./data/basic.json')
}
}
</script>
3. 自定义组件示例
3.1 自定义一个组件(根据文本中输入的地址展示图片)
<template>
<div>
<el-input
v-if="!preview"
type="textarea"
autosize
placeholder="请输入图片地址"
v-model="models[record.model]" :disabled="disabled">
</el-input>
<el-image
:style="record.options.style ? record.options.style : null"
:src="models[record.model]"
fit="scale-down"></el-image>
</div>
</template>
<script>
export default {
props: {
record: {//组件数据
type: Object,
required: true
},
models: {// 表单数组
type: Object,
required: true
},
disabled: { // 是否禁用
type: Boolean,
default: false
} ,
preview: {// 是否当前是预览
type: Boolean ,
default: false
}
},
methods: {
}
}
</script>
3.2 定义一个自定义组件的属性配置组件(后面通过插槽挂到表单绘制面板的属性面板中)
<template>
<!-- 自定义组件的属性配置 -->
<el-form v-show="selectItem.key" size="default" :disabled="disabled">
<!-- TCustom start-->
<template v-if="selectItem.type == 'customT'">
<!-- 开关的label -->
<el-form-item label="图片样式">
<el-input type="textarea" placeholder="请输入" v-model="selectItem.options.style" />
</el-form-item>
</template>
<!-- TCustom end -->
</el-form>
</template>
<script>
export default {
props: {
selectItem: { // 当前选择的组件
type: Object,
required: true
},
disabled: { // 是否禁用
type: Boolean,
default: false
}
}
}
</script>
3.3 在动态表单绘制面板中进行配置
<template>
<div id="app">
<ng-form-design ref="formDesign" :custom-components="customComponents" >
<!-- 自定义属性配置 -->
<template slot="custom-properties" slot-scope="{selectItem}">
<Properties :selectItem="selectItem"/>
</template>
<template slot="formName">
<span> vue-drag-formdesign 示例 </span>
</template>
</ng-form-design>
</div>
</template>
<script>
// 引用自定义的表单组件和自定义组件配置信息修改组件
import CustomT from './components/TCustom'
import Properties from './components/properties'
export default {
name: 'App',
components: {CustomT , Properties},
data(){
return {
// 自定义组件列表
customComponents: [
{
type: 'customT' ,
label: "自定义图片展示", // 标题文字
component: CustomT ,
options: {
style: 'width:100px;height:100px'
},
model: "customT",
key: "customT",
rules: [
{
required: false,
message: "必填项"
}
]
},
]
}
} ,
methods: {
}
}
</script>