首页 > 其他 > 详细

24.Vue技术栈开发实战-大数据量性能优化

时间:2020-07-20 01:00:31      阅读:254      评论:0      收藏:0      [点我收藏+]

vue框架为我们提供了一些便捷。我们在修改数据的时候,视图就会自动的发生变化,会去做必要的重新渲染。正式因为这个便捷的功能,给我们带来了一些问题,我们无法简单的去控渲染视图的时机,有一些自动为我们完成的,但有时候我们不需要他做太多的工作,当数据量非常大的时候,这个问题就尤为的明显,因为我们的数据放到vue中,它会给我们做一个遍历,给没一个属性都添加getter和setter,这样就非常的冗余,而且没一次一个数据的一点变动,可能会牵扯到很多数据和视图的变化,这就造成了一定的性能问题,所以本节课,我们将围绕这一点,展开一些叙述,看看哪些地方我们可以做一些优化,
技术分享图片

列表优化

首先来看下iview的下拉菜单
技术分享图片
数据多的时候会有滚动条。
技术分享图片
如果数据量达到56百的时候,并且页面上也有很多的下拉菜单的时候,选中一个项会非常的迟钝。
这是提前创建好的页面。
技术分享图片
先把这个组件复制一下
技术分享图片
数据我们要自己定义一下。定义数组list。在mounted里面给list赋值
技术分享图片
之前写好的,在这里加一个i
技术分享图片
循环600次,拼接出来一个list
技术分享图片
循环的时候,让他循环这个list
技术分享图片
定义选定的值
技术分享图片

技术分享图片

多赋值这个列表的代码。复制出来3个
技术分享图片

技术分享图片
改成1千条数据
技术分享图片

选中一个 会有 一个迟钝
技术分享图片
点红色按钮,然后下面会弹出来一个窗,然后去选择下拉的值。
技术分享图片
随便选中结果,视频中选了2、3次。
技术分享图片

技术分享图片
黄色这一段是点击某一项 正在选中
技术分享图片
vue的flushCallbacks话费了400多毫秒
技术分享图片
这是因为我们选中一个,会在内部做渲染。数据改变了 会做重新的渲染。
技术分享图片
1千条数据 ,每一项都渲染出来了。下面有一千个li标签。
技术分享图片

使用插件

技术分享图片
引入这个组件,注册下这个组件
技术分享图片
用这个组件,把你要循环的组件包住
技术分享图片
virtual组件上要设置两个值。
li每一行是30像素的高速。
技术分享图片
size就是每一项的高度,remain就是渲染的数据条数
技术分享图片
都加一下
技术分享图片

技术分享图片

改成6 就不出两个滚动条了
技术分享图片
点击后立马选中,并且有个延迟加载的效果。
技术分享图片
默认只渲染了11条数据
技术分享图片
当滚动的时候
技术分享图片

技术分享图片

再来看下checkbox

技术分享图片

技术分享图片

技术分享图片

给最顶层的div容器加个高度。
技术分享图片
技术分享图片

页面滚动起来相当的卡。
技术分享图片
刷新一下都很慢
技术分享图片
vurtual组件来优化
技术分享图片
渲染很快。
技术分享图片
这里一共就渲染了12条数据。实际渲染的是你可见的区域
技术分享图片
改成10 同样渲染很快
技术分享图片

大型表单优化

这是我们之前封装的表单
技术分享图片

把列表的数据抽出来
技术分享图片
先变成一个空数组
技术分享图片
放在mock文件夹下
技术分享图片
放在这里默认导出
技术分享图片
复制几份表单的列表
技术分享图片
粘贴了很多
技术分享图片
依然怒这个formData
技术分享图片


技术分享图片

再复制一些表单数据,输入的时候,数字好几个字 好几个字的往外蹦出来。
技术分享图片

选中拖动会有延迟。
技术分享图片

优化表单

卡的原因就是我们把数组都绑定在一个组件上,里面的数据一旦改变,就会在组件的根元素里面,去从根节点开始,重新遍历、渲染。里面的数据越多,需要遍历的也就越多 ,
技术分享图片
性能分析这里先刷新
技术分享图片
点击红点
技术分享图片
输入东西后,点击stop
技术分享图片
黄色是js代码在计算,每次输入了新的值都在渲染。
技术分享图片
选中这一段
技术分享图片

技术分享图片
在做队列的循环。数据越多监控的对象也就越多。遍历的循环也就越长。
技术分享图片
不要把所有的数据都绑定在一个组件上。

新建组件

之前的组件就放弃了。
创建form-single组件
技术分享图片
对form-single做循环。
技术分享图片

技术分享图片
接下来要给form-singl传一些值。config就是item元素对象。
技术分享图片
我们之前在form-group里面传入了model,它是一个对象,就是所有的表单元素的数据,在做验证的时候会用到。
技术分享图片
rules是没一个表单元素的验证规则 ,也是一个对象
技术分享图片
error用来做错误提示。手动的展示表单的错误信息。
技术分享图片

