当前位置: 首页 > news >正文

2025 vue3面试题汇总,通俗易懂

一、基础概念与核心特性

1. Vue3 相比 Vue2 的改进(通俗版)

问题:Vue3 比 Vue2 好在哪?
答案

  • 更快
    • Proxy 代理:Vue2 的响应式像“逐个监听保险箱”(每个属性单独监听),Vue3 的 Proxy 像“直接监控整个房间”(监听整个对象变化)。
    • 编译优化:Vue3 在编译阶段标记哪些是动态内容(如 {{ count }}),更新时跳过静态内容(如纯文字)。
  • 更小:通过 Tree-shaking(摇树优化),只打包你用到的功能,减少代码体积。
  • 更好用
    • Composition API:像搭积木一样组合逻辑(比如把“计数器逻辑”抽成函数,多个组件复用)。
    • 新组件
      • <Teleport>:把组件渲染到任意位置(比如弹窗放到 body 下,避免被父组件样式影响)。
      • <Suspense>:优雅处理异步加载(比如数据加载时显示 Loading 动画)。

2. Composition API vs Options API(场景对比)

问题:为什么要用 Composition API?
答案

  • Options API(Vue2 风格)

    • 把代码按类型分块(data、methods、生命周期),适合简单组件。
    • 缺点:逻辑分散,比如一个“搜索功能”的 data、methods 可能分布在多处。
    // Options API 示例  
    export default {  data() { return { keyword: '' } },  methods: { search() { ... } },  mounted() { this.search() }  
    }  
    
  • Composition API(Vue3 风格)

    • setup() 中,按功能组织代码(比如把搜索相关的数据、方法写在一起)。
    • 优点:逻辑复用更方便(类似 React Hooks)。
    // Composition API 示例  
    export default {  setup() {  const keyword = ref('');  const search = () => { ... };  onMounted(search);  return { keyword, search };  }  
    }  
    

二、响应式原理(手绘理解)

3. Vue3 的响应式原理

问题:Vue3 如何实现数据变化自动更新视图?
答案

  • Proxy 代理对象

    • 当你修改数据时,Proxy 会“拦截”操作(比如 obj.a = 1),通知视图更新。
    • 对比 Vue2:Vue2 使用 Object.defineProperty,无法监听新增属性和数组下标变化(必须用 this.$set)。
  • 代码模拟(简化版):

    function reactive(obj) {  return new Proxy(obj, {  get(target, key) {  console.log('读取了', key);  return Reflect.get(target, key);  },  set(target, key, value) {  console.log('更新了', key);  return Reflect.set(target, key, value);  }  });  
    }  
    const obj = reactive({ a: 1 });  
    obj.a = 2; // 触发 set 拦截,更新视图  
    

4. refreactive 的区别(买菜比喻)

问题:什么时候用 ref?什么时候用 reactive
答案

  • ref

    • 用于包装 基本类型(数字、字符串等),因为 Proxy 无法直接监听基本类型。
    • 使用方式:必须通过 .value 访问(就像买菜用袋子装,取菜要打开袋子)。
    const count = ref(0);  
    console.log(count.value); // 0  
    count.value++;  
    
  • reactive

    • 用于包装 对象/数组,可以直接访问属性(就像直接拿菜篮子,不用拆包装)。
    const user = reactive({ name: '张三' });  
    console.log(user.name); // 张三  
    user.name = '李四';  
    
  • 总结

    • 简单值用 ref,复杂对象用 reactive
    • 如果不想写 .value,可以用 toRefs 解构对象(见下文)。

toRefs 是 Vue 3 中用于处理响应式对象的重要工具函数,主要用于将 reactive 对象转换为普通对象,同时确保每个属性都保持响应性。这在解构响应式对象或将其属性传递给子组件时非常有用。

使用场景

  1. 解构响应式对象:直接解构 reactive 对象会失去响应性,而使用 toRefs 可以避免这一问题。
  2. 组件间通信:通过 toRefs 将响应式数据传递给子组件,确保数据在传递过程中仍能保持响应性。

基本用法

