【基于vue的大量表单数据,动态生成表单性能优化篇】解决输入延迟,卡顿问题

需求分析

需求:根据后端返回的字段,生成多条表单数据( 实质是批量发布商品 ),预留可增删改功能

实现思路

后端返回的数据格式是一个一维数组(一个商品的所有字段)

let product_item =  [
	{
	  prop:'name',
	  value:'',
	  type:'input',//表单类型--输入框
	},
	{
	  prop:'img',
	  value:'',
	  type:'img'//表单类型--图片
	},
	{
	  prop:'type',
	  value:'',
	  type:'select'//表单类型--下拉框
	},
	{
	  prop:'type',
	  value:'',
	  type:'selectSearch'//表单类型--下拉搜索
	}
	...
]

这是一个商品的,可以直接通过遍历生成表单就行,那么现在我们的需求是发布多个商品的,需要进行一个处理,也就是变成二维数组

product_list = [
	product_item,
	product_item,
	...
]

这一步需要注意的是,每一个product_item里面的字段的引用位置不能相同,否则输入表单时会相互映射,所以每一个product_item都做一个深拷贝。

写法一
代码集中在一个组件里面,我想大多数人第一遍写的代码大多数是这样的,这样子写也并不是错的,但是表单的量一多(product_list)就会出现卡顿现象,比如输入、下拉的时候,在测试过程中,10个商品卡顿现象还不明显,当增加到30-100条时就非常卡顿了,甚至不能使用。至于卡顿的原因往后看

	<div v-for="(row,i) in product_list " :key="i">
		<div v-for="(v,k) in row" :key="k">
			<div v-if="v.type==='input'">
				<el-input></el-input>
			</div>
			<div v-else-if="xxx"></div>
			....
		</div>
	</div>

写法二
将代码拆分成多个组件,将表单换为原生的表单(样式采用element ui的)
product.vue页面
渲染多条商品表单的

	<div v-for="(row,i) in product_list " :key="i">
		<product-item :row="row" :index="i"></product-item>//每一条商品表单组件
	</div>

product-item组件
渲染单个商品表单的

<div v-for="(item,i) in row" :key="i">
	<product-item-form :item="item"></product-item-form>
</div>

product-item-form组件
根据类型渲染表单,此处使用了:lazy修饰符避免频繁更新,以提高流畅度

<div>
	<div v-if="item.type==='input'">
		<input v-model.lazy="item[item.prop]" />//绑定到prop上,使用原生标签,性能翻倍
	</div>
	<div v-else-if="xxx"></div>
	...
</div>

由于item的引用位置依然是product_list的,所以不必担心拿不到最终的值的问题。

利用方法二的写法进行测试
测试的发布于商品个数100个,总的表单的个数100*11 = 1100(相当于1100个输入框),结果是输入不卡,下拉框也不卡,整体流畅,与写法一差距的性能巨大。

在这里插入图片描述

总结

也许在少量表单时(20个以内)的时候,俩者差距不大,但是当超过30个商品时就差距很大。
优化点:

  1. 拆分组件,在组件更新的时候只需要更新组件,而不用整个页面,这跟vue的patch虚拟dom效率有关
  2. 使用lazy修饰符,避免输入更新data太频繁造成卡顿,这个相当于节流吧…
  3. 其实UI框架封装的太臃肿,缝合了各种功能,初始化的时间长,判断条件多等等,所以尽量使用原生的标签,性能强上好几倍(样式可以直接copy UI框架的)。

存在的问题: 因为渲染的数据量多,如果一次性加载100条,页面初次加载的时候会有点慢(渲染慢),我个人认为最好的方法还是分步加载,一次加载30-40条,当用户滚动到一定的位置再追加30-40条,以此类推。如果大家有更好的优化方法,欢迎在评论区讨论。

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Vue Element 动态生成是指通过Vue和Element UI库来实现动态生成和渲染的功能。 在Vue中,可以使用v-for指令结合数组或对象来循环渲染元素,实现动态生成。 首先,需要定义一个数据对象来存储项的信息,例如项的类型、名称、默认值等。然后,在Vue的模板中使用v-for指令来遍历数据对象,根据项的类型不同,使用Element UI提供的不同的组件来渲染对应的元素。 示例代码如下: 在Vue的data中定义项的信息: data() { return { formItems: [ { type: 'input', label: '姓名', value: '' }, { type: 'select', label: '性别', value: '', options: ['男', '女'] }, { type: 'datepicker', label: '生日', value: '' } ] } } 在Vue的模板中使用v-for遍历项并渲染元素: <el-form ref="form" :model="form" label-width="80px"> <el-form-item v-for="item in formItems" :label="item.label" :key="item.label"> <template v-if="item.type === 'input'"> <el-input v-model="form[item.label]" placeholder="请输入姓名"></el-input> </template> <template v-if="item.type === 'select'"> <el-select v-model="form[item.label]" placeholder="请选择性别"> <el-option v-for="option in item.options" :key="option" :label="option" :value="option"></el-option> </el-select> </template> <template v-if="item.type === 'datepicker'"> <el-date-picker v-model="form[item.label]" type="date" placeholder="请选择生日"></el-date-picker> </template> </el-form-item> </el-form> 这样,通过循环遍历数据对象,动态生成对应的元素,实现了动态生成和渲染。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值