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

栏目: JavaScript · 发布时间: 4年前

内容简介:方便不想看完全篇文章的童鞋,简单总结一下,这是篇软广,主要是推广自己在业务中沉淀的一个开源组件几个月前,我在github开源了一个前端解析手机应用安装包(对于程序员而言,最不喜欢的事情,除了和产品经理

方便不想看完全篇文章的童鞋,简单总结一下,这是篇软广,主要是推广自己在业务中沉淀的一个开源组件 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-generatorvue-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 的规则来生成表单,只需要编写简单的声明配置,即可自动生成表单,只需要关注数据类型,无需关注数据类型对应何种输入组件

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

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

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

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

使用 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 还对多级表单做了样式优化,自动加深子表单的背景色(初始背景色、颜色偏移量可配置),方便区分:

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

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

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

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

使用(How)

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

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

别忘了先去 github 点个star哦

你以为这里就不加粗了吗,不存在的兄dei

最后

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

共勉~


以上所述就是小编给大家介绍的《支持嵌套对象、多级数组的Vue动态多级表单组件 —— vue-dynamic-form-component》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

从界面到网络空间

从界面到网络空间

(美)海姆 / 金吾伦/刘钢 / 上海科技教育出版社 / 2000-7 / 16.40元

计算机急剧改变了20世纪的生活。今天,我们凭借遍及全球的计算机网络加速了过去以广播、报纸和电视形式进行的交流。思想风驰电掣般在全球翻飞。仅在角落中潜伏着已完善的虚拟实在。在虚拟实在吕,我们能将自己沉浸于感官模拟,不仅对现实世界,也对假想世界。当我们开始在真实世界与虚拟世界之间转换时,迈克尔·海姆问,我们对实在的感觉如何改变?在〈从界面到网络空间〉中,海姆探讨了这一问题,以及信息时代其他哲学问题。他......一起来看看 《从界面到网络空间》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

html转js在线工具
html转js在线工具

html转js在线工具