第 005 期 Vue 性能优化之减少渲染的次数
1. 缓存动态组件
开发中,我们会碰到用动态组件的情况。如多标签的页面,每个标签的内容是个动态组件:
<component
v-bind:is="currentTabComponent" />
标签来回切换,同一个组件会被重复渲染。用 keep-alive
包裹动态组件,可以缓存组件的渲染结果,保证同一个组件只被渲染一次。优化写法如下:
<keep-alive>
<component
v-bind:is="currentTabComponent" />
</keep-alive>
2. 合理使用 v-if,v-show
v-if
有更高的切换开销。v-show
有更高的初始渲染开销,其值变化时,内容并不会重新渲染。因此,如果需要非常频繁地切换,则使用 v-show
较好;如果在运行时条件很少改变,则使用 v-if
较好。
3. 插槽(Slot) 改成新的写法
插槽的数据发生改变时,旧的插槽写法,会导致插槽父组件的更新,插槽组件也就更新了。新的插槽写法只会更新插槽组件,少了更新父组件这过程。
旧的插槽写法:
<!-- 默认作用域插槽 (default scoped slot) -->
<my-component>
<template slot-scope="{ msg }">
{{ msg }}
</template>
</my-component>
<!-- 具名插槽 (named slots) -->
<my-component2>
<template slot="header">
<p>Header</p>
</template>
<template
slot="item"
slot-scope="data"
>
<h2>{{ data.title }}</h2>
<p>{{ data.text }}</p>
</template>
</my-component2>
Vue 2.6 加了新的插槽写法: v-slot
。如下:
<!-- 默认作用域插槽 (default scoped slot) -->
<my-component v-slot="{ msg }">
{{ msg }}
</my-component>
<!-- 具名插槽 (named slots) -->
<my-component2>
<template v-slot:header>
<p>Header</p>
</template>
<template v-slot:item="{ data }">
<h2>{{ data.title }}</h2>
<p>{{ data.text }}</p>
</template>
</my-component2>
了解更多插槽新写法的内容,见 Vue 2.6 发布了[1]。
参考文档
-
https://juejin.cn/post/6940190960609394695 -
[1] Vue 2.6 发布了:https//zhuanla.zhihu.com/p/56260917