Vue 3 面试全攻略:深度剖析与实战示例

news2025/1/10 17:04:59

Vue 3 面试全攻略:深度剖析与实战示例

在前端开发的浪潮中,Vue 3 以其卓越的性能和强大的功能,成为众多开发者的首选框架。在面试中,对 Vue 3 的深入理解和掌握至关重要。以下是 Vue 3 面试中可能涉及的详细知识,并结合代码进行说明。

一、Composition API

1. setup 函数

  • 功能介绍:在 Vue 3 中,setup函数是组件的新入口点,它在组件实例创建之前执行,可以用于初始化响应式数据、定义方法等。
  • 代码示例
<template>
  <div>{{ message }}</div>
</template>

<script>
import { ref } from 'vue';
export default {
  setup() {
    const message = ref('Hello, Vue 3!');
    return {
      message
    };
  }
};
</script>

2. 响应式数据

  • ref 和 reactive:Vue 3 引入了refreactive函数来创建响应式数据。ref用于创建单个值的响应式数据,而reactive用于创建对象类型的响应式数据。
  • 代码示例
<template>
  <div>
    <p>Count: {{ count }}</p>
    <p>Person: {{ person.name }}</p>
    <button @click="increment">Increment</button>
    <button @click="changePersonName">Change Person Name</button>
  </div>
</template>

<script>
import { ref, reactive } from 'vue';
export default {
  setup() {
    const count = ref(0);
    const increment = () => {
      count.value++;
    };
    const person = reactive({
      name: 'John',
    });
    const changePersonName = () => {
      person.name = 'Jane';
    };
    return {
      count,
      increment,
      person,
      changePersonName
    };
  }
};
</script>

二、Teleport

1. 基本用法

  • 功能介绍Teleport允许将一个组件的模板内容渲染到指定的 DOM 节点,而不是组件自身的挂载点。这对于创建模态框、弹出窗口等需要脱离组件层级结构的元素非常有用。
  • 代码示例
<template>
  <button @click="openModal">Open Modal</button>
  <Teleport to="body">
    <div v-if="showModal" class="modal">
      <p>This is a modal.</p>
      <button @click="closeModal">Close Modal</button>
    </div>
  </Teleport>
</template>

<script>
import { ref } from 'vue';
export default {
  setup() {
    const showModal = ref(false);
    const openModal = () => {
      showModal.value = true;
    };
    const closeModal = () => {
      showModal.value = false;
    };
    return {
      showModal,
      openModal,
      closeModal
    };
  }
};
</script>

2. 动态目标

  • 功能介绍Teleport的目标可以是动态的,可以根据条件或属性值来确定渲染的位置。
  • 代码示例
<template>
  <button @click="toggleTarget">Toggle Target</button>
  <Teleport :to="target">
    <div class="content">
      <p>This content will be teleported to the target.</p>
    </div>
  </Teleport>
</template>

<script>
import { ref } from 'vue';
export default {
  setup() {
    const target = ref('body');
    const toggleTarget = () => {
      target.value = target.value === 'body'? '#container' : 'body';
    };
    return {
      target,
      toggleTarget
    };
  }
};
</script>

三、Suspense

1. 异步组件加载

  • 功能介绍Suspense允许在异步加载组件时显示一个加载状态,直到组件加载完成。可以使用async setup函数来返回一个 Promise,以模拟异步组件加载。
  • 代码示例
<template>
  <Suspense>
    <template #default>
      <AsyncComponent />
    </template>
    <template #fallback>
      <p>Loading...</p>
    </template>
  </Suspense>
</template>

<script>
import { defineAsyncComponent } from 'vue';
const AsyncComponent = defineAsyncComponent(() => import('./AsyncComponent.vue'));
export default {
  components: {
    AsyncComponent
  }
};
</script>

2. 多个异步依赖

  • 功能介绍Suspense还可以处理多个异步依赖,如同时加载多个组件或数据。
  • 代码示例
<template>
  <Suspense>
    <template #default>
      <ComponentA />
      <ComponentB />
    </template>
    <template #fallback>
      <p>Loading...</p>
    </template>
  </Suspense>
</template>

<script>
import { defineAsyncComponent } from 'vue';
const ComponentA = defineAsyncComponent(() => import('./ComponentA.vue'));
const ComponentB = defineAsyncComponent(() => import('./ComponentB.vue'));
export default {
  components: {
    ComponentA,
    ComponentB
  }
};
</script>

四、Emits 选项

1. 自定义事件验证

  • 功能介绍:在 Vue 3 中,可以使用emits选项来验证组件触发的自定义事件。可以指定事件名称和参数类型,确保组件的事件触发符合预期。
  • 代码示例