import { reactive, toRefs } from 'vue';const state = reactive({foo: 1,bar: 2,
});const stateRefs = toRefs(state);
// stateRefs 的每个属性都是 ref 对象,修改它们的值会触发视图更新stateRefs.foo.value++; // 视图会自动更新

示例代码

解构并保持响应性
<template><div><p>Foo: {{ foo }}</p><p>Bar: {{ bar }}</p><button @click="incrementFoo">Increment Foo</button></div>
</template><script>
import { reactive, toRefs } from 'vue';export default {setup() {const state = reactive({foo: 1,bar: 2,});const { foo, bar } = toRefs(state);function incrementFoo() {foo.value++;}return {foo,bar,incrementFoo,};},
};
</script>
在组合式 API 中使用
import { reactive, toRefs } from 'vue';function useCounter() {const state = reactive({count: 0,});function increment() {state.count++;}return {...toRefs(state),increment,};
}

注意事项

  • 访问方式:返回的对象属性是 ref 对象,在 JavaScript 中需通过 .value 访问;模板中则无需 .value
  • 适用范围:仅适用于 reactive 对象,不支持普通对象或 ref 对象。
  • 性能影响:大量属性可能带来一定性能开销。

总结而言,toRefs 提供了一种便捷的方式来处理响应式对象,尤其在需要解构或传递响应式数据时,能够有效简化逻辑并保持数据的响应性。

三、进阶 API 与实战技巧

5. watchwatchEffect(场景区分)

问题:监听数据变化用哪个?
答案

  • watch

    • 明确监听某个数据,适合精确控制(比如监听搜索关键词变化,触发请求)。
    watch(  keyword,  (newVal) => { fetchData(newVal) },  { immediate: true } // 立即执行一次  
    );  
    
  • watchEffect

    • 自动追踪依赖,适合副作用操作(比如根据多个数据变化更新 DOM)。
    watchEffect(() => {  console.log('关键词和页码变化了:', keyword.value, page.value);  fetchData();  
    });  
    

6. 组件通信:Provide/Inject(跨层级传参)

问题:爷爷组件如何直接传数据给孙子组件?
答案

  • 步骤
    1. 爷爷组件用 provide 提供数据。
    2. 孙子组件用 inject 获取数据。
  • 代码示例
    // 爷爷组件  
    import { provide } from 'vue';  
    setup() {  provide('theme', 'dark'); // 提供数据  
    }  // 孙子组件  
    import { inject } from 'vue';  
    setup() {  const theme = inject('theme', 'light'); // 第二个参数是默认值  return { theme };  
    }  
    

四、性能优化(通俗策略)

7. 如何让 Vue3 应用更快?

答案

  • 代码层面

    • 使用 v-once 标记静态内容(只渲染一次)。
    • v-memo 缓存动态组件(比如表格行,只有 ID 变化时才重新渲染)。
    <div v-for="item in list" :key="item.id" v-memo="[item.id]">  {{ item.name }}  
    </div>  
    
  • 打包优化

    • 按需引入组件库(比如 Element Plus 只导入用到的 Button、Input)。
    • 使用异步组件(懒加载),减少首屏代码体积。
    // 异步加载组件  
    const AsyncComponent = defineAsyncComponent(() => import('./MyComponent.vue'));  
    

五、高频面试代码片段

8. 自定义指令:点击外部关闭弹窗

场景:点击弹窗外部区域关闭弹窗。
代码

// 全局指令 v-click-outside  
app.directive('click-outside', {  mounted(el, { value: callback }) {  el.handler = (e) => {  if (!el.contains(e.target)) callback();  };  document.addEventListener('click', el.handler);  },  unmounted(el) {  document.removeEventListener('click', el.handler);  }  
});  // 使用  
<template>  <div v-click-outside="closeModal">弹窗内容</div>  
</template>  

六、项目经验(回答技巧)

9. 如何回答“封装通用组件”?

