当前位置: 首页 > Web前端 > HTML

拒绝CV,高效开发后台系统

时间:2023-03-28 16:17:55 HTML

背景近年来开发了一些后台系统。最常见的场景是内容管理页面,主要包括表单查询和各种管理操作。随着业务的扩大,在开发了很多类似的页面后,发现同一个项目中各个窗体的结构、样式、样式都大体相同。每次添加新页面时,都会使用copy方法修改参数逻辑。这种写法容易产生很多重复的代码,于是想到了封装组件,希望能提高代码复用率,提高开发效率。之前的项目主要是基于Vue2+ElementUI开发的,所以本文在此基础上发表一些关于表单封装的设计和思考。代码已经上传到github仓库(Form组件),欢迎star???设计&实现可配置的表单我们来看下面两个表单案例,表单一:查询修改删除表格2:查询修改删除我们把表单分成两部分,输入框item和按钮组比较两种形式,按钮组由三个文本和类型相同的按钮组成,不同的是形式1中的一些按钮带有图标。输入框项目也是如此。标签的性质基本相同。不同的是一些配置,包括label,placeholder,clearable...让我们尝试提取这些配置并生成一个JSON格式的数据。会发生什么?我们先看看按钮组。按钮需要什么?Text,bindingmethod,size,style....根据elementUI按钮组件提供的props,一个按钮可以描述为如下配置:{name:'query',type:'primary',text:'query',icon:'el-icon-search',size:'small'}因为按钮绑定的功能可能会涉及到表单外的数据,所以决定为按钮配置一个唯一标识:name,我们可以让按钮触发自定义事件并在单击时传递名称。让我们看一下输入框项目。输入框一般包含哪些属性?类型类型。如input、select、cascader(级联选择器)标签输入项描述。名称字段名称。value条目绑定到的值。占位符、大小、可清除、禁用和其他配置。基于以上配置,我们使用一个JSON数据来描述一个表单:{inputs:[{type:'input',name:'name',label:'name',value:''},{type:'select',名称:'性别',标签:'性别',选项:[{标签:'男',值:'1'},{标签:'女',值:'2'}],值:''}],button:[{name:'query',type:'primary',text:'query',icon:'el-icon-search'},{name:'delete',type:'danger',文本:'Delete',icon:'el-icon-delete'}]}相比于之前用template编写的表单,这种json配置更清晰,更易于维护。我们可以进一步优化它。对于大量重复的表单项配置,我们可以提前写好,然后通过查询、删除、修改按钮等模块暴露出来。此外,对于可能需要跨表单统一的大小等属性,可以通过依赖注入来全局配置它们。配置好有用的渲染函数后,下一步就是将其转换为真正的表单组件。对于按钮组部分,只是v-forashuttle。同时给按钮绑定点击事件,触发自定义事件并传递按钮的标识符:name。{{button.text}}对于输入框item的部分,会有一些不同的情况,比如el-input,el-select等...我开始的写法也很简单,直接用v-if区分:

虽然简单粗暴,但如果注意观察,会发现生成了很多冗余代码。除了某些类型的输入框特有的一些特殊属性外,大部分都是通用属性。按照这种写法,我们有多少输入框类型,这些重复的代码就得写多少次,这样不好。后来看了一些博客文章,受到启发,就用Vue的渲染功能进行改造。这里就不介绍渲染函数的相关概念了。我们来看看渲染函数的用法。需要传入三个参数:createElement('div',//{String|Object|Function},一个HTML标签名,组件Option对象,或者...{},//一个属性对应的数据对象thetemplate[]//{String|Array},childvirtualnodes(VNodes),constructedby`createElement()`)参考渲染函数的语法,比较各种类型的输入框,我们发现它们的相同点和不同点需要动态配置的可以写在第二个参数里。然后开始改造:const_this=thisreturncreateElement('div',{},[createElement('label',_this.inputItem.label),//动态渲染createElement(`el-${_this.inputItem.type}`,{props:{value:_this.inputValue,//我这里的思路是:绑定值和配置分离,通过封装组件独立维护size:_this.size,//可以写一个计算属性,如果有一个全局Disabled:_this.inputItem.disabled},attrs:{placeholder:_this.inputItem.placeholder},on:{input(newValue){_this.inputValue=newValue_this.$emit('change',_this.inputItem.name,newValue)}}},[])//这里用同样的方法判断是否是select,然后处理渲染el-option])最后我们写一个外层组件,包含按钮组组件和输入框项目组件。具体我就不赘述了,大家可以去github仓库查看。看一下最终的效果:从之前公司的后台项目开始的代码摘要和打包形式。最近逛社区的时候正好看到相关的文章,所以想整理记录一下。当然这里只完成了最简单的封装,更复杂的需求包括表单项联动、表单校验等,大家可以自行进一步开发。如果您觉得本文对您有帮助,请点个赞?,如有不同意见,欢迎在评论区讨论。当然,本文中的封装属于业务组件,不是基础组件。所以,它不属于基础设施建设的范畴,甚至可能根本不符合你的业务场景。所以,开发中没有绝对最优的方案,只有适不适合你的业务场景。