1. 使用 keep-alive:使用 keep-alive 组件可以缓存组件状态,避免在多次切换时重新渲染组件。使用 keep-alive 时,可以设置 include 和 exclude 属性来控制缓存的组件范围。
keep-alive 是 Vue 内置组件,用于缓存组件以避免重新渲染。当一个组件被缓存时,它的状态将保留,而不是被销毁。这可以显著减少组件的渲染时间。
<template>
<div>
<keep-alive>
<router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"></router-view>
</div>
</template>
2. 合理使用 v-if 和 v-show:v-if 适用于频繁切换的场景,v-show 适用于较少变化的场景。在条件渲染时,应根据实际情况选择使用 v-if 还是 v-show,避免不必要的性能消耗。
3. 合理使用 computed 和 watch:computed 适用于计算属性,可以缓存计算结果,避免重复计算。watch 适用于监听数据变化,可以进行一些异步操作,但是需要注意不要在 watch 中进行太多的计算操作。
4. 避免不必要的渲染:使用 v-once 可以避免重复渲染静态内容,使用 Object.freeze() 可以避免数据变化时触发重新渲染。
使用 v-once 可以避免重复渲染静态内容的示例代码:
<template>
<div>
<h1 v-once>{{ title }}</h1>
<p>{{ content }}</p>
</div>
</template>
<script>
export default {
data() {
return {
title: '这是一个标题',
content: '这是一段内容'
}
}
}
</script>
在这个例子中,<h1> 标签中的内容使用了 v-once 指令,因此它只会被渲染一次。而 <p> 标签中的内容没有使用 v-once 指令,因此它会在每次重新渲染时都被渲染。
使用 Object.freeze() 可以避免数据变化时触发重新渲染的示例代码:
<template>
<div>
<p>{{ user.name }}</p>
<p>{{ user.age }}</p>
</div>
</template>
<script>
export default {
data() {
return {
user: Object.freeze({
name: '张三',
age: 20
})
}
}
}
</script>
在这个例子中,user 对象使用了 Object.freeze() 方法,因此它的属性不能被修改。这样做可以避免数据变化时触发重新渲染。如果不使用 Object.freeze() 方法,那么当修改 user 对象的属性时,会触发重新渲染。
5. 合理使用组件:合理拆分组件可以提高组件的复用性和维护性,同时也可以避免组件过大导致的性能问题。
下面是一个简单的代码示例,演示如何合理拆分组件:
<!-- ParentComponent.vue -->
<template>
<div>
<h1>{{ title }}</h1>
<ChildComponent :items="items" />
</div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
name: 'ParentComponent',
components: {
ChildComponent,
},
data() {
return {
title: 'Parent Component',
items: [
{ id: 1, name: 'Item 1' },
{ id: 2, name: 'Item 2' },
{ id: 3, name: 'Item 3' },
],
};
},
};
</script>
<!-- ChildComponent.vue -->
<template>
<ul>
<li v-for="item in items" :key="item.id">{{ item.name }}</li>
</ul>
</template>
<script>
export default {
name: 'ChildComponent',
props: {
items: {
type: Array,
required: true,
},
},
};
</script>
6. 优化数据请求:可以合理使用分页和懒加载等技术,减少数据请求量。可以使用 debounce 和 throttle 等技术进行防抖和节流,避免不必要的请求。
在Vue应用中,可能会频繁触发一些事件,例如窗口大小变化、鼠标滚动等等。如果不加控制地处理这些事件,会导致应用的性能下降。
这时可以使用事件节流和防抖的方式来优化事件处理。事件节流是指在一定时间内,只执行一次事件处理函数;而事件防抖是指在一定时间内,如果事件再次触发,则取消之前的事件处理函数,重新计时。
// 节流函数
function throttle(fn, delay) {
let timer = null;
return function() {
const context = this;
const args = arguments;
if (!timer) {
timer = setTimeout(() => {
fn.apply(context, args);
timer = null;
}, delay);
}
};
}
// 防抖函数
function debounce(fn, delay) {
let timer = null;
return function() {
const context = this;
const args = arguments;
if (timer) {
clearTimeout(timer);
}
timer = setTimeout(() => {
fn.apply(context, args);
}, delay);
};
}
7. 合理使用第三方库:使用第三方库时应该根据实际情况进行选择和使用,避免引入不必要的依赖,影响页面性能。
下面是一个使用lodash库的代码示例:
假设我们有一个数组,需要对其进行排序和去重。可以使用lodash库提供的sortBy和uniq方法来实现:
import _ from 'lodash';
const arr = [3, 1, 2, 1, 4];
const sortedArr = _.sortBy(arr);
const uniqueArr = _.uniq(sortedArr);
console.log(uniqueArr); // [1, 2, 3, 4]
上述写的是引入了全部的lodash能力 可以改成按需引入
import {sortBy, uniq} from 'lodash';
const arr = [3, 1, 2, 1, 4];
const sortedArr = _.sortBy(arr);
const uniqueArr = _.uniq(sortedArr);
console.log(uniqueArr); // [1, 2, 3, 4]
在这个例子中,我们使用了lodash库的sortBy和uniq方法来对数组进行排序和去重。由于lodash库已经被广泛使用和测试过,这些方法已经被充分优化和调试,因此可以在保证页面性能的前提下使用这些方法。同时,我们只引入了需要的方法,避免了引入整个库造成的不必要的依赖。
8. 优化图片加载:图片加载是页面中的一个重要因素,可以使用懒加载和图片压缩等技术来优化图片加载,提高页面性能。
以往文章链接 详细请看
9. 懒加载组件 使用异步组件和按需加载来降低初始加载时间。
懒加载(也称为延迟加载)是指在需要时才加载资源,而不是在加载页面时立即加载。Vue 中可以通过 Vue.lazy 和 Suspense 实现懒加载。
- 例子一
<template>
<div>
<Suspense>
<template #default>
<router-view></router-view>
</template>
<template #fallback>
<div>Loading...</div>
</template>
</Suspense>
</div>
</template>
<script>
import { createRouter, createWebHistory } from 'vue-router'
const Home = () => import('./views/Home.vue')
const About = () => import('./views/About.vue')
const routes = [
{ path: '/', component: Home },
{ path: '/about', component: About }
]
const router = createRouter({
history: createWebHistory(),
routes
})
export default router
</script>
- 例子二
const ComponentA = () => import('./ComponentA.vue');
export default {
components: {
ComponentA: ComponentA,
},
}
以下是一些常规的日常编码规范
- 合理使用 Vue 的内置指令和组件,避免引入不必要的第三方库。
- 合理使用 Vue 的生命周期函数,对组件的生命周期进行管理,避免不必要的渲染和内存泄漏。
- 尽量避免使用 Vue 中的 $nextTick() 方法,因为它会引起一次额外的渲染。
- 使用 v-cloak 指令可以避免在数据加载时显示未渲染的模板代码。
- 在遍历列表时,应该给每一项添加唯一的 key 属性,以便 Vue 可以识别和复用已渲染的元素。
- 在使用自定义事件时,应该使用 off 方法来添加和移除事件监听器,避免内存泄漏问题。