vue面试题大全

简介: vue面试题大全

一.vue的基本原理

当一个vue实例创建的时候,vue会遍历data中的属性,用object.defineProperty,将它们转为getter/setter,并且在内部追踪相关依赖,在属性被访问和修改时通知变化。每个组件实例都有相应的watcher程序实例,它会在组件渲染的过程中把谁能够记录为依赖,之后依赖的setter被调用时,会通知wacther重新计算,从而导致它关联的组件得以更新。

二.双向数据绑定的原理

vue 双向数据绑定是通过 数据劫持 结合 发布订阅模式的方式来实现的, 也就是说数据和视图同步,数据发生变化,视图跟着变化,视图变化,数据也随之发生改变;

VUE双向数据绑定,其核心是 Object.defineProperty()方法,给Vue中的数据绑定get和set方法,当获取数据的时候,调用get方法,修改data中的数据的时候调用set方法,通过watcher监听器去更新视图,完成数据的双向绑定。

1. 需要observe的数据对象进行递归遍历,包括子属性对象的属性,都加上setter和getter这样的话,
  给这个对象的某个值赋值,就会触发setter,那么就能监听到了数据变化。
 2. compile解析模板指令,将模板中的变量替换成数据,然后初始化渲染页面视图,并将每个指令对应的节点绑定更新函数,
   添加监听数据的订阅者,一旦数据有变动,收到通知,更新视图。
 3.watcher订阅者是observer和compile之间通信的桥梁,主要做的事情是:1*.在自身实例化时往属性订阅器里面添加组件 
 2*.自身必须有一个update()方法.3*待属性变动dep.notice()通知时,能调用自身的update()方法,
    并触发complie中绑定的回调,则功成身退。
 4. MVVM作为数据绑定的入口,整合observer、compile和watcher三者,通过observer来监听自己的model数据变化,
  通过compile来解析编译模板指令,最终利用watcher搭起来Observer和Compile之间的通信桥梁,达到数据变化,
  视图更新,视图交互话变化,数据model变更的双向绑定效果。

三.使用object.defineProperty()来进行数据劫持有什么缺点?

在对一些属性进行操作时,使用这种方法无法拦截,比如通过下标的方式修改数组数据,或者给对象新增属性,这都不能触发组件的重新渲染,因为object.defineProperty不能拦截到这些操作。更精确的来说,对于数组而言,大部分操作都是拦截不到的,只是vue内部通过重写函数的方式解决了这个问题。

在vue3.0中已经不使用这种方式了,而是通过proxy对对象进行代理,从而实现数据劫持。使用proxy的好处是它可以完美的监听任何方式的数据改变,唯一的缺点是兼容性问题,因为proxy是es6的语法。

defineProperty和proxy的区别?

vue在实例初始化时遍历data中的所有属性,并使用object.defineProperty把这些属性全部转化为getter/setter。这样当追踪数据发生变化时,setter会被自动调用。

object.defineProperty是Es5中一个无法shim的特征,这也就是vue不支持IE8以及更低版本浏览器的原因。

但是这样做有以下问题:

1.添加或删除对象的属性时候,vue检测不到。因为添加或删除的对象没有在初始化进行响应式处理,只能通过$set来调用object.definePropery()处理。

2.无法监控到数组下标和长度的变化。

vue3使用Proxy来监控数据的变化。proxy是ES6中提供的功能,作用为:用于定义基本操作的自定义行为(比如属性查找,赋值,枚举,函数调用等)。相对于Object.definePropery()有以下几个优点:

1.Proxy直接代理整个对象而非对象属性,这样只需要做一层代理就可以监听同级结构下的所有属性变化,
  包括新增属性和删除属性。
2.Proxy可以监听数组的变化。

Vue3.0为什么要用proxy?

在vue2中,object.defineProperty会改变原始数据,而Proxy是创建对象的虚拟表示,并提供set、get和deleteProperty等处理器,这些处理器可在访问或者修改原始对象上的属性进行拦截,有以下特点:

不需要使用vue.$set或VUe. $delete触发响应式。

全方位的数组变化检测,消除了vue2无效的边界情况。

支持map,set ,WeakSet,weakMap

Proxy实现的响应式原理与vue2的实现原理相同,实现方式大同小异:

get收集依赖

set,delete等触发依赖

对于集合类型,就是对集合对象的方法做一层包装,原方法执行后执行依赖相关的收集或触发逻辑。

四.MVVM、MVC 、MVP、的区别?

mvc,mvp,mvvm是三种常见的架构设计模式,主要是通过分离关注点的方式来组织代码结构,优化开发效率。

在开发单页面应用时,往往一个路由对应了一个脚本文件,所有的页面逻辑都在一个脚本文件里。页面的渲染,数据的获取,对用户事件的响应所有的应用逻辑都混合在一起,这样开发简单项目的时候,可能看不出什么问题来,但是如果项目变得复杂,那么整个文件就会 变得冗长,混乱,这样对项目的开发和后期的项目维护非常不利的。

