【Vue.js】1668- 初中级前端必须掌握的 10 个 Vue 优化技巧

news2024/12/26 11:51:26

86ddfde191245d5bfdb50fd603246e0b.jpeg

优化 Vue.js 应用性能是每个前端开发人员都需要关注的问题。本文我将分享 10 个初中级前端必须掌握的 Vue.js 优化技巧,无论您是正在学习 Vue.js,还是已经在应用开发中使用它,希望这些技巧都会对你的工作有所帮助。

1. 优雅的设置 v-for 中的 key

文档地址:https://vuejs.org/api/built-in-directives.html#v-for

v-for 中使用 key 是非常重要的,因为它可以让 Vue 更好地跟踪每个元素的状态和位置。

当元素的顺序发生变化时,没有 key 会导致性能下降,因为 Vue 需要重新生成元素。为了优雅地设置 key,可以从数据中提取一个「唯一属性」作为 key 值。下面是示例代码:

<template v-for="(item, index) in items" :key="item.id">
  <div>{{ item.title }}</div>
</template>

如果没有 item.id 这类唯一属性,可以考虑使用 index 作为 key 值。

需要注意的是,在需要做增加和删除数据这类操作时,尽量不要使用 index 作为 key 值,这会导致页面数据出现异常。

2. 合理的使用 v-if 和 v-show

文档地址:https://vuejs.org/guide/essentials/conditional.html#v-if-vs-v-show

v-ifv-show 都可以控制元素的显示和隐藏,但是它们的使用场景不同。

  • v-if 适用于「需要频繁切换」的场景,切换时组件内事件监听和子组件都会被销毁并且重建;

  • v-show 适用于「不需要频繁切换」的场景,无论初始条件如何,都会被渲染,只是控制元素的 CSS display 属性开控制是否显示;

总的来说,v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。因此,如果需要频繁切换,则使用 v-show 较好;如果在运行时绑定条件很少改变,则 v-if 会更合适。下面是示例代码:

<!-- 使用 v-if -->
<template v-if="show">
  <div>{{ message }}</div>
</template>

<!-- 使用 v-show -->
<template>
  <div v-show="show">{{ message }}</div>
</template>

3. 适当使用 KeepAlive 缓存组件状态

文档地址:https://vuejs.org/guide/built-ins/keep-alive.html#keepalive

KeepAlive 是一个内置组件,可以缓存组件的状态,避免重复渲染和提高页面响应速度。在多个组件间动态切换时缓存被移除的组件实例。

但是,如果不适当使用 KeepAlive,可能会导致内存泄漏和其他问题。因此,在使用 KeepAlive 时,需要注意其使用场景,并及时销毁缓存的组件。下面是示例代码:

<template>
  <keep-alive>
    <router-view v-if="$route.meta.keepAlive"></router-view>
  </keep-alive>
</template>

另外 KeepAlive 也支持配置「最大缓存实例数」,来限制可被缓存的最大组件实例数。如果缓存的实例数量即将超过指定的那个最大数量,则最久没有被访问的缓存实例将被销毁,以便为新的实例腾出空间。

下面是示例代码:

<KeepAlive :max="10">
  <component :is="activeComponent" />
</KeepAlive>

4. 及时的销毁事件

文档地址:https://vuejs.org/api/composition-api-lifecycle.html#onbeforeunmount

在组件中使用了「事件监听器」「定时器」「异步操作」等,需要及时销毁防止出现内存泄漏。

在 Vue3 中,提供了 setup 函数,可以使用 onBeforeUnmount 钩子来销毁事件等资源。下面是示例代码:

import { onBeforeUnmount } from "vue";

export default {
  setup() {
    let timer;
    const startTimer = () => {
      timer = setInterval(() => {
        console.log("timer is running");
      }, 1000);
    };
    const stopTimer = () => {
      clearInterval(timer);
    };
    onBeforeUnmount(() => {
      stopTimer();
    });
    return {
      startTimer,
      stopTimer,
    };
  },
};

5. 注意体积优化

Vue3 的体积比较大,需要注意优化体积。可以通过配置打包工具,只打包需要的模块,「按需引入第三方库」等方式来实现体积优化。

