## 25-你了解哪些Vue性能优化方法?
### 分析
这是一道综合实践题目,写过一定数量的代码之后小伙伴们自然会开始关注一些优化方法,答得越多肯定实践经验也越丰富,是很好的题目。
### 答题思路:
根据题目描述,这里主要探讨Vue代码层面的优化
---
### 回答范例
- 我这里主要从Vue代码编写层面说一些优化手段,例如:代码分割、服务端渲染、组件缓存、长列表优化等
- 最常见的路由懒加载:有效拆分App尺寸,访问时才异步加载
```js
const router = createRouter({
routes: [
// 借助webpack的import()实现异步组件
{ path: '/foo', component: () => import('./Foo.vue') }
]
})
```
---
- `keep-alive`缓存页面:避免重复创建组件实例,且能保留缓存组件状态
```vue
<router-view v-slot="{ Component }">
<keep-alive>
<component :is="Component"></component>
</keep-alive>
</router-view>
```
---
- 使用`v-show`复用DOM:避免重复创建组件
```vue
<template>
<div class="cell">
<!-- 这种情况用v-show复用DOM,比v-if效果好 -->
<div v-show="value" class="on">
<Heavy :n="10000"/>
</div>
<section v-show="!value" class="off">
<Heavy :n="10000"/>
</section>
</div>
</template>
```
---
- `v-for` 遍历避免同时使用 `v-if`:实际上在Vue3中已经是个错误写法
```vue
<template>
<ul>
<li
v-for="user in activeUsers"
<!-- 避免同时使用,vue3中会报错 -->
<!-- v-if="user.isActive" -->
:key="user.id">
{{ user.name }}
</li>
</ul>
</template>
<script>
export default {
computed: {
activeUsers: function () {
return this.users.filter(user => user.isActive)
}
}
}
</script>
```
---
- v-once和v-memo:不再变化的数据使用`v-once`
```vue
<!-- single element -->
<span v-once>This will never change: {{msg}}</span>
<!-- the element have children -->
<div v-once>
<h1>comment</h1>
<p>{{msg}}</p>
</div>
<!-- component -->
<my-component v-once :comment="msg"></my-component>
<!-- `v-for` directive -->
<ul>
<li v-for="i in list" v-once>{{i}}</li>
</ul>
```
按条件跳过更新时使用`v-momo`:下面这个列表只会更新选中状态变化项
```vue
<div v-for="item in list" :key="item.id" v-memo="[item.id === selected]">
<p>ID: {{ item.id }} - selected: {{ item.id === selected }}</p>
<p>...more child nodes</p>
</div>
```
> https://vuejs.org/api/built-in-directives.html#v-memo
---
- 长列表性能优化:如果是大数据长列表,可采用虚拟滚动,只渲染少部分区域的内容
```html
<recycle-scroller
class="items"
:items="items"
:item-size="24"
>
<template v-slot="{ item }">
<FetchItemView
:item="item"
@vote="voteItem(item)"
/>
</template>
</recycle-scroller>
```
> 一些开源库:
>
> - [vue-virtual-scroller](https://github.com/Akryum/vue-virtual-scroller)
> - [vue-virtual-scroll-grid](https://github.com/rocwang/vue-virtual-scroll-grid)
---
- 事件的销毁:Vue 组件销毁时,会自动解绑它的全部指令及事件监听器,但是仅限于组件本身的事件。
```js
export default {
created() {
this.timer = setInterval(this.refresh, 2000)
},
beforeUnmount() {
clearInterval(this.timer)
}
}
```
---
- 图片懒加载
对于图片过多的页面,为了加速页面加载速度,所以很多时候我们需要将页面内未出现在可视区域内的图片先不做加载, 等到滚动到可视区域后再去加载。
```html
<img v-lazy="/static/img/1.png">
```
> 参考项目:[vue-lazyload](https://github.com/hilongjw/vue-lazyload)
---
- 第三方插件按需引入
像`element-plus`这样的第三方组件库可以按需引入避免体积太大。
```js
import { createApp } from 'vue';
import { Button, Select } from 'element-plus';
const app = createApp()
app.use(Button)
app.use(Select)
```
---
- 子组件分割策略:较重的状态组件适合拆分
```vue
<template>
<div>
<ChildComp/>
</div>
</template>
<script>
export default {
components: {
ChildComp: {
methods: {
heavy () { /* 耗时任务 */ }
},
render (h) {
return h('div', this.heavy())
}
}
}
}
</script>
```
但同时也不宜过度拆分组件,尤其是为了所谓组件抽象将一些不需要渲染的组件特意抽出来,组件实例消耗远大于纯dom节点。参考:https://vuejs.org/guide/best-practices/performance.html#avoid-unnecessary-component-abstractions
---
- 服务端渲染/静态网站生成:SSR/SSG
如果SPA应用有首屏渲染慢的问题,可以考虑SSR、SSG方案优化。参考[SSR Guide](https://vuejs.org/guide/scaling-up/ssr.html)
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
1. [v-if和v-for哪个优先级更高?] 2. [你知道key的作用吗?] 3. [能说说双向绑定以及它的实现原理吗?] 4. [你了解diff算法吗?] 5. [vue中组件之间的通信方式?] 6. [简单说一说你对vuex理解?] 7. [vue-router中如何保护路由?] 8. [你了解哪些Vue性能优化方法?] 9. [你知道nextTick吗,它是干什么的,实现原理是什么?] 10. [说一说你对vue响应式理解?] 11. [你如果想要扩展某个Vue组件时会怎么做?] 12. [nextTick实现原理] 13. [Vue2和Vue3中的响应式原理对比,分别的具体实现思路] 14. [说说 vue2/vue3 的生命周期异同] 15. [watch和computed的区别以及怎么选用
资源推荐
资源详情
资源评论
收起资源包目录
vue面试题.rar (95个子文件)
vue面试题
public
38-child-modify-parent
README.md 2KB
40-create-vue-proj
README.md 2KB
17-only-one-root
test-v2.html 266B
test-v3.html 271B
README.md 2KB
37-error-handle
README.md 3KB
28-route-lazy-load
README.md 2KB
25-performance
README.md 5KB
47-big-data-performance
README.md 1KB
16-create-mount
test-v3.html 859B
README.md 1KB
assets
v2-bf76311258f100b789226ccbb2600071_hd-1579618596674.jpg 14KB
998023-20180519212338609-1617459354.png 56KB
image-20200129121322729.png 37KB
201806191038393.png 88KB
v2-6e88cc53a7e427f0ae8340cf930ac30d_hd.jpg 8KB
logo.png 29KB
v2-bf76311258f100b789226ccbb2600071_hd.jpg 14KB
image-20200119155426142.png 75KB
2bb46bdbccec729d280ac0f5eb4420566c010e08.png 12KB
u=1519789747,1816893723&fm=26&gp=0.jpg 51KB
2bb46bdbccec729d280ac0f5eb4420566c010e08-1580031870677.png 12KB
vuex.png 8KB
image-20200129121057488.png 29KB
404460ceece985d433e1ed1f36cd4215.gif 2.56MB
bz.jpeg 78KB
image-20200207134358051.png 25KB
6c27078960e80bc33b954c0623b8bd9277db8de4.png 14KB
image-20200124114525656.png 52KB
04-diff
test-v3.html 356B
test.html 513B
README.md 2KB
31-SPA-SSR
README.md 2KB
15-watch-computed
test-v3.html 580B
README.md 2KB
01-vif-vfor
test-v3.html 1KB
test.html 707B
README.md 3KB
27-vuex-module
README.md 2KB
14-router
test-v3.html 760B
README.md 1KB
36-async-component
README.md 2KB
39-permission
README.md 3KB
22-template-render
test-v3.html 470B
README.md 1KB
09-nextTick-v3
test-v3.html 424B
README.md 2KB
03-v-model
test-v3.html 467B
test.html 444B
README.md 3KB
46-mutations-actions
README.md 3KB
05-communication
test-v3.html 981B
test.html 2KB
README.md 902B
dist
vue.js.map 684KB
vue.js 334KB
30-watch-watchEffect
README.md 3KB
44-dynamic-route
README.md 1KB
32-directive
README.md 2KB
11-component-extends
test-mixin-v3.html 405B
test-slots-v3.html 330B
README.md 3KB
35-recursive-component
README.md 3KB
42-instance-mount
README.md 1KB
08-vue-perf
README.md 5KB
43-vue-loader
README.md 4KB
12-nextTick-v2
test.html 585B
README.md 3KB
45-vuex-design
test.html 610B
README.md 1KB
10-reactivity
README.md 2KB
13-reactivity-v2vsv3
README.md 2KB
48-watch-vuex-state
test.html 765B
README.md 1KB
06-vuex
README.md 3KB
49-router-link-router-view
README.md 1KB
18-v3-feature
README.md 1KB
20-vdom
README.md 3KB
test-render-v3.html 356B
29-ref-reactive
README.md 2KB
26-one-root
README.md 2KB
19-lifecycle
test-lc-order-v3.html 456B
README.md 3KB
test-lc-change-v3.html 825B
41-best-practice
README.md 2KB
33-$attrs
README.md 2KB
34-v-once
README.md 2KB
21-cache-comp
test-v3.html 1KB
README.md 3KB
02-key
test-v3.html 465B
test.html 564B
README.md 2KB
24-v3-design
README.md 1KB
07-route-guard
README.md 2KB
README.md 4KB
共 95 条
- 1
资源评论
程序员小马软件开发定制
- 粉丝: 8533
- 资源: 2245
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功