基础

SOBER大约 24 分钟

基础

  1. 谈谈你对vue的理解(vue是什么?)open in new window
  2. 怎样理解 Vue 的单向数据流?open in new window
  3. vue 中组件的注册和销毁组件open in new window
  4. vue组件里的定时器要怎么销毁?open in new window
  5. 实现 v-model 及多重绑定和原理open in new window
  6. 谈谈 keep-aliveopen in new window
  7. 你知道 vue 中 key 原理吗? 有什么作用?说说你对它的理解open in new window
  8. 谈谈 Object.defineProperty 和 proxy(就是考察 vue2 和 vue3 的区别)open in new window
  9. computed 和 watch 的区别和运用的场景? 底层实现有什么区别?分别在什么场景下使用?open in new window

既然 Vue 通过数据劫持可以精准探测数据变化,为什么还需要虚拟 DOM 进行 diff 检测差异?

在 vue1 版本中就只有 watcher,没有采用 diff 算法,所以这样会导致非常的耗性能, Vue2 内部设计原因导致,vue 设计的是每个组件一个 watcher(渲染函数 watcher),没有采用一个属性对应-个 watcher。这样会导致大量 watcher 的产生而且浪费内存,如果粒度过低也无法精准检测变化。所以采用diff 算法 + 组件级 watcher。

19. 说一下你对响应式数据的理解?(Vue2 和 Vue3 的响应式原理是什么?)

数组和对象类型当值变化时如何劫持到?

对象内部通过 defineReactive 方法,使用 object.defineProperty 将属性进行劫持(只会劫持已经存在的属性),数组则是通过重写数组方法来实现。多层对象是通过递归来实现劫持。 vue3 则采用 proxy

vue2 处理缺陷

  • 在 vue2 的时候使用 defineProperty 来进行数据的劫持,需要对属性进行重写添加 getter 及 setter 性能差
  • 当新增属性和删除属性时无法监控变化。需要通过 setset、delete 实现,就是改变 data 的对象时,vue 无法劫持到,需要通过 setset、delete 实现。
  • 数组不采用 defineProperty 来进行劫持(浪费性能,对所有索引进行劫持会造成性能浪费)需要对数组单独进行处理。
  • 对于 ES6 中新产生的 Map、Set 这些数据结构不支持。

4. v-show 与 v-if 有什么区别?

  • 区别:
    • v-if 是真正的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建;也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。
    • v-show 就简单得多——不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 的 “display” 属性进行切换。
  • 使用场景
    • v-if 适用于在运行时很少改变条件,不需要频繁切换条件的场景;
    • v-show 则适用于需要非常频繁切换条件的场景。

3 vue2 与 vue3 实现对比

Vue 中如何检测数组变化?

5. Class 与 Style 如何动态绑定?

Class 可以通过对象语法和数组语法进行动态绑定: https://github.com/haizlin/fe-interview/issues/437open in new window

/** 对象语法 */
<div v-bind:class="{ active: isActive, 'text-danger': hasError }"></div>
data: {
  isActive: true,
  hasError: false
}

/** 数组语法 */
<div v-bind:class="[isActive ? activeClass : '', errorClass]"></div>
data: {
  activeClass: 'active',
  errorClass: 'text-danger'
}

Style 也可以通过对象语法和数组语法进行动态绑定:

/** 对象语法 */
<div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
data: {
  activeColor: 'red',
  fontSize: 30
}

/** 数组语法 */
<div v-bind:style="[styleColor, styleSize]"></div>
data: {
  styleColor: {
     color: 'red'
   },
  styleSize:{
     fontSize:'23px'
  }
}

为什么白屏加载时间长?

因为在打包后的 index.html 里面,打包后的 js 脚本在最下面,所以首先是加载一个空的 div,然后再去加载哪些js脚本,这就会导致白屏时间过长。

