vue2中的优化手段集合

254 阅读4分钟

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.lazySuspense 实现懒加载。

  • 例子一
<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,
  },
}

以下是一些常规的日常编码规范

  1. 合理使用 Vue 的内置指令和组件,避免引入不必要的第三方库。
  2. 合理使用 Vue 的生命周期函数,对组件的生命周期进行管理,避免不必要的渲染和内存泄漏。
  3. 尽量避免使用 Vue 中的 $nextTick() 方法,因为它会引起一次额外的渲染。
  4. 使用 v-cloak 指令可以避免在数据加载时显示未渲染的模板代码。
  5. 在遍历列表时,应该给每一项添加唯一的 key 属性,以便 Vue 可以识别和复用已渲染的元素。
  6. 在使用自定义事件时,应该使用 onon 和 off 方法来添加和移除事件监听器,避免内存泄漏问题。