<template>
  <button @click="emitEvent">Emit Event</button>
</template>

<script>
export default {
  emits: ['customEvent'],
  methods: {
    emitEvent() {
      this.$emit('customEvent', 'data');
    }
  }
};
</script>

2. 事件参数验证

  • 功能介绍:可以对事件参数进行更详细的类型验证,如数组、对象等。
  • 代码示例
<template>
  <button @click="emitEventWithArray">Emit Event With Array</button>
</template>

<script>
export default {
  emits: {
    customEvent: (value) => {
      return Array.isArray(value);
    }
  },
  methods: {
    emitEventWithArray() {
      this.$emit('customEvent', [1, 2, 3]);
    }
  }
};
</script>

五、性能优化

1. 懒加载组件

  • 功能介绍:将组件分割成多个小模块,在需要时才进行加载,而不是在一开始就加载所有组件,这样可以减少初始加载的文件体积,加快页面的加载速度。
  • 代码示例
import { defineAsyncComponent } from 'vue'
// 懒加载组件
const LazyComponent = defineAsyncComponent(() => import('./LazyComponent.vue'))
export default {
  components: {
    LazyComponent
  },
  //...其他组件配置
}

2. v-once 指令

  • 功能介绍:只渲染元素和组件一次,随后的重新渲染,元素/组件及其所有的子节点将被视为静态内容并跳过。这可以用于优化那些不需要响应数据变化而更新的组件。
  • 代码示例
<template>
  <div>
    <!-- 只会渲染一次,数据变化时不会重新渲染 -->
    <span v-once>{{ staticText }}</span>
    <button @click="changeText">改变文本</button>
  </div>
</template>

<script>
import { ref } from 'vue'
export default {
  setup() {
    // 定义一个响应式数据
    const staticText = ref('初始文本')
    const changeText = () => {
      // 尝试改变文本,但 v-once 会阻止重新渲染
      staticText.value = '新文本'
    }
    return {
      staticText,
      changeText
    }
  }
}
</script>

3. v-memo 指令

  • 功能介绍:用于记忆组件的子树,通过提供一个依赖项数组,当依赖项没有变化时,v-memo 会跳过子树的重新渲染,从而提高性能。
  • 代码示例
<template>
  <div>
    <!-- 只有当 deps 数组中的值变化时,才会重新渲染内部内容 -->
    <div v-memo="[data]">
      <p>{{ data }}</p>
    </div>
    <button @click="updateData">更新数据</button>
  </div>
</template>

<script>
import { ref } from 'vue'
export default {
  setup() {
    // 定义一个响应式数据
    const data = ref('旧数据')
    const updateData = () => {
      // 更新数据
      data.value = '新数据'
    }
    return {
      data,
      updateData
    }
  }
}
</script>

4. 使用 provide/inject 优化跨层级组件通信

  • 功能介绍:在 Vue 3 中,provide 和 inject 可以用于在组件树中进行跨层级的依赖注入,避免了通过 props 层层传递数据的繁琐过程,减少不必要的组件重新渲染。
  • 代码示例
// 父组件
import { provide, ref } from 'vue'
export default {
  setup() {
    // 提供的数据
    const theme = ref('light')
    provide('theme', theme)
    //...其他逻辑
  }
}
// 子组件
import { inject } from 'vue'
export default {
  setup() {
    // 注入数据
    const theme = inject('theme')
    // 根据注入的主题进行相关操作
    //...
  }
}

5. 优化计算属性

  • 功能介绍:计算属性会基于它的响应式依赖进行缓存,只有在相关依赖发生改变时才会重新计算。避免在模板中使用复杂的表达式,将其提取为计算属性,可以提高性能和代码的可读性。
  • 代码示例
<template>
  <div>
    <p>计算结果: {{ computedResult }}</p>
  </div>
</template>

<script>
import { ref, computed } from 'vue'
export default {
  setup() {
    // 定义响应式数据
    const num1 = ref(10)
    const num2 = ref(20)
    // 计算属性,只有 num1 或 num2 变化时才会重新计算
    const computedResult = computed(() => num1.value + num2.value)
    return {
      num1,
      num2,
      computedResult
    }
  }
}
</script>

六、TypeScript 支持

1. 类型声明

  • 功能介绍:Vue 3 提供了更好的 TypeScript 支持,可以在组件中使用类型声明来提高代码的可读性和可维护性。可以使用defineComponent函数来定义组件,并指定组件的属性、方法和事件的类型。
  • 代码示例
<template>
  <div>
    <p>{{ message }}</p>
  </div>