form-single还需要传入这几个参数,我们放在外面。
技术分享图片

技术分享图片
给这三个对象的值赋值。遍历formList,就是遍历formData
技术分享图片
定义三个空对象,然后forEach遍历赋值,然后赋值给this对象上的三个对象。
技术分享图片

form-single修改

复制form-group里面的代码
技术分享图片
复制过来后,定义传入的属性
技术分享图片
表单元素的配置
技术分享图片
是否显示组件,根据config对象,如果有了 就显示这个组件
技术分享图片
技术分享图片
循环删掉,因为我们当前就渲染一个组件。
技术分享图片
为什么把 form放在forn-single里面呢?
技术分享图片
这是因为对当前这一条formItem做表单验证。要不然就没法做了。
技术分享图片
所有的item换成config。按钮删除。
技术分享图片
把按钮放在了调用这个组件的页面的form-single的 上面。
技术分享图片
复制原来校验的方法
技术分享图片
放在了调用组件的页面。
技术分享图片
调用深拷贝和接口方法。
技术分享图片
这里把index去掉了
技术分享图片
这里的索引也删掉
技术分享图片
改成valueData
技术分享图片
渲染出来了。
技术分享图片

formItem都删掉。它是必须包在form组件里面的。
技术分享图片


技术分享图片
handleFocus放子啊组件内部。
技术分享图片
刚才的卡顿已经没有了。
技术分享图片
这个还比较卡,因为涉及到了dom操作。
技术分享图片

性能分析
技术分享图片

编辑的时候,黄色区域变窄了。
技术分享图片
比较耗时的是 区间的选择
技术分享图片

组件验证的修改

给form加个ref属性
技术分享图片
执行传进来的回调函数。把valid传给回调函数
技术分享图片

form-single是通过v-for循环渲染出来的东西
技术分享图片
给按钮加个ref
技术分享图片

如果在v-for循环上这个ref的话。它被获取到的是一个数组。
技术分享图片
this.refs.formSingle它是一个数组,里面的没一个元素就是你没个循环的组件实例。
技术分享图片
所以这里我们要用一个循环forEach
技术分享图片
实例上的validate方法
技术分享图片
调用的validate方法就是组件内定义的
技术分享图片

技术分享图片
传的数据就是valueData
技术分享图片
直接点提交报错
技术分享图片
这个地方忘了加$符号
技术分享图片
直接点提交
技术分享图片
服务端返回的是401
技术分享图片
改成lison提交就没问题了
技术分享图片

技术分享图片

在上面定义

技术分享图片
重置操作

技术分享图片

技术分享图片
重置后,所有的数据被重置。
技术分享图片

以上就是表单的优化了。

表格优化

iview的表格,如果的表格渲染到了500行。又自定义render渲染了一些按钮之类的。滚动起来会非常卡。这个表格组件本身就 很复杂。
技术分享图片
专注于大数据渲染的表格组件。
技术分享图片
渲染了大概1万行数据。滚动起来也非常的流畅。
技术分享图片
还可以进行编辑。
技术分享图片


技术分享图片
保存后
技术分享图片

技术分享图片

滚动某一列 横向滚动
技术分享图片
原理也是虚拟渲染,所以非常的流畅
技术分享图片
滚动的时候会切换表格的位置
技术分享图片
支持拖动列宽。
技术分享图片
表格内有个colgroup,通过colgroup可以调整一整列的宽度。
技术分享图片

技术分享图片
github开源地址;
技术分享图片

最后知识点

vue会把我们挂载到vue实例上的数据做遍历,给每一个属性添加getter和setter。当你做数据修改的时候,会触发视图的更新。如果你数据量非常大的话,它会给你做很多的getter和setter。所以当你一个复杂对象, 你不希望它给你做处理的话。数据量很大,而且视图的更新又是可控的。那你可以对数据进行包装。

技术分享图片
这个方法是es5的方法,可以将一个对象密封,密封之后呢。这个对象上的属性,你可以改它的属性值,但是不能再往这个对象上增加新的属性。vue会监测你这个对象,如果是密封起来的它就不会给你遍历增加getter和setter操作。如果你的数据大的话,就不会有这上面的性能开销。因为如果你的对象一旦很大,稍微一个属性的修改可能就涉及到很多很多的更新,所以把它密封起来就可以了。
技术分享图片
密封起来出现的问题是,计算属性可能会失效、一些视图的更新失效。所以计算属性可以自己手动的把一些值做修改。原来是计算属性的,你就写在data里。手动去修改它的值。
技术分享图片
视图更新我们可以用vue的一个方法:forceUpdate()
技术分享图片
可以在一个实例上去调用,一般是不会用到这个方法。
技术分享图片

本节代码叫做性能优化

结束

 

24.Vue技术栈开发实战-大数据量性能优化

原文:https://www.cnblogs.com/wangjunwei/p/13341914.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!