(1)MVC

MVC:通过分离model、view和controller的方式来组织代码结构。其中view负责页面的显示逻辑;

model负责存储页面的业务数据,以及对应数据的操作。并且View和Model应用了观察者模式,当Model层发生改变的时候他会通知有关View层更新页面。Controller层是view层和model层的纽带,它主要负责用户与应用的响应操作,当用户与页面产生交互的时候,controller中的事件触发器就开始工作了,通过调用model层来完成对model的修改,然后,model层再去通知view层更新。

(2)MVVM

  1. MVVM分为model,view,viewmodel; Model代表数据模型,数据和业务逻辑都在model层中定义;
  2. view代表ui视图,负责数据的展示。
  3. viewmodel负责监听model中数据的改变并且控制视图的更新,处理用户交互操作;
    Model和view没有直接关联,而且通过viewmodel来进行联系的,model和viewmodel之间有着双向数据绑定的联系。因此当model中的数据改变时会触发view层的刷新,view中由于用户交互操作而改变的数据也会在model中同步。
    这种模式实现了Model和view的数据自动同步,因此开发者只需要专注于数据的维护操作即可,而不需要自己操作DOM.
    (3)MVP
    MVP模式与MVC唯一的不同在于presenter和controller。在MVC模式中使用观察者模式,来实现当model层数据发生变化的时候,通知view层的更新。这样view层和model层耦合在一起,当项目逻辑变得复杂的时候,可能会造成代码的混乱,并且可能会对代码的复用性造成一些问题.MVP的模式通过使用presenter来实现对view层和model层的解耦.
    MVC中controller只知道model的接口,因此他没有办法控制view层的更新,MVP模式中,View层的接口暴露给了presenter因此可以在persenter中将Model的变化和View的变化绑定在一起,以此来实现View和model的同步更新.这样就实现了对view和model的解耦,persenter还包含了其他的响应逻辑。

computed 和 Watch的区别?

Computed:

它支持缓存,只有依赖的数据发生了变化,才会重写计算。

不支持异步,当Computed中有异步操作的时,无法监听数据的变化。

computed的值会默认走缓存,计算属性是基于它们的响应式依赖进行缓存的,也就是基于data声明过,或者父组件传递过来的props中的数据进行计算的。

如果一个属性是由其他属性计算而来的,这个属性依赖其他的属性,一般会使用computed

如果computed属性的属性值是函数,那么默认使用get方法,函数的返回值就是属性值,在computed中,属性有一个get方法和一个set方法,当数据发生变化时,会调用set方法。

Watch:

它不支持缓存,数据变化时,他就会触发响应的操作。

支持异步监听

监听的函数接收两个参数,第一个参数是最新的值,第二个是变化之前的值。

当一个属性发生变化时,就需要执行相应的操作

监听数据必须是data中声明的或者父组件传递过来的props中的数据,当发生变化时,会触发其他操作,函数有两个参数:【immediate:组件加载立即触发回调函数;deep:深度监听,发现数据内部的变化,在复杂数据类型中使用,例如数组中的对象发生变化,需要注意的时,deep无法监听到数组和对象内部的变化。当想要执行异步或者昂贵的操作以响应不断的变化时,就需要使用watch。】

小结

computed计算属性,依赖其他属性值,并且computed的值有缓存,只有它依赖其他属性值,发生改变,下一次获取computed的值才会重新计算computed的值。

watch侦听器:更多的时观察的作用,无缓存性,类似于某些数据的监听回调,每当监听的数据变化时,都会执行回调进行后续操作。

运行场景:

当需要进行数值计算,并且依赖于其他数据时候,应该使用comouted,因为可以利用computed的缓存特性,避免每次获取值时都要重写计算。

当需要在数据变化时执行异步或开销较大的操作时,应该使用watch,使用watch选项允许执行异步操作,限制执行该操作的频率,并在得到最终结果前,设置中间状态。这些都是计算属性我无法做到的。

computed和methods的区别?

可以将同一函数定义为一个method或者一个计算属性。对于最终的结果,两种方式是相同的。

不同点:

computed计算属性是基于它们的依赖进行缓存的,只有在它的相关依赖发生改变时才会重写求值;

method调用总会执行该函数。

slot是什么?有什么作用?原理是什么?

slot又名插槽,是vue的内容分发机制,组件内部的模板引擎使用slot元素作为承载分发内容的出口。插槽是slot元素作为承载分发内容的出口。插槽slot是子组件的一个模板标签元素,而这一个标签元素是否显示,以及怎么显示是由父组件决定的。slot又分三类,默认插槽,具名插槽和作用域插槽。

默认插槽:又称匿名插槽,当slot没有指定name属性值的时候,一个默认显示