8. 直接给一个数组项赋值,Vue 能检测到变化吗?($set 是什么?有什么作用?怎么实现的?在什么时候使用?)

9. vue绑定事件如何添加修饰符?

10. vue中的数据双向绑定是怎么实现的(双向绑定原理、怎么工作)?

11. Vue 组件中 data 为什么必须是函数?

12. Vue 组件间通信有哪些方式?

13. Vue 的生命周期钩子函数有哪些?怎么对应到组件渲染的不同阶段?

14. Vue 的父组件和子组件生命周期钩子函数执行顺序?

2. 父组件引入子组件,那么生命周期执行的顺序是?

父组件
  beforeCreate
  created
  beforeMount
子组件 1
  beforeCreate
  created
  beforeMount
  mounted
子组件 2
  beforeCreate
  created
  beforeMount
  mounted
......
父组件
  mounted

3. 怎么在 beforeCreate、created、beforeMount、mounted 中获取 DOM

  1. 只要在异步代码中获取就可以了,因为 vue 所有的生命周期都是同步的,所以异步代码最后才会执行,只要在里面写异步代码就可以了

    例如:setTimeout、请求、Promise.xxxopen in new window() 等等.

  2. 使用vue系统内置的 this.$nextrick

4. 为什么发送请求不在 beforeCreate 里? beforeCreate 和 created 有什么区别?

因为:如果请求是在 methods 封装好了,在 beforeCreate 调用的时候,beforeCreate 阶段是拿不到 methods 里面的方法的(会报错了)。

5. 发送请求在 created 还是 mounted ?

这个问题具体要看项目和业务的情况了,因为组件的加载顺序是,父组件引入了子组件,那么先执行父的前 3 个生命周期,再执行子的前 4 个生命周期,那么如果我们的业务是父组件引入子组件,并且优先加载子组件的数据,那么在父组件中当前的请求要放在mounted 中,如果当前组件没有依赖关系那么放在哪个生命周期中请求都是可以的。

16. 怎么在Vue中实现条件渲染和列表渲染?

20. Vue 的 nextTick 是什么?有什么作用?怎么实现的?在什么时候使用?为什么在某些情况下需要使用它?

22. Vue 的 mixin 是什么?

23. Vue 的插槽是什么?怎么使用插槽?

24. Vue 的 slot 是什么?

24. Vue 的 transition 是什么?

25. 什么是 Vue 指令?他的指令有哪些?

26. Vue 的组件通信有哪些方式?

27. Vue 的生命周期钩子函数有哪些?他们分别在什么阶段执行?

28. Vue 的 v-module 指令是怎么实现的?

29. 什么是 Vue 的自定义指令?怎么实现一个 Vue 的自定义指令?指令的生命周期是怎么工作的?

35. Vuex 是什么?它是怎么来实现状态管理的(讲一下 vuex)?

36. 怎么在 Vue 中实现全局状态管理而不使用 Vuex?请描述实现思路?

37. 怎么在 Vue 中实现异步操作?例如通过 API 获取数据?

38. Vue 的异步更新队列和异步更新机制是什么?

39. Vue 的异步更新队列是怎么实现的?

40. 什么是混入(mixins)?有什么作用?如何使用mixins进行代码复用?有哪些缺点?

41. Vue 中的 Composition API 是怎么帮助实现逻辑复用的?与 Mixins 相比有什么优势?

45. 在 Vue 中怎么处理表单验证?

47. 怎么在 Vue 处理事件监听和事件传播?

48. Vue3 中引入的 Composition API 是什么?有什么优势?他与Options API有什么区别?

50. Vue3 中引入的 Fragments、Suspense、Teleport 是什么?,怎么工作的?有什么优势?有哪些使用场景?他与 Vue2 有什么区别?

Vue3 中如何实现异步数据流的处理?结合 Suspense 的用法。

Vue3 的 Suspense 如何处理多个异步任务?