</template>

<script lang="ts">
import { defineComponent } from 'vue';
interface Props {
  message: string;
}
export default defineComponent<Props>({
  props: {
    message: {
      type: String,
      required: true
    }
  }
});
</script>

2. 泛型组件

  • 功能介绍:Vue 3 支持泛型组件,可以创建可重用的组件,同时保留类型安全性。
  • 代码示例
<template>
  <ul>
    <li v-for="item in items" :key="item.id">{{ item.name }}</li>
  </ul>
</template>

<script lang="ts">
import { defineComponent } from 'vue';
interface ListItem {
  id: number;
  name: string;
}
export default defineComponent<ListItem>({
  props: {
    items: {
      type: Array as () => ListItem[],
      required: true
    }
  }
});
</script>

通过对 Vue 3 这些方面的深入理解和掌握,在面试中能够更好地展示自己的技术实力和对 Vue 3 的熟练运用程度。同时,结合实际项目经验,能够更加深入地理解和运用 Vue 3 的强大功能,为前端开发带来更高的效率和更好的用户体验。

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

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

相关文章

宇航用VIRTEX5系列FPGA的动态刷新方法及实现

SRAM型FPGA在宇航领域有广泛的应用&#xff0c;为解决FPGA在空间环境中的单粒子翻转问题&#xff0c;增强设计的可靠性&#xff0c;本文介绍一种低成本的抗辐照解决方案。该方案从外置高可靠存储器中读取配置数据&#xff0c;通过定时刷新结合三模冗余的方式消除单粒子影响&…

03.MPLS静态LSP配置实验

MPLS静态LSP配置实验 1、实验环境2、基础配置开启全局mpls接口下开启mpls配置静态LSP配置FEC从1.1.1.1到3.3.3.3配置FEC从3.3.3.3到1.1.1.13、信息查看查看LFIB表(标签转发信息表)查看FIB表(转发信息表)查看详细FFIB表tracert lsp iptracert -vping lsp ip4、抓包验证1、实…

el-table表格合并某一列

需求&#xff1a;按照下图完成单元格合并&#xff0c;数据展示 可以看到科室列是需要合并的 并加背景色展示&#xff1b;具体代码如下&#xff1a; <el-tableref"tableA":data"tableDataList":header-cell-style"{ backgroundColor: #f2dcdb, col…

PostgreSQL学习笔记(二):PostgreSQL基本操作

PostgreSQL 是一个功能强大的开源关系型数据库管理系统 (RDBMS)&#xff0c;支持标准的 SQL 语法&#xff0c;并扩展了许多功能强大的操作语法. 数据类型 数值类型 数据类型描述存储大小示例值SMALLINT小范围整数&#xff0c;范围&#xff1a;-32,768 到 32,7672 字节-123INTE…

javaEE-网络编程4.TCP回显服务器

目录 TCP流套接字编程 一.API介绍 ServerSocket类 构造方法&#xff1a; ​编辑方法&#xff1a; Socket类 构造方法&#xff1a; 方法&#xff1a; 二、TCP连接 三、通过TCP实现回显服务器 TCP服务端&#xff1a; 1.创建Socket对象 2.构造方法 3.start方法 TCP客…

RIS智能无线电反射面:原理、应用与MATLAB代码示例

一、引言 随着无线通信技术的快速发展,人们对通信系统的容量、覆盖范围、能效以及安全性等方面的要求日益提高。传统的无线通信系统主要通过增加基站数量、提高发射功率和优化天线阵列等方式来提升性能,但这些方法面临着资源有限、能耗高和成本上升等挑战。因此,探索新的无线…

合并模型带来的更好性能

研究背景与问题提出 在人工智能领域&#xff0c;当需要处理多个不同任务时&#xff0c;有多种方式来运用模型资源。其中&#xff0c;合并多个微调模型是一种成本效益相对较高的做法&#xff0c;相较于托管多个专门针对不同任务设计的模型&#xff0c;能节省一定成本。然而&…

城市生命线安全综合监管平台

【落地产品&#xff0c;有需要可留言联系&#xff0c;支持项目合作或源码合作】 一、建设背景 以关于城市安全的重要论述为建设纲要&#xff0c;聚焦城市安全重点领域&#xff0c;围绕燃气爆炸、城市内涝、地下管线交互风险、第三方施工破坏、供水爆管、桥梁坍塌、道路塌陷七…

Flink系列知识讲解之:网络监控、指标与反压

