2022必会的vue高频面试题(附答案)

Vue-router 导航守卫有哪些

  • 全局前置/钩子:beforeEach、beforeResolve、afterEach
  • 路由独享的守卫:beforeEnter
  • 组件内的守卫:beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave

为什么在 Vue3.0 采用了 Proxy,抛弃了 Object.defineProperty?

Object.defineProperty 本身有一定的监控到数组下标变化的能力,但是在 Vue 中,从性能/体验的性价比考虑,尤大大就弃用了这个特性(Vue 为什么不能检测数组变动 )。为了解决这个问题,经过 vue 内部处理后可以使用以下几种方法来监听数组

push();
pop();
shift();
unshift();
splice();
sort();
reverse();
复制代码

由于只针对了以上 7 种方法进行了 hack 处理,所以其他数组的属性也是检测不到的,还是具有一定的局限性。

Object.defineProperty 只能劫持对象的属性,因此我们需要对每个对象的每个属性进行遍历。Vue 2.x 里,是通过 递归 + 遍历 data 对象来实现对数据的监控的,如果属性值也是对象那么需要深度遍历,显然如果能劫持一个完整的对象是才是更好的选择。

Proxy 可以劫持整个对象,并返回一个新的对象。Proxy 不仅可以代理对象,还可以代理数组。还可以代理动态增加的属性。

前端vue面试题详细解答

v-for 为什么要加 key

如果不使用 key,Vue 会使用一种最大限度减少动态元素并且尽可能的尝试就地修改/复用相同类型元素的算法。key 是为 Vue 中 vnode 的唯一标记,通过这个 key,我们的 diff 操作可以更准确、更快速

更准确:因为带 key 就不是就地复用了,在 sameNode 函数 a.key === b.key 对比中可以避免就地复用的情况。所以会更加准确。

更快速:利用 key 的唯一性生成 map 对象来获取对应节点,比遍历方式更快

如何从真实DOM到虚拟DOM

涉及到Vue中的模板编译原理,主要过程:

  1. 将模板转换成 ast 树, ast 用对象来描述真实的JS语法(将真实DOM转换成虚拟DOM)
  2. 优化树
  3. ast 树生成代码

为什么Vue采用异步渲染呢?

Vue 是组件级更新,如果不采用异步更新,那么每次更新数据都会对当前组件进行重新渲染,所以为了性能, Vue 会在本轮数据更新后,在异步更新视图。核心思想 nextTick

dep.notify() 通知 watcher进行更新, subs[i].update 依次调用 watcher 的 update queueWatcher 将watcher 去重放入队列, nextTick( flushSchedulerQueue )在下一tick中刷新watcher队列(异步)。

为什么vue组件中data必须是一个函数?

对象为引用类型,当复用组件时,由于数据对象都指向同一个data对象,当在一个组件中修改data时,其他重用的组件中的data会同时被修改;而使用返回对象的函数,由于每次返回的都是一个新对象(Object的实例),引用地址不同,则不会出现这个问题。

MVC 和 MVVM 区别

MVC

MVC 全名是 Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范

  • Model(模型):是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据
  • View(视图):是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的
  • Controller(控制器):是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据

MVC 的思想:一句话描述就是 Controller 负责将 Model 的数据用 View 显示出来,换句话说就是在 Controller 里面把 Model 的数据赋值给 View。

MVVM

MVVM 新增了 VM 类

  • ViewModel 层:做了两件事达到了数据的双向绑定 一是将【模型】转化成【视图】,即将后端传递的数据转化成所看到的页面。实现的方式是:数据绑定。二是将【视图】转化成【模型】,即将所看到的页面转化成后端的数据。实现的方式是:DOM 事件监听。

MVVM 与 MVC 最大的区别就是:它实现了 View 和 Model 的自动同步,也就是当 Model 的属性改变时,我们不用再自己手动操作 Dom 元素,来改变 View 的显示,而是改变属性后该属性对应 View 层显示会自动改变(对应Vue数据驱动的思想)

整体看来,MVVM 比 MVC 精简很多,不仅简化了业务与界面的依赖,还解决了数据频繁更新的问题,不用再用选择器操作 DOM 元素。因为在 MVVM 中,View 不知道 Model 的存在,Model 和 ViewModel 也观察不到 View,这种低耦合模式提高代码的可重用性

注意:Vue 并没有完全遵循 MVVM 的思想 这一点官网自己也有说明

那么问题来了 为什么官方要说 Vue 没有完全遵循 MVVM 思想呢?

  • 严格的 MVVM 要求 View 不能和 Model 直接通信,而 Vue 提供了$refs 这个属性,让 Model 可以直接操作 View,违反了这一规定,所以说 Vue 没有完全遵循 MVVM。

