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 官方文档 查漏补缺!

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

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

相关文章

第5章:在LangChain中如何使用AI Services

这篇文章详细介绍了 LangChain4j 中的 AI Services 概念&#xff0c;展示了如何通过高层次的抽象来简化与大语言模型&#xff08;LLM&#xff09;的交互。AI Services 的核心思想是隐藏底层复杂性&#xff0c;让开发者专注于业务逻辑&#xff0c;同时支持聊天记忆、工具调用和 …

二叉树(数据结构)

二叉树 二叉树也是用过递归定义的结构 先序遍历又称前序遍历 ​​ ​​ 按照先序遍历的方法去手算处理这个二叉树 ​​ 先A B C 再 A B D E C&#xff08;也就是把B换成BDE再放进去&#xff09; 再 A B D E C F 看这个插入的方法要掌握像二叉树这样向一个…

机器学习笔记——常用损失函数

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本笔记介绍机器学习中常见的损失函数和代价函数&#xff0c;各函数的使用场景。 热门专栏 机器学习 机器学习笔记合集 深度学习 深度学习笔记合集 文章目录 热门…

Wireshark使用介绍

文章目录 Wireshark介绍Wireshark使用工作模式介绍1. 混杂模式&#xff08;Promiscuous Mode&#xff09;2. 普通模式&#xff08;Normal Mode&#xff09;3. 监视模式&#xff08;Monitor Mode&#xff09; 界面分区捕获过滤器语法基本语法逻辑运算符高级语法使用示例捕获过滤…

#渗透测试#批量漏洞挖掘#畅捷通T+SQL注入漏洞

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 一、漏洞全景解析 1. 高危漏洞案例库 2.…

【小游戏】C++控制台版本俄罗斯轮盘赌

制作团队&#xff1a;洛谷813622&#xff08;Igallta&#xff09; 989571&#xff08;_ayaka_&#xff09; Mod&#xff1a;_ayaka_ 双人模式&#xff1a;Igallta 公告&#xff1a; 原先的9.8改名为 Alpha 1.0&#xff0c;以后每次更新都增加 0.1。 Alpha 1.11 改为 Beta 1…

nvm安装、管理node多版本以及配置环境变量【保姆级教程】

引言 不同的项目运行时可能需要不同的node版本才可以运行&#xff0c;由于来回进行卸载不同版本的node比较麻烦&#xff1b;所以需要使用node工程多版本管理。 本人在配置时&#xff0c;通过网络搜索教程&#xff0c;由于文章时间过老&#xff0c;或者文章的互相拷贝导致配置时…

框架--Mybatis3

一.特殊符号处理 < < > > " &quot; &apos; & &amp; 除了可以使用上述转义字符外&#xff0c;还可以使<![CDATA[ ]]>用来包裹特殊字符。 二.mybatis 一级缓存二级缓存 1.为什么缓存 缓存&#xff1a;数据缓存&#xf…

纯新手教程:用llama.cpp本地部署DeepSeek蒸馏模型

0. 前言 llama.cpp是一个基于纯C/C实现的高性能大语言模型推理引擎&#xff0c;专为优化本地及云端部署而设计。其核心目标在于通过底层硬件加速和量化技术&#xff0c;实现在多样化硬件平台上的高效推理&#xff0c;同时保持低资源占用与易用性。 最近DeepSeek太火了&#x…

Netty入门详解

引言 Netty 是一个基于 Java 的高性能、异步事件驱动的网络应用框架&#xff0c;用于快速开发可维护的高性能网络服务器和客户端。它提供了一组丰富的 API&#xff0c;使得开发人员能够轻松地处理各种网络协议&#xff0c;如 TCP、UDP 等&#xff0c;并且支持多种编解码方式&a…

物联网简介集合