另外,可以使用基于 Tree Shaking 的优化工具,如 PurgeCSS、Babel Minify 和 UglifyJS 等,来进一步压缩代码。下面是示例代码:

// vue.config.js
module.exports = {
  configureWebpack: {
    optimization: {
      splitChunks: {
        chunks: "all",
        minSize: 20000,
        maxSize: 0,
        minChunks: 1,
        maxAsyncRequests: 30,
        maxInitialRequests: 30,
        automaticNameDelimiter: "~",
        cacheGroups: {
          vendors: {
            test: /[\\/]node_modules[\\/]/,
            priority: -10,
          },
          default: {
            minChunks: 2,
            priority: -20,
            reuseExistingChunk: true,
          },
        },
      },
    },
  },
};

6. 多利用 EventBus 进行业务解耦

EventBus 可以实现组件之间的通信,解耦组件之间的关系。主要使用事件的发布和订阅来实现,当然也可以使用全局状态管理工具,如 Vuex 来实现。

使用 EventBus 时,需要注意事件名称的命名、尽量避免多个组件监听同一事件等问题。下面是示例代码:

// event-bus.js
import mitt from "mitt";

export const eventBus = mitt();

// component.js
export default {
  mounted() {
    eventBus.on("foo", this.handleFoo);
  },
  methods: {
    handleFoo() {
      // do something
    },
  },
  beforeUnmount() {
    eventBus.off("foo", this.handleFoo);
  },
};

// other-component.js
export default {
  mouted() {
    eventBus.emit("foo");
  },
};

7. 动态组件解决 if-else 过多的问题

if-else 逻辑过于复杂时,可以使用动态组件来实现,避免代码的臃肿和可读性的下降。使用动态组件的方式可以使得代码组织更加清晰,可以复用组件并避免代码冗长。下面是示例代码:

<template>
  <component :is="componentName"></component>
</template>
<script>
import Foo from "./Foo.vue";
import Bar from "./Bar.vue";

export default {
  data() {
    return {
      componentName: "",
    };
  },
  mounted() {
    if (condition) {
      this.componentName = "Foo";
    } else {
      this.componentName = "Bar";
    }
  },
  components: {
    Foo,
    Bar,
  },
};
</script>

8. 使用异步组件实现延迟加载

文档地址:https://vuejs.org/guide/components/async.html#async-components

异步组件可以实现「延迟加载」「减少组件的加载时间」「提高页面响应速度」。Vue3 原生支持异步组件的加载,可以使用 import() 语法来实现。代码示例如下:

// 正常导入
import Foo from "./Foo.vue";

// 异步导入
import { defineAsyncComponent } from "vue";

const AsyncComp = defineAsyncComponent(() => import("./Foo.vue"));

9. 使用 computed 和 watch 减少多余的渲染或重复计算

文档地址:https://vuejs.org/api/reactivity-core.html

使用 computedwatch 可以「减少多余的渲染或重复计算」

computed 可以「缓存计算结果」,当响应式数据变化时,只有依赖的数据发生变化时才会重新计算。watch 可以「监听一个或多个响应式数据源变化并执行相应操作」,避免手动监听数据变化。

下面是示例代码:

<template>
  <div>{{ fullName }}</div>
</template>
<script>
export default {
  data() {
    return {
      firstName: "John",
      lastName: "Doe",
    };
  },
  computed: {
    fullName() {
      return this.firstName + " " + this.lastName;
    },
  },
  watch: {
    firstName(newValue, oldValue) {
      console.log("firstName", newValue, oldValue);
    },
    lastName(newValue, oldValue) {
      console.log("lastName", newValue, oldValue);
    },
  },
};
</script>

10. 使用 v-slot 优化作用域插槽

文档地址:https://vuejs.org/api/built-in-directives.html#v-slot

「作用域插槽」(也称为「具名插槽」)可以将父组件的数据传递给子组件,并渲染子组件。但是,当作用域插槽内容过多时,可能会导致代码难以维护。因此,可以使用 v-slot 语法(Vue2 中称为 slot-scope)来优化作用域插槽。

v-slot 允许将作用域插槽的名称定义在模板中,从而使得代码更明确和易于阅读。下面是示例代码:

