方便不想看彻底篇文章的童鞋,简单总结一下,这是篇软广,主要是推广本身在业务中沉淀的一个开源组件 vue-dynamic-form-component 。基于 element-ui
实现的 vue组件,只需编写相似 async-validator
的规则,自动生成对应的表单,支持常见输入类型的同时,支持嵌套对象、hashmap、多维数组等复杂类型。有须要的童鞋欢迎使用和贡献代码,顺便给个star(我也不知道为何字体自动加黑了,不关我事)html
几个月前,我在github开源了一个前端解析手机应用安装包(IPA
或 APK
文件)信息的工具 app-info-parser ,算是第一次正儿八经的作开源这件事,以后就有了半夜三四点回复issue、修bug的体验,说实话,上完班还要处理issue是挺累的,但也是乐在其中。正所谓开源一时爽,一直开源一直爽。前端
对于程序员而言,最不喜欢的事情,除了和产品经理 吵架 (交流,是交流,不是吵架,要peace)外,估计就是一直作重复的事情了。在程序界,有至关一部分开源工具都是为了把人从重复的事情中解放出来,去作更有趣、更能体现我的价值的事情。好比 AI智能回复老婆消息 (请勿随意尝试,老婆没了我不负责)。vue
以前开源的工具 app-info-parser 是减小重复工做,提升生产效率,接下来的主角 vue-dynamic-form-component 也是如此。react
先贴一个展现大概功能的 gif ,动图有点大,若是加载不出来的话能够到 组件首页 查看。git
左边是你须要编写的主要代码,右边是对应生成的表单。程序员
为何要作这个组件?其实在前言中已经提到:由于不想一直作重复、没有技术含量的事情。github
对于本篇文章而言,这件重复、没有技术含量的事情就是:简单的表单代码element-ui
我所在的小组主要负责公司的公共服务系统搭建及维护,随之而来的即是一套接一套的CURD系统,目前业界已经存在不少优秀的UI库,好比为 Vue
而生的 element-ui
, iView
,基于 react
的 ant-design
等,已经在很大程度上提升了PC管理系统的开发效率,减小了不少重复工做。后端
可是对于表单功能,UI库出于通用性的考虑,实际使用中,对于简单的数据对象,咱们仍然须要编写大量的表单代码来实现,由于出现了不少优秀的动态表单组件,好比 vue-form-generator,vue-form-making数组
那么为何我还要再造一个相似的轮子?这其实要结合组内的技术栈来讲:
因为组内的人员配置问题:前端1人(没错,就是孤独的我)、后端8人+,在技术栈上,选用了后端同事相对容易上手的 Vue
,基于 element-ui
开发管理系统。而目前已有的动态表单组件存在如下不适用的问题:
element-ui
, 样式统一,可是基于组件类型生成表单的方式不够灵活,只能利用已存在的输入组件,所以不支持多级对象等复杂类型其余的组件存在的问题基本和上面差很少,就不一一列举了。
以上就是为何我会想要再造一个Vue的动态表单轮子,其实里面就已经包含了接下来咱们要讲的: vue-dynamic-form-component 有什么做用?
基于 async-validator
的规则来生成表单,只须要编写简单的声明配置,便可自动生成表单,只须要关注数据类型,无需关注数据类型对应何种输入组件
<template>
<dynamic-form v-model="data" :descriptors="descriptors">
</dynamic-form>
</template>
复制代码
export default {
data () {
return {
data: {},
descriptors: {
date: { type: 'date', label: 'date \'s label', required: false },
number: { type: 'number', label: 'number \'s label', required: true, placeholder: 'please input the number' },
string: { type: 'string', label: 'string \'s label', required: true, pattern: /^test$/g },
url: { type: 'url', label: 'url \'s label', required: true, placeholder: 'please input the url' },
email: { type: 'email', label: 'email \'s label', required: false },
enum: { type: 'enum', label: 'enum\'s label', enum: ['value-1', 'value-2'] }
}
}
}
}
复制代码
若是是直接使用 element-ui
,除了长得多的html代码,还须要编写对应的 rule
以供表单验证,对应的代码量要多得多。
使用 element-ui
编写表单时,为了支持嵌套对象等复杂类型,咱们能够在 el-form-item
中再添加一个 el-form
或者 el-form-item
。
可是,若是有更好的选择,你真的愿意一遍一遍的写这样的代码吗?
<!-- 省略data,rules等代码 -->
<el-form label-width="120px" :model="data" :rules="rules">
<el-form-item prop="user" label="用户">
<el-form :model="data.user">
<el-form-item label="名字" prop="name">
<el-input v-model="data.user.name" placeholder="只容许英文、数字"></el-input>
</el-form-item>
</el-form>
</el-form-item>
</el-form>
复制代码
要注意,以上仅仅只是一个输入框(已省略data代码,为了美观还须要额外的样式代码),就须要写这么多代码,能忍?谁爱忍谁忍,我不忍了。看看若是是使用 vue-dynamic-form-component
, 咱们须要作什么
// 只展现 descriptors 代码,其余无需变动
{
user: {
type: 'object',
fields: {
name: { type: 'string', label: '名字', placeholder: '只容许英文、数字' }
}
}
}
复制代码
而且, vue-dynamic-form-component
还对多级表单作了样式优化,自动加深子表单的背景色(初始背景色、颜色偏移量可配置),方便区分:
同时,针对 hashmap
/ array
等复杂数据类型实现了对应的交互逻辑,提供添加、删除等操做:
看完这个你肯定你还想再回去写前面的代码?(等我不干程序员了我就去当推销员-。-)
假如你心动了,那么,心动不如行动(自我嘲讽:好老土的说法),赶忙用起来,把本身从繁琐无聊的表单代码中解放出来。
具体用法请查阅组件文档:vue-dynamic-form.quincychen.cn/
别忘了先去 github 点个star哦(你觉得这里就不加粗了吗,不存在的兄dei)
不要拘泥于业务开发,善于(或者说要热衷于)寻找业务/生活中存在的待解决问题,而后干掉它,这才是真正体现你价值的地方。
共勉~