示例

  • 场景:封装一个表单组件,支持校验和提交。
  • 步骤
    1. 通过 props 接收表单配置(如字段规则)。
    2. 使用 v-model 绑定每个输入项的值。
    3. 暴露 validate() 方法供父组件调用。
    4. 使用插槽(slot)允许自定义布局。
    <template>  <form @submit.prevent="submit">  <slot></slot>  <button type="submit">提交</button>  </form>  
    </template>  
    <script>  
    export default {  methods: {  validate() { /* 校验逻辑 */ },  submit() { this.$emit('submit'); }  }  
    }  
    </script>  
    

总结

以上内容通过通俗比喻、实际场景和代码示例,拆解了 Vue3 的核心知识点。建议边学边写代码实践,结合 Vue3 官方文档 查漏补缺!

相关文章:

2025 vue3面试题汇总,通俗易懂

一、基础概念与核心特性 1. Vue3 相比 Vue2 的改进&#xff08;通俗版&#xff09; 问题&#xff1a;Vue3 比 Vue2 好在哪&#xff1f; 答案&#xff1a; 更快&#xff1a; Proxy 代理&#xff1a;Vue2 的响应式像“逐个监听保险箱”&#xff08;每个属性单独监听&#xff0…...

一周学会Flask3 Python Web开发-Debug模式开启

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 默认情况&#xff0c;项目开发是普通模式&#xff0c;也就是你修改了代码&#xff0c;必须重启项目&#xff0c;新代码才生效&…...

聚焦于机器人研究,提出 FuSe 方法,通过语言锚定对通用机器人策略进行微调 视觉、触觉、听觉

聚焦于机器人研究,提出 FuSe 方法,通过语言锚定对通用机器人策略进行微调,利用多模态传感器提升性能,在多种任务中表现优异,具备跨模态推理能力。 研究背景:与世界交互需多感官协作,当前先进通用机器人策略多依赖视觉和本体感受数据训练,忽略其他模态信息。方法:FuSe …...

C++ 无锁队列:原理与实现

引言 在多线程编程中&#xff0c;队列是一种常用的数据结构。传统的队列在多线程环境下访问时&#xff0c;通常需要使用锁机制来保证数据的一致性和线程安全。然而&#xff0c;锁的使用会带来性能开销&#xff0c;尤其是在高并发场景下&#xff0c;频繁的加锁和解锁操作可能成…...

web的分离不分离:前后端分离与不分离全面分析

让我们一起走向未来 &#x1f393;作者简介&#xff1a;全栈领域优质创作者 &#x1f310;个人主页&#xff1a;百锦再新空间代码工作室 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[1504566…...

MobileSal:极其高效的RGB-D显著性物体检测模型

摘要 问题一&#xff1a;什么叫做MobileSal&#xff1f; MobileSal 是指一种用于移动设备上的显著性检测&#xff08;Saliency Detection&#xff09;方法&#xff0c;通常是针对在资源受限的环境&#xff08;如智能手机&#xff09;上运行的视觉模型。 问题二&#xff1a;什…...

【个人总结】1. 开发基础 工作三年的嵌入式常见知识点梳理及开发技术要点(欢迎指正、补充)

【个人总结】1. 开发基础 工作三年的嵌入式常见知识点梳理及开发技术要点&#xff08;欢迎指正、补充&#xff09; 工作快三年以来 分别进行了嵌入式MCU及外设开发、RTOS、传感器、文件系统及USB、Linux、GUI、通讯协议、毫米波雷达、少量的DSP和物联网开发。 特此总结&#x…...

硬核技术组合!用 DeepSeek R1、Ollama、Docker、RAGFlow 打造专属本地知识库

文章目录 一、引言二、安装Ollama部署DeepSeekR1三、安装Docker四、安装使用RAGFlow4.1 系统架构4.2 部署流程4.3 使用RAGFlow4.4 在RAGFlow中新增模型4.5 创建知识库4.6 创建私人助理使用RGA 一、引言 本地部署DeepSeek R1 Ollama RAGFlow构建个人知识库&#xff0c;通过将…...

MySQL官网驱动下载(jar包驱动和ODBC驱动)【详细教程】

1.打开MySQL的官网&#xff0c;选择下载(Download) MySQL[这里是图片001]https://www.mysql.com/cn/ 2.往下划点击MySQL Community(GPL)Downloads 3.要下载MySQL的jar包的选择Connector/J 4.进入后&#xff0c;根据自己的需求选择相应的版本 5.下载完成后&#xff0c;进行解压…...

