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

列表优化

首先来看下iview的下拉菜单
24.Vue技术栈开发实战-大数据量性能优化_数组_02
数据多的时候会有滚动条。
24.Vue技术栈开发实战-大数据量性能优化_表单_03
如果数据量达到56百的时候,并且页面上也有很多的下拉菜单的时候,选中一个项会非常的迟钝。
这是提前创建好的页面。
24.Vue技术栈开发实战-大数据量性能优化_Vue.js_04
先把这个组件复制一下
24.Vue技术栈开发实战-大数据量性能优化_数据_05
数据我们要自己定义一下。定义数组list。在mounted里面给list赋值
24.Vue技术栈开发实战-大数据量性能优化_数据_06
之前写好的,在这里加一个i
24.Vue技术栈开发实战-大数据量性能优化_数据_07
循环600次,拼接出来一个list
24.Vue技术栈开发实战-大数据量性能优化_Vue.js_08
循环的时候,让他循环这个list
24.Vue技术栈开发实战-大数据量性能优化_赋值_09
定义选定的值
24.Vue技术栈开发实战-大数据量性能优化_赋值_10

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

多赋值这个列表的代码。复制出来3个
24.Vue技术栈开发实战-大数据量性能优化_Vue.js_12

24.Vue技术栈开发实战-大数据量性能优化_数组_13
改成1千条数据
24.Vue技术栈开发实战-大数据量性能优化_数组_14

选中一个 会有 一个迟钝
24.Vue技术栈开发实战-大数据量性能优化_数组_15
点红色按钮,然后下面会弹出来一个窗,然后去选择下拉的值。
24.Vue技术栈开发实战-大数据量性能优化_数组_16
随便选中结果,视频中选了2、3次。
24.Vue技术栈开发实战-大数据量性能优化_表单_17

24.Vue技术栈开发实战-大数据量性能优化_赋值_18
黄色这一段是点击某一项 正在选中
24.Vue技术栈开发实战-大数据量性能优化_赋值_19
vue的flushCallbacks话费了400多毫秒
24.Vue技术栈开发实战-大数据量性能优化_Vue.js_20
这是因为我们选中一个,会在内部做渲染。数据改变了 会做重新的渲染。
24.Vue技术栈开发实战-大数据量性能优化_Vue.js_21
1千条数据 ,每一项都渲染出来了。下面有一千个li标签。
24.Vue技术栈开发实战-大数据量性能优化_Vue.js_22

使用插件

24.Vue技术栈开发实战-大数据量性能优化_Vue.js_23
引入这个组件,注册下这个组件
24.Vue技术栈开发实战-大数据量性能优化_赋值_24
用这个组件,把你要循环的组件包住
24.Vue技术栈开发实战-大数据量性能优化_表单_25
virtual组件上要设置两个值。
li每一行是30像素的高速。
24.Vue技术栈开发实战-大数据量性能优化_数据_26
size就是每一项的高度,remain就是渲染的数据条数
24.Vue技术栈开发实战-大数据量性能优化_Vue.js_27
都加一下
24.Vue技术栈开发实战-大数据量性能优化_数据_28

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

改成6 就不出两个滚动条了
24.Vue技术栈开发实战-大数据量性能优化_表单_30
点击后立马选中,并且有个延迟加载的效果。
24.Vue技术栈开发实战-大数据量性能优化_数组_31
默认只渲染了11条数据
24.Vue技术栈开发实战-大数据量性能优化_Vue.js_32
当滚动的时候
24.Vue技术栈开发实战-大数据量性能优化_赋值_33

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

再来看下checkbox

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

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

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

给最顶层的div容器加个高度。
24.Vue技术栈开发实战-大数据量性能优化_数据_38
24.Vue技术栈开发实战-大数据量性能优化_表单_39

页面滚动起来相当的卡。
24.Vue技术栈开发实战-大数据量性能优化_Vue.js_40
刷新一下都很慢
24.Vue技术栈开发实战-大数据量性能优化_数据_41
vurtual组件来优化
24.Vue技术栈开发实战-大数据量性能优化_表单_42
渲染很快。
24.Vue技术栈开发实战-大数据量性能优化_Vue.js_43
这里一共就渲染了12条数据。实际渲染的是你可见的区域
24.Vue技术栈开发实战-大数据量性能优化_数组_44
改成10 同样渲染很快
24.Vue技术栈开发实战-大数据量性能优化_赋值_45

大型表单优化

这是我们之前封装的表单
24.Vue技术栈开发实战-大数据量性能优化_表单_46