Vue3 的 <Suspense> 组件如何实现超时处理?

Vue3 中的异步组件加载如何结合 Suspense 和 defineAsyncComponent 使用?

Vue3 中如何利用 teleport 实现复杂的 DOM 结构控制?

51. 怎么在 Vue 中实现一个自定义的渲染器?

58. Vue 中的 refs是什么?有什么作用?怎么实现的?在什么时候使用?使用refs 是什么?有什么作用?怎么实现的?在什么时候使用?使用refs获取DOM元素和组件实例时有哪些潜在问题?

68. Vue 中的 datadata、props、parentparent、children、rootroot、isServer、ssrContextssrContext、slots、scopedSlotsscopedSlots、createElement、destroydestroy、attrs、listenerslisteners、mount、forceUpdateforceUpdate、options、emitemit、on、watchwatch、el 是什么?有什么作用?怎么实现的?在什么时候使用?

78. 在 Vue 怎么实现跨组件通信?尤其是复杂的嵌套组件结构?

80. 在 Vue 中 Vue.observable() 的作用是什么?如何使用他来实现全局的状态管理?

81. 描述一下 Vue 的虚拟 DOM 和 diff 算法的工作原理?与 React 的 实现相比有什么不同?

83. Vue 中的 provide/inject 是什么?有什么作用?怎么在 Vue2 项目中使用 provide 和 inject 进行依赖注入? 怎么实现的?在什么时候使用?

86. 怎么在 Vue 中使用 Render 函数创建组件?Render 函数的有点和局限性是什么?

88. 在 Vue3 中怎么实现对多个 v-module 的支持?解释背后的机制

90. 怎么在 Vue 中处理跨域请求的问题?有哪些解决方案?

92. Vue 中的 “事件总线” 模式有什么优缺点?你会在什么场景下使用?

93. 你怎么在 Vue 中使用 TS 有哪些潜在的坑和最佳实践

94. 解释一下 Vue 中的合成事件和原生 DOM 事件之间的关系,怎么在 Vue 中区分两者?

95. 怎么在 Vue 中实现自定义插件?创建插件的步骤和要点是什么?

96. 在 Vue3 中 ref 和 reactive 有什么区别?在使用上有哪些注意事项?如何在 Vue3 中手动实现一个简化版的 ref 和 reactive?

如何在 Vue3 中使用 ref 和 reactive 实现响应式数据?它们有何不同?

Vue3 的 reactive 对象如何防止无限递归的依赖收集?

97. Vue 中怎么防止组件中的内存泄露?有哪些常见的内存泄露场景?怎么处理?

98. 怎么在 Vue 项目中实现模块化样式?与 CSS-in-JS 相比有什么优缺点?

99. Vue2 的模板编译器怎么讲模板字符串编译成渲染函数?解释一下背后的原理和步骤?

100. 怎么在 Vue2 中实现自定义的 v-module 绑定?

Vue 2中的异步组件是如何实现的?有哪些实际应用场景?

在 Vue 中,怎么监听组件的生命周期事件?有哪些实际使用场景?

Vue2 中如何实现一个递归组件?有哪些需要注意的地方?

Vue2 的事件机制是如何实现的?事件冒泡与组件通信怎么处理?

Vue2 的Vue.extend()方法如何用于扩展组件?其底层机制是什么?

如何在 Vue2 中实现代码分割和懒加载?Webpack配置有什么要点?

Vue2 中 props 和 data 是如何被代理到组件实例上的?

Vue2 的 slot 如何实现内容分发?多 slot 情况如何处理?

Vue 2的指令如何动态传参?v-bind 和 v-on 如何解析?

Vue 2中如何处理表单校验逻辑?如何结合第三方插件实现?

如何在Vue 2中手动实现一个简单的观察者模式?

Vue 2的filters是什么?如何实现全局与局部过滤器?

如何在Vue 2中处理父子组件之间的数据传递和双向绑定?

