前端面试 ===> 【Vue3】

Vue3 面试题总结

1. OptionsAPI 与 CompositionAPI 的区别?

  • OptionsAPI
    • 选项式API,通过定义data、computed、watch、method等属性与方法,共同处理页面逻辑;
    • 缺点:
      • 当组件变得复杂的时候,导致对应属性的列表也会增长,可能会导致组件难以阅读和后期维护成本变高;
  • CompositionAPI
    • 组合式API,组件根据逻辑功能来组织,一个功能所定义的所有API会放在一起(高内聚,低耦合);
    • 优点:
      • 内部的功能容易碎片化,像某一个功能相关的数据放在一块,容易阅读和维护(不用翻来翻去找);
      • 将某个逻辑关注点相关的代码全都放在一个函数里,这样,当需要修改一个功能时,就不再需要在文件中跳来跳去;
      • 逻辑复用:
        • 在Vue2中,当混入多个mixin会存在两个非常明显的问题:命名冲突,数据来源不清晰;
        • 而组合式API可以通过编写多个hooks函数就很好的解决了;
  • 总结
    • 在逻辑组织和逻辑复用这方面,组合式API是优于选项式API的;
    • 组合式API中见不到this的使用,减少了this指向不明的情况;
    • 组合式API几乎都是函数,会有更好的类型推断;

2. Vue3中为什么采用 Proxy 代替 definePrototype

  • definePrototype
    • 来劫持整个对象,然后进行深度遍历,给每个属性添加 gettersetter,实现响应式,但是存在以下问题:
      • 检测不到对象属性的添加和删除;
      • 数组API方法无法监听到;
      • 需要对每个属性进行深度遍历,如果是嵌套对象,需要深层次监听,造成性能问题;
  • Proxy
    • 监听整个对象,那么整个对象的所有操作都会进入监听操作;
  • 总结
    • Object.definePrototype 只能遍历对象属性进行劫持;
    • Proxy 直接可以劫持整个对象,便返回一个新对象,我们可以操作新对象达到响应式目的;
    • Proxy 可以直接监听数组的变化;
    • Proxy有13种拦截方法,不限于apply、ownKeys、deleteProperty、has等等,这是Object.defineProperty不具备的;

3. Vue3响应式原理

  • Vue响应式使用的是ES6的ProxyReflect相互配合实现数据响应式,解决了Vue2中试图不能自动更新的问题;
  • Proxy是深度监听,所以可以监听对象和数组内的任意元素,从而可以实现视图实时更新;
  • 响应式大致分为三个阶段:
    • 初始化阶段
      • 初始化阶段通过组件初始化方法形成对应的proxy对象,然后形成一个负责渲染的effct
    • get依赖收集阶段
      • 通过解析template,替换真实data属性,来触发get,然后通过satck方法,通过proxy对象key形成对应的deps,将负责渲染的effect存入deps。(这个过程还有其他的effect,比如watchEffect存入deps中 )。
    • set派发更新阶段
      • 当我们 this[key] = value 改变属性的时候,首先通过trigger方法,通过proxy对象key找到对应的deps,然后给deps分类分成computedRunnerseffect,然后依次执行,如果需要调度的,直接放入调度。

Proxy只会代理对象的第⼀层,那么Vue3⼜是怎样处理这个问题的呢?

  • 判断当前Reflect.get的返回值是否为Object,如果是则再通过 reactive ⽅法做代理, 这样就实现了深度观测。
    监测数组的时候可能触发多次get/set,那么如何防⽌触发多次呢?

  • 我们可以判断key是否为当前被代理对象target⾃身属性,也可以判断旧值与新值是否相等,只有满⾜以上两个条件之⼀时,才有可能执⾏trigger。

4. watch 和 watchEffect 的区别?

  • watchwatchEffect 都是监听器,watchEffect 是一个副作用函数,它们之间的区别有:
  1. watch:既要指明监听数据的源,也要指明监听的回调;
  2. watchEffect:可以自动监听数据源作为依赖,不用指明监听那个数据,监听的回调中用到哪个数据,那就监听哪个数据;
  3. watch 可以访问改变前后的值,watchEffect 只能获取改变后的值;
  4. watch运行的时候 不会立即执行,值改变后才会执行,而watchEffect运行后可立即执行,这一点可以通过watch的配置项immeriate改变;
  5. watchEffect 有点像 computed
    • computed注重的是计算出来的值(回调函数的返回值),所以必须写返回值;
    • watchEffect注重的是过程(回调函数的函数体),所以不用写返回值;
      • watchEffect所指定的回调中用到的数据只要发生变化,则直接重新执行回调;
  6. Vue3与Vue2中的watch配置项一致,但也有两个小坑:
    • 监听reactive定义的响应式数据时,oldVal无法正确获取到,强制开启深度监听,depp配置项失效;
    • 监听reactive定义的响应式数据的某个属性时,deep配置项有效;

5. ref 与 reactive 的区别?

  1. refreactive它们主要用于响应式数据的创建;
  2. ref函数可以接收原始数据类型和引用数据类型;
  3. 使用ref声明的数据,在JS中使用的时候,需要添加.value的后缀;
  4. reactive函数只能接收引用数据类型;
  5. ref底层还是使用reactive来做,ref是在reactive上进行了封装,增强了其能力,使其支持了对原始数据类型的处理;
  6. Vue3中,reactive能做的ref能做,reactive不能做的ref也能做;

6. script setup 是干什么的?

  • script setup是Vue3的语法糖,简化了组合式API的写法,并且运行性能更高,使用script setup语法糖的特点:
  1. 属性和方法无需返回,直接使用;
  2. 引入组件的时候,会自动注册;
  3. 使用defineProse接收父组件传递的值;
  4. 使用useAttrs获取属性,useSlots获取插槽,defineEmits获取自定义事件;
  5. 默认不会对外暴露任何属性,如果有需要使用defineExpose
相关推荐
恋猫de小郭5 小时前
Flutter Zero 是什么?它的出现有什么意义?为什么你需要了解下?
android·前端·flutter
崔庆才丨静觅12 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby606113 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了13 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅13 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅13 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅14 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment14 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅14 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端