把列表的数据抽出来
24.Vue技术栈开发实战-大数据量性能优化_数组_47
先变成一个空数组
24.Vue技术栈开发实战-大数据量性能优化_赋值_48
放在mock文件夹下
24.Vue技术栈开发实战-大数据量性能优化_赋值_49
放在这里默认导出
24.Vue技术栈开发实战-大数据量性能优化_表单_50
复制几份表单的列表
24.Vue技术栈开发实战-大数据量性能优化_表单_51
粘贴了很多
24.Vue技术栈开发实战-大数据量性能优化_表单_52
依然怒这个formData
24.Vue技术栈开发实战-大数据量性能优化_数组_53


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

再复制一些表单数据,输入的时候,数字好几个字 好几个字的往外蹦出来。
24.Vue技术栈开发实战-大数据量性能优化_表单_55

选中拖动会有延迟。
24.Vue技术栈开发实战-大数据量性能优化_赋值_56

优化表单

卡的原因就是我们把数组都绑定在一个组件上,里面的数据一旦改变,就会在组件的根元素里面,去从根节点开始,重新遍历、渲染。里面的数据越多,需要遍历的也就越多 ,
24.Vue技术栈开发实战-大数据量性能优化_赋值_57
性能分析这里先刷新
24.Vue技术栈开发实战-大数据量性能优化_表单_58
点击红点
24.Vue技术栈开发实战-大数据量性能优化_赋值_59
输入东西后,点击stop
24.Vue技术栈开发实战-大数据量性能优化_表单_60
黄色是js代码在计算,每次输入了新的值都在渲染。
24.Vue技术栈开发实战-大数据量性能优化_数据_61
选中这一段
24.Vue技术栈开发实战-大数据量性能优化_赋值_62

24.Vue技术栈开发实战-大数据量性能优化_Vue.js_63
在做队列的循环。数据越多监控的对象也就越多。遍历的循环也就越长。
24.Vue技术栈开发实战-大数据量性能优化_Vue.js_64
不要把所有的数据都绑定在一个组件上。

新建组件

之前的组件就放弃了。
创建form-single组件
24.Vue技术栈开发实战-大数据量性能优化_赋值_65
对form-single做循环。
24.Vue技术栈开发实战-大数据量性能优化_赋值_66

24.Vue技术栈开发实战-大数据量性能优化_表单_67
接下来要给form-singl传一些值。config就是item元素对象。
24.Vue技术栈开发实战-大数据量性能优化_Vue.js_68
我们之前在form-group里面传入了model,它是一个对象,就是所有的表单元素的数据,在做验证的时候会用到。
24.Vue技术栈开发实战-大数据量性能优化_Vue.js_69
rules是没一个表单元素的验证规则 ,也是一个对象
24.Vue技术栈开发实战-大数据量性能优化_赋值_70
error用来做错误提示。手动的展示表单的错误信息。
24.Vue技术栈开发实战-大数据量性能优化_表单_71

form-single还需要传入这几个参数,我们放在外面。
24.Vue技术栈开发实战-大数据量性能优化_数组_72

24.Vue技术栈开发实战-大数据量性能优化_表单_73
给这三个对象的值赋值。遍历formList,就是遍历formData
24.Vue技术栈开发实战-大数据量性能优化_数据_74
定义三个空对象,然后forEach遍历赋值,然后赋值给this对象上的三个对象。
24.Vue技术栈开发实战-大数据量性能优化_数组_75

form-single修改

复制form-group里面的代码
24.Vue技术栈开发实战-大数据量性能优化_表单_76
复制过来后,定义传入的属性
24.Vue技术栈开发实战-大数据量性能优化_数组_77
表单元素的配置
24.Vue技术栈开发实战-大数据量性能优化_表单_78
是否显示组件,根据config对象,如果有了 就显示这个组件
24.Vue技术栈开发实战-大数据量性能优化_数组_79
24.Vue技术栈开发实战-大数据量性能优化_数组_80
循环删掉,因为我们当前就渲染一个组件。
24.Vue技术栈开发实战-大数据量性能优化_数组_81
为什么把 form放在forn-single里面呢?
24.Vue技术栈开发实战-大数据量性能优化_赋值_82
这是因为对当前这一条formItem做表单验证。要不然就没法做了。
24.Vue技术栈开发实战-大数据量性能优化_赋值_83
所有的item换成config。按钮删除。
24.Vue技术栈开发实战-大数据量性能优化_数组_84
把按钮放在了调用这个组件的页面的form-single的 上面。
24.Vue技术栈开发实战-大数据量性能优化_数据_85
复制原来校验的方法
24.Vue技术栈开发实战-大数据量性能优化_数据_86
放在了调用组件的页面。
24.Vue技术栈开发实战-大数据量性能优化_表单_87
调用深拷贝和接口方法。
24.Vue技术栈开发实战-大数据量性能优化_表单_88
这里把index去掉了
24.Vue技术栈开发实战-大数据量性能优化_数据_89
这里的索引也删掉
24.Vue技术栈开发实战-大数据量性能优化_数据_90
改成valueData
24.Vue技术栈开发实战-大数据量性能优化_赋值_91
渲染出来了。
24.Vue技术栈开发实战-大数据量性能优化_Vue.js_92

