面试 Vue 框架八股文十问十答第五期

面试 Vue 框架八股文十问十答第五期

作者:程序员小白条,个人博客

相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!

⭐点赞⭐收藏⭐不迷路!⭐

1)Vue的基本原理

Vue.js是一款用于构建用户界面的渐进式JavaScript框架。其基本原理包括:

  • 响应式数据: Vue通过使用数据劫持和观察者模式实现了响应式数据。当数据发生变化时,相关的视图会自动更新。这是通过Object.defineProperty()或Proxy来实现的,具体取决于浏览器的支持情况。
  • 虚拟DOM: Vue使用虚拟DOM来提高渲染效率。组件的状态变化时,Vue首先计算出虚拟DOM的变化,然后再将变化的部分更新到实际的DOM中,而不是直接操作真实的DOM。这减少了对实际DOM的直接操作,提高了性能。
  • 组件化: Vue提倡组件化开发,将页面拆分为多个独立的组件。每个组件都有自己的状态和视图,可以组合成一个完整的应用。组件之间通过props和events进行通信。
  • 指令: Vue通过指令(Directives)扩展了HTML,为页面添加了一些交互行为。常见的指令有v-bindv-modelv-ifv-for等。

2)双向数据绑定的原理

双向数据绑定是指视图层的变化会自动同步到数据层,反之亦然。在Vue中,双向数据绑定是通过v-model指令来实现的。其基本原理如下:

  • 数据劫持: Vue使用数据劫持(Object.defineProperty或Proxy)监听数据变化。当数据发生变化时,会触发相应的getter和setter。
  • 观察者模式: Vue实现了一个观察者(Watcher)机制。每个数据都有一个对应的Watcher,负责监听该数据的变化。当数据发生变化时,Watcher会通知订阅了该数据的视图进行更新。
  • 事件监听: 在表单元素上使用v-model时,Vue会为该元素绑定input事件监听器。当用户输入时,触发input事件,通过事件监听器更新数据,反之亦然。

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

使用Object.defineProperty()进行数据劫持有一些缺点:

  • 只能监听对象的属性: Object.defineProperty()只能劫持对象的属性,而不是整个对象。因此,需要逐个定义对象的每个属性,如果对象的嵌套层级很深,需要递归定义,增加了代码复杂性。
  • 初始值必须是对象: 使用Object.defineProperty()时,被劫持的属性必须是对象,初始值不能是基本类型。如果初始值是基本类型,需要额外处理。
  • 无法监听数组变化: Object.defineProperty()无法直接监听数组的变化,因为数组的一些操作(例如通过索引直接设置元素值)不会触发setter。
  • 性能开销: 在大规模数据变化时,使用Object.defineProperty()可能会带来性能开销,因为每个属性的变化都会触发相应的getter和setter。

4)MVVM、MVC、MVP的区别

这三个是设计模式,用于组织前端应用的代码结构,其中MVVM、MVC、MVP分别代表:

  • MVVM (Model-View-ViewModel): MVVM模式将应用程序分为三个主要组成部分。Model表示数据和业务逻辑,View表示用户界面,ViewModel充当View和Model之间的中介,处理View的用户输入,并更新Model。Vue.js是一个典型的MVVM框架。
  • MVC (Model-View-Controller): MVC是一种将应用程序分为三个组件的模式。Model表示数据和业务逻辑,View表示用户界面,Controller处理用户输入并更新Model和View。AngularJS是一个使用MVC模式的框架。
  • MVP (Model-View-Presenter): MVP模式也是一种将应用程序分为三个主要组成部分的模式。Model表示数据和业务逻辑,View表示用户界面,Presenter处理用户输入并更新Model和View。React框架通常被认为是一个采用了MVP模式的库。

区别主要在于各个组件之间的交互方式和关注点分离程度。

5)Computed 和 Watch 的区别

在Vue中,computedwatch都是用于观察数据变化的工具,但它们之间有一些关键的区别:

  • Computed: computed是用于声明派生状态的属性,它依赖于其他响应式数据,只有在相关依赖发生变化时才会重新计算。computed的值会被缓存,只有当依赖改变时才会重新计算。通常用于处理一些基于状态的复杂计算。

    
    
    
    
- Watch: watch用于观察特定数据的变化并执行副作用,可以在数据变化时执行异步或复杂操作。watch 更灵活,但可能需要手动处理一些逻辑,例如处理异步请求。