<template>
  <my-component>
    <template v-slot:title="{ name }"> {{ name }}'s Title </template>
  </my-component>
</template>

<!-- Vue 2 中的语法 -->
<my-component>
  <template slot-scope="{ name }"> {{ name }}'s Title </template>
</my-component>

通过使用 v-slot,我们可以在模板中明确作用域插槽的名称和内容,避免了组件的混乱。

总结

希望本文介绍的 10 个优化技巧能够帮助你更好的使用 Vue.js。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/479439.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 中常见的 Exception 有哪些

Java 是一种广泛使用的编程语言&#xff0c;它的强大和流行程度在很大程度上归功于它的异常处理机制。异常是在程序执行期间出现的错误或意外情况。在 Java 中&#xff0c;异常是通过抛出和捕获异常对象来处理的。在本文中&#xff0c;我们将介绍 Java 中的一些常见异常类型及其…

浅堆深堆解读

浅堆&#xff08;Shallow Heap&#xff09; 浅堆是指一个对象所消耗的内存。在32位系统中&#xff0c;一个对象引用会占据4个字节&#xff0c;一个int类型会占据4个字节&#xff0c;long型变量会占据8个字节&#xff0c;每个对象头需要占用8个字节。根据堆快照格式不同&#x…

【STM32】知识补充 深入探讨预分频器

【STM32】知识补充 深入探讨预分频器 概述分频器是什么工作原理计数器预分频器触发器预分频器模数计数器预分频器上升沿和下降沿 应用场景微控制器时钟预分频通信系统中的频率合成计时器与 PWM 波形生成数字电路设计中的同步与计时 预分频器实现方法硬件预分频器软件预分频器 案…

Swift之深入解析如何使用和自定义高级运算符

一、前言 在我之前的博客 Swift之深入解析如何自定义操作符 介绍了“基本运算符”&#xff0c;Swift 还提供了数种可以对数值进行复杂运算的高级运算符&#xff0c;它们包含了在 C 和 Objective-C 中已经被大家所熟知的位运算符和移位运算符。与 C 语言中的算术运算符不同&…

【flask】理解flask的几个难点,难啃的骨头,线程隔离啥的

1.三种路由和各自的比较 2.配置文件所有的字母必须大写 3.if __name__的作用 4.核心对象循环引用的几种解决方式–难 5.Flask的经典错误 6.上下文管理器 7.flask的多线程和线程隔离 三种路由 方法1&#xff1a;装饰器 python C#, java 都可以用这种方式 from flask import F…

SSM整合(三) | 异常处理器 - 项目异常的处理方案

文章目录 异常处理器异常处理器快速入门项目异常处理 异常处理器 异常处理器快速入门 程序开发过程中不可避免的会遇到异常现象 出现异常现象的常见位置与常见原因如下&#xff1a; 框架内部抛出的异常&#xff1a;因使用不规范导致 数据层抛出的异常&#xff1a;因外部服务器…

使用Statsmodel进行假设检验和线性回归

如果你使用 Python 处理数据&#xff0c;你可能听说过 statsmodel 库。Statsmodels 是一个 Python 模块&#xff0c;它提供各种统计模型和函数来探索、分析和可视化数据。该库广泛用于学术研究、金融和数据科学。在本文中&#xff0c;我们将介绍 statsmodel 库的基础知识、如何…

【技巧】Excel序号设置自动更新

做Excel表格的时候&#xff0c;我们经常需要设置序号&#xff0c;在输入序号的时候&#xff0c;你是不是这样做&#xff1f;手动输入序号1&#xff0c;再向下填充&#xff0c;当遇到有不想要的内容&#xff0c;点删除后&#xff0c;发现中间的序号就不连贯了&#xff0c;再手动…

二十五、OSPF高级技术——开销值、虚链路、邻居建立、LSA、多进程

文章目录 调试指令&#xff08;三张表&#xff09;1、邻居表&#xff1a;dis ospf peer brief2、拓扑表&#xff08;链路状态数据库&#xff09;&#xff1a;dis ospf lsdb3、路由表&#xff1a;dis ip routing-table 一、OSPF 开销值/度量值&#xff08;cost&#xff09;1、co…

代码审计笔记之开篇

