需求背景:最近在做的项目中需要完成一个动态表单的需求,可以根据用户需求,动态拖拽添加表单字段,并且配置表单项属性,之前的一个版本是前后预定好一些多个了几个字段,表单设计的一个表单项就对应一个数据库中的一列,前端根据查询到的数据做相应的解析(开始使用v-if),完成表单的渲染,这样带来的问题就是给拓展带来很大的麻烦,况且在 v-for中使用v-if的效率实在是低的吓人,官方不推荐这种用法。

改进:经过一段时间的考虑决定使用json的格式来存储表单设计的数据,由前端这个传如指定的json,后台只解析约定好的涉及固定业务逻辑的数据,其他非固定业务数据(用户拓展),数据均由前端传过来,后台存储在一个json中,在返回给前端,交由前端去完成解析

第一次改进 :
表字段改为json

 //v-if 简单,容易理解
json +  数据库 + 前端 v-if 根据fileType 渲染对应的字段

解决了,有限拓展字段的限制,还有个前端表单渲染的性能问题

第二次改进:
查阅vue官方文档,发现个好玩的,动态组件

<components :is="componentType" v-for="field in fields" :label="label" :required="required"></components>

所有组件用is确定渲染的组件类型,高效的同时让代码更简洁
问题:如果我的子组件,由很多属性需要注入,也就意味着我的子组件中需要写大量的props,在components 上也要大量的 v-bind:property 来传递值

第三次改进:
后来查阅有关资料,又发现了一个好玩的v-bind

<components :is="componentType" v-for="field in fields" v-bind="field"></components>

所有需要绑定的属性值都在field 中,子组件中:

export default{
	props:['value','required',....]//其他略
 }

就可以批量注入,官网文档截图:
官网,一次性传入所有props截图

Logo

前往低代码交流专区

更多推荐