formItem都删掉。它是必须包在form组件里面的。
24.Vue技术栈开发实战-大数据量性能优化_赋值_93


24.Vue技术栈开发实战-大数据量性能优化_数组_94
handleFocus放子啊组件内部。
24.Vue技术栈开发实战-大数据量性能优化_数据_95
刚才的卡顿已经没有了。
24.Vue技术栈开发实战-大数据量性能优化_赋值_96
这个还比较卡,因为涉及到了dom操作。
24.Vue技术栈开发实战-大数据量性能优化_表单_97

性能分析
24.Vue技术栈开发实战-大数据量性能优化_表单_98

编辑的时候,黄色区域变窄了。
24.Vue技术栈开发实战-大数据量性能优化_表单_99
比较耗时的是 区间的选择
24.Vue技术栈开发实战-大数据量性能优化_赋值_100

组件验证的修改

给form加个ref属性
24.Vue技术栈开发实战-大数据量性能优化_数组_101
执行传进来的回调函数。把valid传给回调函数
24.Vue技术栈开发实战-大数据量性能优化_数据_102

form-single是通过v-for循环渲染出来的东西
24.Vue技术栈开发实战-大数据量性能优化_赋值_103
给按钮加个ref
24.Vue技术栈开发实战-大数据量性能优化_表单_104

如果在v-for循环上这个ref的话。它被获取到的是一个数组。
24.Vue技术栈开发实战-大数据量性能优化_数组_105
this.refs.formSingle它是一个数组,里面的没一个元素就是你没个循环的组件实例。
24.Vue技术栈开发实战-大数据量性能优化_Vue.js_106
所以这里我们要用一个循环forEach
24.Vue技术栈开发实战-大数据量性能优化_数组_107
实例上的validate方法
24.Vue技术栈开发实战-大数据量性能优化_表单_108
调用的validate方法就是组件内定义的
24.Vue技术栈开发实战-大数据量性能优化_表单_109

24.Vue技术栈开发实战-大数据量性能优化_赋值_110
传的数据就是valueData
24.Vue技术栈开发实战-大数据量性能优化_Vue.js_111
直接点提交报错
24.Vue技术栈开发实战-大数据量性能优化_Vue.js_112
这个地方忘了加$符号
24.Vue技术栈开发实战-大数据量性能优化_Vue.js_113
直接点提交
24.Vue技术栈开发实战-大数据量性能优化_Vue.js_114
服务端返回的是401
24.Vue技术栈开发实战-大数据量性能优化_赋值_115
改成lison提交就没问题了
24.Vue技术栈开发实战-大数据量性能优化_赋值_116

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

在上面定义

24.Vue技术栈开发实战-大数据量性能优化_数组_118
重置操作

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

24.Vue技术栈开发实战-大数据量性能优化_Vue.js_120
重置后,所有的数据被重置。
24.Vue技术栈开发实战-大数据量性能优化_数组_121

以上就是表单的优化了。

表格优化

iview的表格,如果的表格渲染到了500行。又自定义render渲染了一些按钮之类的。滚动起来会非常卡。这个表格组件本身就 很复杂。
24.Vue技术栈开发实战-大数据量性能优化_Vue.js_122
专注于大数据渲染的表格组件。
24.Vue技术栈开发实战-大数据量性能优化_表单_123
渲染了大概1万行数据。滚动起来也非常的流畅。
24.Vue技术栈开发实战-大数据量性能优化_赋值_124
还可以进行编辑。
24.Vue技术栈开发实战-大数据量性能优化_数据_125


24.Vue技术栈开发实战-大数据量性能优化_数组_126
保存后
24.Vue技术栈开发实战-大数据量性能优化_数据_127

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

滚动某一列 横向滚动
24.Vue技术栈开发实战-大数据量性能优化_赋值_129
原理也是虚拟渲染,所以非常的流畅
24.Vue技术栈开发实战-大数据量性能优化_表单_130
滚动的时候会切换表格的位置
24.Vue技术栈开发实战-大数据量性能优化_Vue.js_131
支持拖动列宽。
24.Vue技术栈开发实战-大数据量性能优化_数据_132
表格内有个colgroup,通过colgroup可以调整一整列的宽度。
24.Vue技术栈开发实战-大数据量性能优化_Vue.js_133

24.Vue技术栈开发实战-大数据量性能优化_Vue.js_134
github开源地址;
24.Vue技术栈开发实战-大数据量性能优化_表单_135

最后知识点

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

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

本节代码叫做性能优化

结束