Flink系列知识之&#xff1a;网络监控、指标与反压 在上一篇博文中&#xff0c;我们介绍了 Flink 网络协议栈从高层抽象到底层细节的工作原理。本篇博文是网络协议栈系列博文中的第二篇&#xff0c;在此基础上&#xff0c;我们将讨论如何监控网络相关指标&#xff0c;以识别吞…

生物医学信号处理--随机信号的数字特征

前言 概率密度函数完整地表现了随机变量和随机过程的统计性质。但是信号经处理后再求其概率密度函数往往较难&#xff0c;而且往往也并不需要完整地了解随机变量或过程的全部统计性质只要了解其某些特定方面即可。这时就可以引用几个数值来表示该变量或过程在这几方面的特征。…

计算机网络 (31)运输层协议概念

一、概述 从通信和信息处理的角度看&#xff0c;运输层向它上面的应用层提供通信服务&#xff0c;它属于面向通信部分的最高层&#xff0c;同时也是用户功能中的最低层。运输层的一个核心功能是提供从源端主机到目的端主机的可靠的、与实际使用的网络无关的信息传输。它向高层用…

深度学习张量的秩、轴和形状

深度学习张量的秩、轴和形状 秩、轴和形状是在深度学习中我们最关心的张量属性。 秩轴形状 秩、轴和形状是在深度学习中开始使用张量时我们最关心的三个属性。这些概念相互建立&#xff0c;从秩开始&#xff0c;然后是轴&#xff0c;最后构建到形状&#xff0c;所以请注意这…

积分与签到设计

积分 在交互系统中&#xff0c;可以通过看视频、发评论、点赞、签到等操作获取积分&#xff0c;获取的积分又可以参与排行榜、兑换优惠券等&#xff0c;提高用户使用系统的积极性&#xff0c;实现引流。这些功能在很多项目中都很常见&#xff0c;关于功能的实现我的思路如下。 …

vue实现虚拟列表滚动

<template> <div class"cont"> //box 视图区域Y轴滚动 滚动的是box盒子 滚动条显示的也是因为box<div class"box">//itemBox。 一个空白的盒子 计算高度为所有数据的高度 固定每一条数据高度为50px<div class"itemBox" :st…

IEC61850遥控-增强安全选控是什么?

摘要&#xff1a;遥控服务是IEC61850协议中非常重要的一项服务&#xff0c;其通常会被应用在电源开关、指示灯、档位调节等器件的操作。 遥控是一类比较特殊的操作&#xff0c;其通过远程方式操作指定的设备器件&#xff0c;在一些重要的场景中需要有严谨的机制来进行约束&…

【Uniapp-Vue3】创建自定义页面模板

大多数情况下我们都使用的是默认模板&#xff0c;但是默认模板是Vue2格式的&#xff0c;如果我们想要定义一个Vue3模板的页面就需要自定义。 一、我们先复制下面的模板代码&#xff08;可根据自身需要进行修改&#xff09;&#xff1a; <template><view class"…

如何操作github,gitee,gitcode三个git平台建立镜像仓库机制,这样便于维护项目只需要维护一个平台仓库地址的即可-优雅草央千澈

如何操作github&#xff0c;gitee&#xff0c;gitcode三个git平台建立镜像仓库机制&#xff0c;这样便于维护项目只需要维护一个平台仓库地址的即可-优雅草央千澈 问题背景 由于我司最早期19年使用的是gitee&#xff0c;因此大部分仓库都在gitee有几百个库的代码&#xff0c;…

QThread多线程详解

本文结构如下 文章目录 本文结构如下 1.概述2.开始多线程之旅2.1应该把耗时代码放在哪里&#xff1f;2.2再谈moveToThread() 3.启动线程前的准备工作3.1开多少个线程比较合适&#xff1f;3.2设置栈大小 4.启动线程/退出线程4.1启动线程4.2优雅的退出线程 5.操作运行中的线程5.1…

深度学习数据集有没有规范或指导意见,数据集的建立都需要做哪些研究工作?

一、数据集的核心原则是什么&#xff1f; 数据集的目标&#xff1a;它需要回答“你要解决什么问题&#xff1f;” 在构建数据集之前&#xff0c;最重要的不是去采集数据&#xff0c;而是明确目标&#xff1a; 你的模型是要做图像分类&#xff0c;还是目标检测&#xff1f;是要…

前端for循环遍历——foreach、map使用

title: 前端不同类型的for循环遍历——foreach、map date: 2025-01-04 11:02:17 tags: javascript 前端不同类型的for循环遍历 场景&#xff1a;很多时候后端发来的数据是不能够完全契合前端的需求的&#xff0c;比如你要一个数据对象中的值&#xff0c;但是这个值却作为了ke…