物联网&#xff08;IoT&#xff09;指的是物理设备&#xff08;如电器和车辆&#xff09;之间的互联互通。这些设备嵌入了软件、传感器和连接功能&#xff0c;使其能够相互连接并交换数据。这项技术实现了从庞大的设备网络中收集和共享数据&#xff0c;为打造更高效、自动化的系…

【分布式理论11】分布式协同之分布式事务(一个应用操作多个资源):从刚性事务到柔性事务的演进

文章目录 一. 什么是分布式事务&#xff1f;二. 分布式事务的挑战三. 事务的ACID特性四. CAP理论与BASE理论1. CAP理论1.1. 三大特性1.2. 三者不能兼得 2. BASE理论 五. 分布式事务解决方案1. 两阶段提交&#xff08;2PC&#xff09;2. TCC&#xff08;Try-Confirm-Cancel&…

【Quest开发】全身跟踪

软件&#xff1a;Unity 2022.3.51f1c1、vscode、Meta XR All in One SDK V72 硬件&#xff1a;Meta Quest3 最终效果&#xff1a;能像meta的操作室沉浸场景一样根据头盔移动来推断用户姿势&#xff0c;实现走路、蹲下、手势匹配等功能 需要借助UnityMovement这个包 GitHub …

AI全栈开发_人工智能AI大模型 Prompt提示词工程详解(全方位介绍及运用)

AI引领的第四次工业革命正席卷而来&#xff0c;如何精准把握这一历史性的机遇&#xff0c;将成为我们这一代人不容忽视且需深入思考与积极行动的重要课题。未来几年AI将会像计算机一样快速普及&#xff0c;面对这一历史性的第一波红利&#xff0c;你是否已准备好把握机遇&#…

小米平板怎么和电脑共享屏幕

最近尝试使用小米平板和电脑屏幕分屏互联 发现是需要做特殊处理的&#xff0c;需要下载一款电脑安装包&#xff1a;小米妙享 关于这个安装包&#xff0c;想吐槽的是&#xff1a; 没有找到官网渠道&#xff0c;是通过其他网络方式查到下载的 不附录链接&#xff0c;原因是因为地…

java | MyBatis-plus映射和golang映射对比

文章目录 Java实体类和数据库的映射1.默认驼峰命名规则2.自定义字段映射3.关闭驼峰命名规则4.JSON序列化映射 Golang1. 结构体与表的映射2. 字段与列的映射3. 关联关系映射4. 其他映射相关标签 这篇也是做数据库映射方面的对比&#xff1a; Java 实体类和数据库的映射 1.默认…

讯方·智汇云校华为官方授权培训机构

1.官方授权 讯方智汇云校是华为领先级授权培训机构&#xff08;华为授权培训合作伙伴&#xff08;HALP&#xff09;体系&#xff0c;分为认证、优选、领先三个等级&#xff0c;领先级是HALP最高级&#xff09;&#xff0c;代表着华为对培训合作伙伴在专业能力、师资队伍、合作…

避免踩雷!CUDA与Anaconda兼容性配置完全手册

CUDA与Anaconda深度学习环境配置指南 目录 核心概念解析安装场景分析版本冲突处理最佳实践指南常见问题解答 核心概念解析 1. 组件对比表 组件作用域包含内容查看方式NVIDIA驱动系统级GPU底层通信支持nvidia-smiCUDA Toolkit系统级完整开发工具链(nvcc等)nvcc --versioncon…

掌握.NET Core后端发布流程,如何部署后端应用?

无论你是刚接触.NET Core的新手还是已有经验的开发者&#xff0c;在这篇文章中你将会学习到一系列实用的发布技巧与最佳实践&#xff0c;帮助你高效顺利地将.NET Core后端应用部署到生产环境中 目录 程序发布操作 Docker容器注册表 文件夹发布 导入配置文件 网站运行操作 …

一周学会Flask3 Python Web开发-request请求对象与url传参

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili request请求对象封装了从客户端发来的请求报文信息&#xff0c;我们可以从中获取所有数据。 request对象包含的常用属性&…