Vue 为什么要用 vm.$set() 解决对象新增属性不能响应的问题 ?你能说说如下代码的实现原理么?

1)Vue为什么要用vm.$set() 解决对象新增属性不能响应的问题

  1. Vue使用了Object.defineProperty实现双向数据绑定
  2. 在初始化实例时对属性执行 getter/setter 转化
  3. 属性必须在data对象上存在才能让Vue将它转换为响应式的(这也就造成了Vue无法检测到对象属性的添加或删除)

所以Vue提供了Vue.set (object, propertyName, value) / vm.$set (object, propertyName, value)

2)接下来我们看看框架本身是如何实现的呢?

Vue 源码位置:vue/src/core/instance/index.js

export function set (target: Array<any> | Object, key: any, val: any): any {
   
  // target 为数组  
  if (Array.isArray(target) && isValidArrayIndex(key)) {
   
    // 修改数组的长度, 避免索引>数组长度导致splcie()执行有误
    target
  • 2
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是一些常见的Vue前端面试题及其答案: 1. 什么是Vue.js? 答:Vue.js是一个轻量级的JavaScript框架,用于构建用户界面。它易于使用,具有高效的性能和可扩展性。Vue.js采用了MVVM(Model-View-ViewModel)模式,将UI与业务逻辑分离,使代码更易于维护和扩展。 2. Vue.js的核心特点是什么? 答:Vue.js的核心特点包括: - 响应式数据绑定 - 组件化开发 - 轻量级、高效的性能 - 可定制化、可扩展 3. 什么是Vue组件? 答:Vue组件是可复用的、自包含的代码块,用于构建用户界面。组件可以包含HTML、CSS和JavaScript代码,并且可以接受输入和输出。Vue组件采用了单文件组件(SFC)的方式进行开发,将组件的相关代码放在同一文件中,使得组件更易于维护和重用。 4. 什么是Vue的生命周期钩子函数? 答:Vue的生命周期钩子函数是一组函数,用于在Vue实例生命周期中执行特定的操作。这些钩子函数包括beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy和destroyed。开发者可以通过这些钩子函数来控制Vue实例的行为和状态。 5. 什么是Vue的路由? 答:Vue的路由是一种管理页面之间导航的机制。它可以帮助开发者构建单页应用程序(SPA),在页面之间进行无刷新的导航。Vue的路由采用了Vue Router插件,可以通过配置路由表来实现页面之间的导航。 6. 什么是Vue的指令? 答:Vue的指令是一种特殊的HTML属性,用于将Vue实例的数据绑定到DOM元素上。Vue的指令包括v-model、v-bind、v-if、v-for、v-show等等。开发者可以通过这些指令来控制DOM元素的行为和状态。 7. 什么是Vue的模板语法? 答:Vue的模板语法是一种将Vue实例中的数据绑定到HTML模板中的机制。Vue的模板语法采用了插值、指令、计算属性等方式实现数据绑定。这使得开发者可以将数据和UI分离,并且更容易地构建复杂的用户界面。 以上是一些常见的Vue前端面试题及其答案,希望对你有所帮助。 ### 回答2: Vue前端面试题答案如下: 1. Vue的特点是什么? Vue具有简单、灵活、高效的特点。它使用虚拟DOM进行渲染,提高性能;采用组件化开发,方便复用和维护;支持响应式数据绑定,实时更新页面;支持指令和过滤器,方便处理DOM操作和数据过滤。 2. Vue的生命周期有哪些? Vue的生命周期包括:beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy、destroyed。这些生命周期钩子函数可以在不同的阶段执行相应的操作,比如在mounted阶段可以进行异步请求数据,或者在beforeDestroy阶段清理定时器等。 3. Vue中的双向绑定是如何实现的? Vue使用了数据劫持和观察者模式来实现双向绑定。通过Object.defineProperty()方法对数据对象进行劫持,当数据发生变化时,触发相应的getter和setter方法,同时更新视图中的数据。而观察者模式则通过Watcher对象来监听数据的变化,并将变化通知给视图进行更新。 4. Vue中的指令有哪些? Vue常用的指令有v-if、v-for、v-bind、v-on、v-model等。其中v-if用于条件渲染元素,v-for用于循环渲染元素,v-bind用于绑定属性或类名,v-on用于绑定事件,v-model用于双向绑定表单元素的值。 5. Vue的路由是如何实现的? Vue可以通过Vue Router实现前端路由。Vue Router通过hash或history模式来监听URL的变化,并根据配置的路由表来匹配相应的组件进行渲染。通过路由的切换,可以实现单页应用的页面切换、参数传递等功能。 总结:以上是一些常见的Vue前端面试题及简要答案。在面试过程中,除了了解以上知识点,还需要在实际项目中具备一定的经验和实践能力,以能够更好地应对面试官的提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值