vue面试专题

84 阅读3分钟

感谢b站up主前端杨村长的精彩分享!

vue组件间通信方式

vue作为组件化开发框架,此题考查vue基本功,对于vue基础api运用熟练度

未命名文件.png

组件通信常用方式有8种

  • props
  • $emit
  • $parent
  • $attrs
  • ref
  • $root
  • eventbus
  • vuex

根据组件间关系

父子组件:

  • props/$emit/$parent/ref/$attrs

兄弟组件:

  • $parent/$root/eventbus/vuex

跨层级组件:

  • eventbus/vuex/provide+inject

v-if与v-for优先级

官方不建议同时使用。

vue 2中,在一个元素上同时使用时,v-for优先使用

vue 3中,v-if总是优先v-for生效。

有两种情况下导致我们这样做:

  • 为了过滤列表中的项目,比如
v-for=“user in users” v-if="user.inActive"

此时定义一个计算属性activeUsers,让其返回过滤后的列表即可

users.filter(u=>u.isActive)
  • 为了避免渲染本应该被渲染的列表,比如
v-for=“user in users” v-if="shouldShowUsers"

此时把v-if移动至容器元素上(ulol)或者外面包一层template即可。

vue 生命周期

定义

每个Vue组件实例被创建后都会经过一系列初始化步骤,比如,需要数据观测,模板编译,挂载实例到dom上,以及数据变化时更新dom,这个过程中会运行一些特殊的函数,这些函数称为生命周期钩子,以便用户在特定阶段有机会添加自己的代码。

列举各阶段

生命周期总共分8个阶段,创建前后载入前后更新前后销毁前后,以及一些特殊场景的生命周期。vue3新增了三个用于调试和服务端渲染场景。

生命周期vue2生命周期vue3描述
beforeCreate不需要(直接写到setup函数中)组件实例被创建之初
created不需要(直接写到setup函数中)组件实例已经完全创建
beforeMountbeforeMount组件挂载之前
mountedonMounted组件挂载到实例上去之后
beforeUpdatebeforeUpdate组件数据发生变化,更新之前
updatedonUpdated数据更新之后
beforeDestroybeforeUnmount组件实例销毁之前
destroyedonUnmounted组件实例销毁之后
activatedactivatedkeep-alive缓存的组件激活时
deactivateddeactivatedkeep-alive缓存的组件停用时调用
errorCapturederrorCaptured捕获一个来自子孙组件的错误时被调用
--renderTracked调试钩子,响应式依赖被收集时调用
--renderTriggered调试钩子,响应式依赖被触发时调用
--serverPrefetchssr only,组件实例在服务器上被渲染前调用

整体流程

实践

image.png

vue中 key 值的作用

用于优化patch性能

key的作用主要是为了更高效的更新虚拟DOM。

patch是整个虚拟DOM中最核心的方法,主要功能是对新旧vnode进行diff的过程,经过patch比对,最后生成新的真实DOM节点,更新改变部分的视图。

为何要用Key?

vue在patch过程中判断两个节点是否为相同节点,key是一个必要条件。渲染一组列表时,key是唯一标识,如果不定义key的话,vue只能认为比较的两个节点是同一个,哪怕实际上不是,这导致频繁更新元素,使得整个patch过程比较低效,影响性能。

实际使用方式

  • 渲染一组列表时key必须设置,而且必须是唯一标识,应避免使用数组索引作为key
  • vue中使用相同标签元素过渡切换时,也会使用key属性,目的是为了让vue可以区分他们,否则vue只会替换其内部属性而不会触发过渡效果。

vue 3新特性

api层面相关

  • 组合式API
  • SFC (组合式API语法糖)
  • Teleport传送门
  • Fragments
  • Emits选项
  • 自定义渲染器
  • SFC CSS变量
  • Suspense

框架层面改进

  • 更快 虚拟DOM重写、编译器优化、基于Proxy的响应式系统
  • 更小
  • 更易维护 TS+模块化
  • 更容易扩展