idea 2019.3常用插件

idea 2019.3常用插件 文档 idea 2019.3常用插件idea 2023.3.7常用插件 idea 2019.3常用插件 插件名称插件版本说明1AceJump3.5.9AceJump允许您快速将插入符号导航到编辑器中可见的任何位置。只需按“ctrl&#xff1b;”&#xff0c;键入一个字符&#xff0c;然后在Ace Jump…...

对CSS了解哪些?

CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式表&#xff09;是用来描述HTML文档外观和布局的语言。以下是对CSS的常见了解范围&#xff1a; 1. CSS 基础 选择器&#xff1a;如通用选择器 (*)、类型选择器、类选择器 (.class)、ID选择器 (#id)、后代选择器、伪类…...

TikTok账户安全指南:如何取消两步验证?

TikTok账户安全指南&#xff1a;如何取消两步验证&#xff1f; 在这个数字化的时代&#xff0c;保护我们的在线账户安全变得尤为重要。TikTok&#xff0c;作为全球流行的社交媒体平台&#xff0c;其账户安全更是不容忽视。两步验证作为一种增强账户安全性的措施&#xff0c;虽…...

从零到一:构建现代 React 应用的完整指南

1. create-react-app (CRA) 简介: create-react-app 是官方推荐的 React 项目脚手架工具,提供了一个开箱即用的开发环境,帮助开发者快速启动 React 应用。它会自动配置 Webpack、Babel、ESLint 等工具,让你专注于开发而不需要手动配置工具链。 特点: 零配置:CRA 自动配…...

【Python爬虫(26)】Python爬虫进阶:数据清洗与预处理的魔法秘籍

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…...

机器学习数学基础:28.卡方检验

卡方检验教程 一、引言 在统计学的广阔领域中&#xff0c;卡方检验&#xff08;Chi - Square Test&#xff09;宛如一把锐利的手术刀&#xff0c;能够精准剖析数据背后隐藏的关系与模式。它主要用于两大核心任务&#xff1a;一是深入分析两个及两个以上分类变量之间错综复杂的…...

【工具插件类教学】实现运行时2D物体交互的利器Runtime2DTransformInteractor

目录 ​编辑 1. 插件核心功能 1.1 基础变换操作 1.2 高级特性 2. 安装与配置 2.1 导入插件 2.2 配置控制器参数 2.3 为物体添加交互功能 3. 使用示例 3.1 基础操作演示 3.2 多选与批量操作 3.3 自定义光标与外观 4. 高级配置技巧 4.1 动态调整包围框控件尺寸 4.…...

回调处理器

文章目录 什么是回调处理器回调处理器的工作流程回调处理器的使用自定义链组件中的回调 内置回调处理器自定义回调处理器 在编程领域中&#xff0c;回调是一个非常重要的概念。简而言之&#xff0c;回调是一种特殊的函数或方法&#xff0c;它可以被传递给另一个函数作为参数&am…...

Redis-03高级篇中-多级缓存:

说明&#xff1a; 分布式缓存和多级缓存的视频&#xff0c;与springcloud高级篇redis的一模一样。这里就不在重复学习了&#xff0c;如果后面用到关于redis的配置&#xff0c;直接到springcloud模块安装的redis中学习即可。 多级缓存 0.学习目标 1.什么是多级缓存 传统的缓…...

Spring Boot ShardingJDBC分库分表(草稿)

ShardingJDBC分库分表 1.Maven 引用 <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.1.1</version></dependency><dependency><…...

Jenkins 环境搭建---基于 Docker

前期准备 提前安装jdk、maven、nodeJs&#xff08;如果需要的话&#xff09; 创建 jenkins 环境目录&#xff0c;用来当做挂载卷 /data/jenkins/ 一&#xff1a;拉取 Jenkins 镜像 docker pull jenkins/jenkins:lts 二&#xff1a;设置 Jenkins挂载目录 mkdir -p ~/jen…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...