思想 代码审计是从软件测试发展而来&#xff0c;早起一般采用常规软件测试与渗透测试的手段来发现源码漏洞&#xff0c;但是随着软件规模的越来越大&#xff0c;架构越来越复杂&#xff0c;安全漏洞和后门也越来越多越来越隐蔽&#xff0c;这使得传统的软件测试方法很难检出源…

【Java入门合集】第二章Java语言基础(一)

【Java入门合集】第二章Java语言基础&#xff08;一&#xff09; 博主&#xff1a;命运之光 专栏JAVA入门 学习目标 掌握变量、常量、表达式的概念&#xff0c;数据类型及变量的定义方法&#xff1b; 掌握常用运算符的使用&#xff1b; 掌握程序的顺序结构、选择结构和循环结构…

C/C++每日一练(20230501)

目录 1. 对链表进行插入排序 &#x1f31f;&#x1f31f; 2. 找出小于平均值的数 ※ 3. 二叉树的最大深度 &#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 对链表进行…

【五一创作】Apollo(入门)

Apollo(入门) Quick Start 配置中心是一种统一管理各种应用配置的基础服务组件 Apollo&#xff08;阿波罗&#xff09;是携程框架部门研发的分布式配置中心&#xff0c;能够集中化管理应用不同环境、不同集群的配置&#xff0c;配置修改后能够实时推送到应用端&#xff0c;并且…

Springboot 实战一个依赖解决XSS攻击

1. 什么是XSS介绍 XSS: Cross Site Scripting&#xff0c;为不和层叠样式表(Cascading Style Sheets, CSS) 的缩写混淆&#xff0c;故将跨站脚本攻击缩写为XSS。 恶意攻击者往Web页面里插入恶意Script代码&#xff0c;当用户浏览该页之时&#xff0c;嵌入其中 Web里面的Scrip…

【高并发】并发数据结构与多核编程

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于多处理器编程的艺术进行的&#xff0c;每个知识点的修正和深入主要…

【JavaEE初阶】认识线程(Thread)

目录 &#x1f33e; 前言 &#x1f33e; 了解线程 &#x1f308;1.1 线程是什么&#xff1f; &#x1f308;1.2 一些基本问题 &#x1f33e;2、创建线程的方式 &#x1f308; 2.1 继承Thread类 &#x1f308; 2.2 实现Runnable接口并重写run()方法 &#x1f308; 注意…

有哪些好的学习方法?学霸们自己在用,却不愿意透露的

临近期末,很多家长都在跟我咨询,怎么才能提升孩子的学习效率? 原因就是,每天看着自己的孩子学习到深夜,但不少内容还是记不住, 学习和复习的效果非常的不理想。 今天,给大家分享的方法,是我自己一直也都在用的方法,效果非常的棒。 学长Ron,江苏某省重点高中毕业,高…

给公司搭建一个人才库系统,前台(信息填写+简历上传)后台(筛选功能+下载简历)

首先指出目前代码的不足之处&#xff1a; 如果公司使用&#xff0c;代码还存在风险问题&#xff0c;需要增加防火墙、防PHP攻击、后台加验证等操作 以下指南&#xff1a; 1.Mod Security 和 Fail2Ban 是开源的安全软件&#xff0c;您可以在宝塔面板上安装和配置这些软件来增强您…

【JUC】ThreadLocal

【JUC】ThreadLocal 文章目录 【JUC】ThreadLocal1. 概述2. Thread、ThreadLocal、ThreadLocalMap 关系2.1 Thread 和 ThreadLocal2.2 ThreadLocal 和 ThreadLocalMap2.3 三者之间的关系 1. 概述 ThreadLocal 提供线程局部变量。这些变量与正常的变量不同&#xff0c;因为每一…

Java 基础入门篇(一)—— Java 概述

文章目录 一、Java 概述二、Java 的产品 JDK2.1 JDK 安装2.2 Java与 Javac 介绍2.3 Java 程序的开发步骤 三、Java 程序的执行原理四、JDK 的组成五、Java 的跨平台工作原理 一、Java 概述 Java 是 sun 公司在 1995 年推出的一门计算机高级编程语言&#xff0c;其语言风格接近人…