vue的生命周期

产看详情

vueX中的辅助函数

查看详情

扩展

前端面试题总结框架大全


相关文章
|
5月前
|
JavaScript 前端开发 应用服务中间件
【Vue面试题三十】、vue项目本地开发完成后部署到服务器后报404是什么原因呢?
这篇文章分析了Vue项目在服务器部署后出现404错误的原因,主要是由于history路由模式下服务器缺少对单页应用的支持,并提供了通过修改nginx配置使用`try_files`指令重定向所有请求到`index.html`的解决方案。
【Vue面试题三十】、vue项目本地开发完成后部署到服务器后报404是什么原因呢?
|
5月前
|
JavaScript
【Vue面试题十五】、说说你对slot的理解?slot使用场景有哪些?
这篇文章深入探讨了Vue中的`slot`概念,包括它的定义、使用场景和分类(默认插槽、具名插槽和作用域插槽),并通过代码示例展示了如何在组件中使用插槽来实现内容的分发和自定义。同时,文章还对插槽的工作原理进行了分析,解释了`renderSlot`函数和`$scopedSlots`对象的角色。
【Vue面试题十五】、说说你对slot的理解?slot使用场景有哪些?
|
5月前
|
JavaScript 前端开发
【Vue面试题二十五】、你了解axios的原理吗?有看过它的源码吗?
这篇文章主要讨论了axios的使用、原理以及源码分析。 文章中首先回顾了axios的基本用法,包括发送请求、请求拦截器和响应拦截器的使用,以及如何取消请求。接着,作者实现了一个简易版的axios,包括构造函数、请求方法、拦截器的实现等。最后,文章对axios的源码进行了分析,包括目录结构、核心文件axios.js的内容,以及axios实例化过程中的配置合并、拦截器的使用等。
【Vue面试题二十五】、你了解axios的原理吗?有看过它的源码吗?
|
5月前
|
JavaScript 前端开发 数据处理
【Vue面试题二十八】、vue要做权限管理该怎么做?如果控制到按钮级别的权限怎么做?
这篇文章讨论了Vue中实现权限管理的策略,包括接口权限、路由权限、菜单权限和按钮权限的控制方法,并提供了不同的实现方案及代码示例,以确保用户只能访问被授权的资源。
【Vue面试题二十八】、vue要做权限管理该怎么做?如果控制到按钮级别的权限怎么做?
|
5月前
|
JavaScript 前端开发
【Vue面试题二十七】、你了解axios的原理吗?有看过它的源码吗?
文章讨论了Vue项目目录结构的设计原则和实践,强调了项目结构清晰的重要性,提出了包括语义一致性、单一入口/出口、就近原则、公共文件的绝对路径引用等原则,并展示了单页面和多页面Vue项目的目录结构示例。
|
4月前
|
缓存 JavaScript 前端开发
vue面试题
vue面试题
174 64
|
3月前
|
JavaScript 前端开发
vue尚品汇商城项目-day01【8.路由跳转与传参相关面试题】
vue尚品汇商城项目-day01【8.路由跳转与传参相关面试题】
48 0
vue尚品汇商城项目-day01【8.路由跳转与传参相关面试题】
|
5月前
|
JavaScript 安全 前端开发
【Vue面试题二十九】、Vue项目中你是如何解决跨域的呢?
这篇文章介绍了Vue项目中解决跨域问题的方法,包括使用CORS设置HTTP头、通过Proxy代理服务器进行请求转发,以及在vue.config.js中配置代理对象的策略。
【Vue面试题二十九】、Vue项目中你是如何解决跨域的呢?
|
5月前
|
JavaScript 前端开发 编译器
【Vue面试题三十二】、vue3有了解过吗?能说说跟vue2的区别吗?
这篇文章介绍了Vue 3相对于Vue 2的改进和新增特性,包括性能提升、体积减小、更易维护、更好的TypeScript支持、新的Composition API、新增的Teleport和createRenderer功能,以及Vue 3中的非兼容性变更和API的移除或重命名。
【Vue面试题三十二】、vue3有了解过吗?能说说跟vue2的区别吗?
|
5月前
|
JavaScript 前端开发 API
【Vue面试题三十一】、你是怎么处理vue项目中的错误的?
这篇文章讨论了Vue项目中错误的处理方式,包括后端接口错误和代码逻辑错误的处理策略。文章详细介绍了如何使用axios的拦截器处理后端接口错误,以及Vue提供的全局错误处理函数`errorHandler`和生命周期钩子`errorCaptured`来处理代码中的逻辑错误。此外,还分析了Vue错误处理的源码,解释了`handleError`、`globalHandleError`、`invokeWithErrorHandling`和`logError`函数的作用和处理流程。
【Vue面试题三十一】、你是怎么处理vue项目中的错误的?

热门文章

最新文章