热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

支持嵌套对象、多级数组的Vue动态多级表单组件——vuedynamicformcomponent

方便不想看完全篇文章的童鞋,简单总结一下,这是篇软广,主要是推广自己在业务中沉淀的一个开源组件vue-dynamic-form-component。基于element-ui实现的v

方便不想看完全篇文章的童鞋,简单总结一下,这是篇软广,主要是推广自己在业务中沉淀的一个开源组件 vue-dynamic-form-component 。基于 element-ui 实现的 vue组件,只需编写类似 async-validator 的规则,自动生成对应的表单,支持常见输入类型的同时,支持嵌套对象、hashmap、多维数组等复杂类型。有需要的童鞋欢迎使用和贡献代码,顺便给个star(我也不知道为什么字体自动加黑了,不关我事)

前言

几个月前,我在github开源了一个前端解析手机应用安装包(IPAAPK 文件)信息的工具 app-info-parser ,算是第一次正儿八经的做开源这件事,之后就有了半夜三四点回复issue、修bug的体验,说实话,上完班还要处理issue是挺累的,但也是乐在其中。正所谓开源一时爽,一直开源一直爽。

对于程序员而言,最不喜欢的事情,除了和产品经理 吵架 (交流,是交流,不是吵架,要peace)外,估计就是一直做重复的事情了。在程序界,有相当一部分开源工具都是为了把人从重复的事情中解放出来,去做更有趣、更能体现个人价值的事情。比如 AI智能回复老婆消息 (请勿随意尝试,老婆没了我不负责)。

之前开源的工具 app-info-parser 是为了减少重复工作,提高生产效率,接下来的主角 vue-dynamic-form-component 也是如此。

先贴一个展示大概功能的 gif ,动图有点大,如果加载不出来的话可以到 组件首页 查看。

左边是你需要编写的主要代码,右边是对应生成的表单。

《支持嵌套对象、多级数组的Vue动态多级表单组件 —— vue-dynamic-form-component》

背景(Why)

为什么要做这个组件?其实在前言中已经提到:因为不想一直做重复、没有技术含量的事情

对于本篇文章而言,这件重复、没有技术含量的事情就是:简单的表单代码

我所在的小组主要负责公司的公共服务系统搭建及维护,随之而来的便是一套接一套的CURD系统,目前业界已经存在很多优秀的UI库,比如为 Vue 而生的 element-ui, iView,基于 reactant-design 等,已经在很大程度上提高了PC管理系统的开发效率,减少了很多重复工作。

但是对于表单功能,UI库出于通用性的考虑,实际使用中,对于简单的数据对象,我们仍然需要编写大量的表单代码来实现,因此出现了很多优秀的动态表单组件,比如 vue-form-generator,vue-form-making

那么为什么我还要再造一个类似的轮子?这其实要结合组内的技术栈来说:

由于组内的人员配置问题:前端1人(没错,就是孤独的我)、后端8人+,在技术栈上,选用了后端同事相对容易上手的 Vue ,基于 element-ui 开发管理系统。而目前已有的动态表单组件存在以下不适用的问题:

  • vue-form-generator:设计思想很好,但是组件样式比较old school,同时对多级对象、多维数组等复杂数据支持不是很好,需要自己实现 field 组件,使用成本较高
  • vue-form-making:也是基于element-ui, 样式统一,但是基于组件类型生成表单的方式不够灵活,只能利用已存在的输入组件,因此不支持多级对象等复杂类型

其他的组件相对而言存在更多的问题,就不一一列举了。

以上就是为什么我会想要再造一个Vue的动态表单轮子,其实里面就已经包含了接下来我们要讲的: vue-dynamic-form-component 有什么作用?

功能(What)

动态生成表单

基于 async-validator 的规则来生成表单,只需要编写简单的声明配置,即可自动生成表单,只需要关注数据类型,无需关注数据类型对应何种输入组件

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'] }
}
}
}
}

《支持嵌套对象、多级数组的Vue动态多级表单组件 —— vue-dynamic-form-component》

如果是直接使用 element-ui,除了长得多的html代码,还需要编写对应的 rule 以供表单验证,对应的代码量要多得多。

支持嵌套对象/Hashmap/多维数组

使用 element-ui 编写表单时,为了支持嵌套对象等复杂类型,我们可以在 el-form-item 中再添加一个 el-form 或者 el-form-item

但是,如果有更好的选择,你真的愿意一遍一遍的写这样的代码吗?










要注意,以上仅仅只是一个输入框(已省略data代码,为了美观还需要额外的样式代码),就需要写这么多代码,能忍?谁爱忍谁忍,我不忍了。看看如果是使用 vue-dynamic-form-component, 我们需要做什么

// 只展示 descriptors 代码,其他无需变更
{
user: {
type: 'object',
fields: {
name: { type: 'string', label: '名字', placeholder: '只允许英文、数字' }
}
}
}

并且, vue-dynamic-form-component 还对多级表单做了样式优化,自动加深子表单的背景色(初始背景色、颜色偏移量可配置),方便区分:

《支持嵌套对象、多级数组的Vue动态多级表单组件 —— vue-dynamic-form-component》

同时,针对 hashmap / array 等复杂数据类型实现了对应的交互逻辑,提供添加、删除等操作:

《支持嵌套对象、多级数组的Vue动态多级表单组件 —— vue-dynamic-form-component》

看完这个你确定你还想再回去写前面的代码?(等我不干程序员了我就去当推销员-。-)

使用(How)

假如你心动了,那么,心动不如行动(自我嘲讽:好老土的说法),赶紧用起来,把自己从繁琐无聊的表单代码中解放出来。

具体用法请查阅组件文档:https://vue-dynamic-form.quin…

别忘了先去 github 点个star哦(你以为这里就不加粗了吗,不存在的兄dei)

最后

不要拘泥于业务开发,善于(或者说要热衷于)寻找业务/生活中存在的待解决问题,然后干掉它,这才是真正体现你价值的地方。

共勉~


推荐阅读
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 随着前端技术的发展,越来越多的开发者开始使用react、vue等web框架,但很少有人深入理解这些框架的源码。然而,这些框架底层都是由原生的javascript构建而成。对于初学前端的人来说,可能会认为javascript很容易上手,但实际上只是因为它被高度封装了。与能够使用封装类的人相比,能够理解框架原理的人则处于另一个层面。本文将深入剖析jquery源码,探寻框架底层的原理,帮助读者更好地理解web框架的运行机制。 ... [详细]
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 网址:https:vue.docschina.orgv2guideforms.html表单input绑定基础用法可以通过使用v-model指令,在 ... [详细]
  • 先看看ElementUI里关于el-table的template数据结构:<template><el-table:datatableData><e ... [详细]
  • 在package.json中有如下两个对象:husky:{hooks:{pre-commit:lint-staged}},lint-staged:{src** ... [详细]
  • 本文介绍了自学Vue的第01天的内容,包括学习目标、学习资料的收集和学习方法的选择。作者解释了为什么要学习Vue以及选择Vue的原因,包括完善的中文文档、较低的学习曲线、使用人数众多等。作者还列举了自己选择的学习资料,包括全新vue2.5核心技术全方位讲解+实战精讲教程、全新vue2.5项目实战全家桶单页面仿京东电商等。最后,作者提出了学习方法,包括简单的入门课程和实战课程。 ... [详细]
  • 今天就跟大家聊聊有关怎么在Android应用中实现一个换肤功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根 ... [详细]
author-avatar
老陈
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有