减少页面多余的无用渲染

一、Props 稳定性

在 Vue 之中,一个子组件只会在其至少一个 props 改变时才会更新。思考以下示例:



组件中,它使用了 id 和 activeId 两个 props 来确定它是否是当前活跃的那一项。虽然这是可行的,但问题是每当 activeId 更新时,列表中的每一个 都会跟着更新!

理想情况下,只有活跃状态发生改变的项才应该更新。我们可以将活跃状态比对的逻辑移入父组件来实现这一点,然后让 改为接收一个 active prop:



现在,对于大多数的组件来说,activeId 改变时,它们的 active prop 都会保持不变,因此它们无需再更新。总结一下,这个技巧的核心思想就是让传给子组件的 props 尽量保持稳定。

二、v-once

仅渲染元素和组件一次,并跳过之后的更新。
在随后的重新渲染,元素/组件及其所有子项将被当作静态内容并跳过渲染。这可以用来优化更新时的性能。
比如一些title 和一些不变的标题 文本

This will never change: {{msg}}

comment

{{msg}}

  • {{i}}

三、v-memo (3.2版本以后可以使用)

v-memo 是一个内置指令,可以用来有条件地跳过某些大型子树或者 v-for 列表的更新
期望的绑定值类型:any[]

...

当组件重新渲染,如果 valueA 和 valueB 都保持不变,这个

及其子项的所有更新都将被跳过。实际上,甚至虚拟 DOM 的 vnode 创建也将被跳过,因为缓存的子树副本可以被重新使用。
正确指定缓存数组很重要,否则应该生效的更新可能被跳过。v-memo 传入空依赖数组 (v-memo="[]") 将与 v-once 效果相同。

一般 与v-for 配合使用
v-memo 仅用于性能至上场景中的微小优化,应该很少需要。最常见的情况可能是有助于渲染海量 v-for 列表 (长度超过 1000 的情况):

ID: {{ item.id }} - selected: {{ item.id === selected }}

...more child nodes

注意:

当搭配 v-for 使用 v-memo,确保两者都绑定在同一个元素上。v-memo 不能用在 v-for 内部。

你可能感兴趣的:(减少页面多余的无用渲染)