Vue2 Vue3面试题

70 阅读2分钟

一、ref、reactive的区别

功能:ref可以用于任何类型,ref如果对象的话,内部对对象执行reactive;reactive用于对象或数组

返回值:ref返回的是RefImpl;reactive返回的是proxy对象

访问方式:ref通过.valeu访问;reactive直接访问就可以

二、keep-alive

功能:组件切换时,保持组件的状态

使用场景:适用于频繁切换,还需要保持状态的

实现原理:keep-alive只是一个包裹器,内部有一个map缓存,key为组件的name,value组件实例。如果命中缓存则复用vnode,未命中则正常渲染组件

生命周期

  1. 第一次进入:setup,onBeforeMount,onMounted,onActivated

  2. 离开:onDeactivated

  3. 再次进入:onActivated

  4. 彻底销毁:onUnmounted


<template>

<router-view v-slot="{ Component }">

<keep-alive>

<component :is="Component" v-if="$route.meta.keepAlive" />

</keep-alive>

<component :is="Component" v-if="!$route.meta.keepAlive" />

</router-view>

</template>

三、异步组件 & 路由懒加载

  1. 异步组件:defineAsyncComponent组件级别的,如果不是首屏展示的组件,大型的组件可以用这个方法。打包的时候会打包单独的chunk,当该组件渲染的时候,才会加载js,可以用于性能优化

缓存:组件代码会缓存,组件实例如果缓存,需要配合keep-alive

  1. 路由懒加载:路由级别的,会打包单独的chunk

四、vue-router

  1. vue2&vue3区别: 使用方式不同,vue3组合式api;vue2是options方式。

  2. hash模式,history模式:底层hash监听的hashchange变化,;history监听的是popstate,history.pushState(state, '', '/user'),history.replaceState(state, '', '/user');

  3. 全局守卫,beforeEach可以设置title,背景颜色等

五、diff算法的区别

vue2:

  1. 双端比较,四个指针(首-首,首-尾,尾-首,尾-尾),循环比较,移动节点,中间剩余节点采用暴力算法,两层循环移动到正确的位置。时间复杂度o(n^2)

vue3:

  1. LIS:四个指针,剩余节点,采用Map标记,跟LIS算法(生成newIndexSeq,旧节点在新节点中的位置,不存在的为-,计算LIS(最长递增子序列)不需要移动的节点,LIS 外节点移动到正确位置),最小移动距离,时间复杂度O(n log n)

  2. Block Tree:运行时优化,构建静态树,更新时只遍历这些节点

  3. Patch Flags:编译时优化,给VNode打标记,TEXT、CLASS、STYLE、PROPS,只处理动态变化的部分,不对整个vNode进行diff。v-once强制不比较

  4. Fragment:运行时优化,取消了单根节点的限制,多个同级子节点间互不影响,某个节点发生变化,不会触发别的vNode diff

六、Vuex 跟 Pinia

vuex

  1. getter,state,mutations,actions(异步操作),module(模块化)

  2. 底层是用reactive实现的响应式,

  3. 结合localstorage实现持久化存储

pinia

  1. composition API

  2. actions,统一处理

  3. 模块化

  4. 更轻量,体积小

七、vue3 跟 vue2的区别

  1. diff算法优化

  2. Composition api

  3. proxy,object.defineProperty

  4. api的变化,生命周期