Vue2 中 template 标签如何作为占位符使用?如何影响DOM结构?

Vue3 的 script setup 语法糖如何简化开发?其底层原理是什么?函数如何与生命周期钩子配合使用?

Vue3 中的 provide 和 inject 如何与 Composition API 结合使用?

Vue3 中如何实现自定义的渲染器?请描述具体步骤。

Vue3 的响应式系统如何在异步组件更新中处理依赖收集?

在Vue3 中,isReactive 和 isRef 如何检测响应式对象?底层原理是什么?

Vue3 的 watchEffect 与 watch 有什么区别?何时使用它们?分别是怎么处理异步数据?实现时有哪些需要注意的事项?

Vue3 中如何使用组合式 API 实现模块化的逻辑复用?

如何在 Vue3 项目中使用 TypeScript,保证类型安全?

Vue3 的模板编译器与 Vue2 的有何不同?如何在项目中使用编译器扩展?

如何在 Vue3 中实现自定义指令?与 Vue2 有何变化?

Vue3 中如何手动追踪和暂停响应式数据的更新?

Vue3 中的全局API(如 Vue.config)如何与 Vue2 的实现方式不同?

Vue3 的 Composition API 如何解决大型组件中的代码组织问题?

在 Vue3 中如何处理自定义事件的类型定义?

Vue3 中如何手动实现组件之间的通信,避免Vuex等全局状态管理?

如何在 Vue3 中使用 Hooks 模式和组合式API实现复杂的逻辑?

Vue3 中的错误边界是如何处理的?如何捕获和显示错误?

Vue3 的动态指令参数如何在编译时处理?

如何在 Vue3 中设计一个插件系统?

Vue3 中的模板编译器插件是如何工作的?如何编写一个自定义插件?

Vue3 的组件生命周期钩子如何与 onMounted、onUnmounted 等组合API结合?

如何在 Vue3 项目中使用 shallowRef 和 shallowReactive?它们的应用场景是什么?有何区别?它们如何影响响应式行为?

Vue3 的响应性原理如何处理循环引用问题?

Vue3 中如何实现模块化的异步数据预取和渲染?

Vue3 中的 emit 如何进行类型推断?如何在项目中配置?

Vue3 中如何实现复杂的表单处理逻辑?结合 Composition API 的用法。

Vue3 的 toRef 和 toRefs 如何在 Composition API 中共享状态?

如何在Vue3 中实现递归组件并处理递归渲染的问题?

Vue3 中如何实现全局错误处理和日志记录?

Vue3 的 effectScope 是什么?如何管理响应式副作用?

如何在Vue3 项目中实现分片渲染(chunked rendering)来处理大数据量?

Vue3 中的响应式系统如何区分异步队列和同步队列?

如何在Vue3 中使用Composition API实现自定义的Hook函数?

在Vue3 中,如何实现高效的虚拟滚动列表?

如何在Vue3 中扩展模板编译器以支持自定义的指令语法?

如何在Vue3 中处理动态表单生成与表单字段的动态验证?

Vue3 中如何实现自定义的渲染函数来实现更复杂的渲染逻辑?

Vue3 中的customRef是如何实现自定义响应式逻辑的?有哪些应用场景?

如何在Vue3 中使用组合式API和TypeScript来增强类型推断和代码可读性?

Vue3 的响应式代理如何通过track和trigger来实现依赖收集和更新?

如何在Vue3 中实现跨组件的复杂数据共享,而不使用Vuex?

如何在Vue3 项目中实现高阶组件?底层实现与Vue 2有何区别?

Vue3 的readonly和reactive如何在响应式数据中协同工作?

如何在 Vue3 中使用defineComponent来创建带有类型安全的组件?

Vue3 中如何创建和使用组合API中的hook函数进行逻辑抽离?

如何在Vue3 中使用模板编译插件来扩展模板语法并实现自定义行为?