vue渲染大量数据如何优化_Vue列表渲染性能优化原理

Vue列表渲染性能优化原理

Vue 是一个高效的 mvvm 框架,这得益于作者已经帮我们框架内部做了足够的优化,比如各个细节的缓存( parseText 结果的缓存,compile 编译结果的缓存等)。

大列表是容易造成性能问题的地方,一不小心就会造成大量的重绘和重排。Vue 的列表渲染实现在 v-for 指令的 update 方法, 性能优化的大部分细节在 diff 函数。

列表渲染时会为迭代列表的每一份数据并为他们生成各自对应的片段对象 frag ,frag.node 为片段对象的 DOM 元素。

frag缓存和track-by

在列表渲染过程中,当列表数据发生变化时,为了避免 frag 的重复创建和大规模的重新渲染, Vue 会尽可能复用缓存的 frag ,高效的缓存 frag 命中率也是 DOM 元素复用的关键。

以下例子

new Vue({

template: `

`,

data: function(){

return {

model: [1, 2, 3]

}

}

})

当这个组件中的列表首次渲染时,Vue 会将创建的 frag 缓存到 dir.cache 。默认通过数据对象的特征来决定对已有作用域和 DOM 元素的复用程度。例如当数据对象为Array时,缓存 id 为数组的 value ,当数据对象为 Object 时,缓存 id 为对象的 $key 。对于这个例子来说三个缓存 id 为1、2、3。

这样在上面的例子中,如果 vm.model 变为 [3, 2, 1],新的列表的三个片段的缓存 id 分别为3、2、1,因此我们能做到复用全部已创建的frag。

v-for 指令中片段 frag 的缓存 id 计算规则在 getTrackByKey ,从中可以看到,当 track-by 不存在时,缓存 id 将取数组的 value 或对象的 key 。但是这里有一个问题,如果数组出现重复值,会出现缓存 id 冲突的警告。副作用就是会忽略重复的片段,这是因为相同的缓存 id 获取的 frag 将会引用同一个 DOM 元素。当该 DOM 元素在复用算法中处理过一次后会将 frag 的 reused 属性变为 false,这就导致 v-for 指令会重新尝试将该插入到DOM中,然而因为文档中已经存在该 DOM 元素,就会导致插入失败。

这时 Vue 提示我们可以使用 track-by='$index'

你可能感兴趣的:(vue渲染大量数据如何优化)