mewcoder / feroad

前端精进之路 网站
https://feroad.tech
4 stars 0 forks source link

Vue面试题 #6

Open mewcoder opened 6 months ago

mewcoder commented 6 months ago
mewcoder commented 5 months ago

组件通信方式

Vue:

React:

mewcoder commented 5 months ago

Vue3 和 Vue2 的区别

1.API 方面:

2.性能方面:

3.维护性:

mewcoder commented 5 months ago

说一下 Composition API

函数式的优势 和 Options API 对比,分两个方面

还有就是函数式的优势

Composition API Composition API 包括:

与 React Hooks 对比 灵感来源, 和 hooks 有相同级别的逻辑组织能力, React Hooks 组件更新时都会重新调用,有一些痛点:

mewcoder commented 5 months ago

vue 响应式理解

代理:拦截并重新定义对一个对象的基本操作

function reactive(target) {
  const handler = {
    get(target, key, receiver) {
      const res = Reflect.get(target, key, receiver);
      track(target, key); // 收集依赖
      if (isObject(res)) return reactive(res); // 如果是对象,递归懒代理
      return res;
    },
    set(target, key, value, receiver) {
      const oldValue = target[key]; // 获取老的值
      const result = Reflect.set(target, key, value, receiver);
      if (!Object.is(oldValue, value)) {
        trigger(target, key);
      }
      return result;
    },
  };

  return new Proxy(target, handler);
}

// track: 收集依赖 存放targetMap: `WeakMap<object, Map<key, Set<effect>>`

为什么用 Reflect Reflect.xxx 提供对象的基本操作方法,与 proxy 拦截器 中的方法相对应,确保和对象默认行为一致 参数相同,传递参数,其中 receiver 能被正确的传递,确保调用时的 this 正确性

mewcoder commented 5 months ago

虚拟 DOM 和 Diff

虚拟 DOM:

diff 算法

key 的作用

key 的作用是为了更高效的更新 DOM,diff 算法的目标就是尽可能复用原来对应的节点,减少 dom 操作量。

key 就是 vnode 的唯一 id,在 dom diff 的过程中,通过 key 找到对应原型的节点,来减少 dom 操作量,提升视图更新的性能。

mewcoder commented 5 months ago

模板编译原理

Vue2 的过程是 parse -> optimize -> generate

optimize:优化原始 AST,标记静态节点。

Vue3 更加标准化,中间过程为 transform

  1. parse:compiler 会对 template 进行解析,得到抽象语法树 AST,
  2. transform:遍历 AST 进行 转换
  3. generate: 生成 render 函数,render 函数是返回虚拟 DOM 的函数

vue3 的编译优化:编译阶段尽可能提取关键信息

https://zhuanlan.zhihu.com/p/150732926

mewcoder commented 5 months ago

双向绑定

  1. vue 中双向绑定使用指令 v-model,可以绑定数据到视图,对应的视图变化也会改变该数据。
  2. v-model 是语法糖,默认情况下相当于:value@input。v-model 经过模板编译被转换为属性 value 和一个事件监听,事件回调函数中会做相应变量更新操作。
  1. 通常在原生表单项上使⽤ v-model ,也可以在自定义组件上使用
  2. v-model 只能去绑定一个变量,使用 .sync 可以实现多个变量的双向绑定
  3. Vue3 的 v-model 有更新,类似.sync,默认的 v-model 相当于:modelValue@update:modelValue

Vue 中的单向数据流是指数据的流向只能从父组件向子组件,子组件不能直接修改父组件中的数据,而是通过触发父组件中的事件来实现数据的修改

mewcoder commented 5 months ago

nextTick

mewcoder commented 5 months ago

slot 实现原理

mewcoder commented 5 months ago

keep-alive

mewcoder commented 5 months ago

路由实现原理

一个 SPA 应用的路由需要解决的问题是页面跳转内容改变同时不刷新

  1. router 实例化的时候保存用户传入的配置项和路由表,运行时要
    • 监听 popstate 事件
    • 回调里根据 path 匹配对应路由
  2. 将 router 定义成一个 Vue 插件,即实现 install 方法,内部做两件事:
    • 实现两个全局组件:router-link 和 router-view,分别实现页面跳转和内容显示
mewcoder commented 5 months ago

pinia 对比 vuex