前端高频面试题---VUE篇(二)

120 阅读6分钟

1. vue双向绑定的原理

  1. Vue使用Object.defineProperty()方法来劫持各个属性的setter和getter,在数据发生变动时通知Vue实例,触发相应的getter和setter回调函数。
  2. 当把一个普通JavaScript对象传给Vue实例作为它的data选项时,Vue将遍历它的属性,用Object.defineProperty()将它们转为getter/setter。用户看不到getter/setter,但是在内部它们让Vue追踪依赖,在属性被访问和修改时通知变化。
  3. Vue双向绑定的核心是数据劫持结合发布者-订阅者模式。数据劫持是指通过Object.defineProperty()来劫持各个属性的setter和getter,在数据发生变动时通知Vue实例。发布者-订阅者模式是指当属性发生变化时,Vue实例会通知所有订阅了该属性的订阅者进行更新。
  4. 在Vue中,每个组件都会维护一个依赖缓存,当依赖的数据发生变化时,Vue会通过依赖缓存来通知所有订阅了该数据的订阅者进行更新。
  5. Vue双向绑定还涉及到虚拟DOM的概念。当数据发生变化时,Vue会生成一个新的虚拟DOM,并将其与旧的虚拟DOM进行对比,然后根据对比结果决定是否更新真实DOM。
  6. Vue双向绑定还涉及到组件的更新机制。当组件的数据发生变化时,Vue会检查该组件的所有子组件,如果子组件的依赖数据发生了变化,那么子组件也会进行更新。这种机制确保了组件之间的数据同步和视图的一致性。

总之,Vue双向绑定的原理是通过数据劫持结合发布者-订阅者模式来实现的。通过Object.defineProperty()来劫持各个属性的setter和getter,在数据发生变动时通知Vue实例,触发相应的getter和setter回调函数。同时使用发布者-订阅者模式来通知所有订阅了该数据的订阅者进行更新。这种机制确保了数据和视图的一致性,使得开发者可以更加轻松地实现动态交互效果。

2. v-model双向绑定的原理是什么?

v-model双向绑定的原理是通过事件机制实现的。当一个表单元素(如input、textarea)的值发生变化时,它会触发一个change事件或input事件,Vue.js会监听这些事件并更新数据。同时,当Vue实例的数据发生变化时,也会触发一个更新视图的事件,从而实现数据与视图的同步更新。除了默认情况下的change和input事件,v-model还可以绑定其他自定义事件,例如lazy、debounce等。lazy指令可以让v-model延迟更新,只有在失去焦点时才更新数据,而debounce则可以让v-model在一定时间内不更新,直到用户停止输入后才更新,从而减少无用的数据更新操作。需要注意的是,v-model只能用于表单元素,如input、textarea、select等,而不能用于自定义组件。如果需要在自定义组件中实现双向绑定,可以使用props和自定义事件的方式来实现。总之,v-model的双向数据绑定原理是通过监听表单元素的事件并更新数据,同时也监听Vue实例数据的变化并更新视图,从而实现数据与视图的同步更新

3. v-for 没有key会发生什么问题?

在Vue中,使用v-for指令来循环渲染一组数据,而key是v-for指令的特殊属性,用于跟踪每个节点的身份,以便高效地更新虚拟DOM。如果没有为v-for指令的每个项提供一个唯一的key值,可能会导致以下问题:

  1. 性能下降:在渲染大量数据时,如果没有key属性,Vue将无法准确知道哪些节点是已经存在的,哪些节点是新添加的,这将导致不必要的重新渲染和性能下降。
  2. 不可预测的渲染结果:如果没有提供key属性,Vue会使用一个非常简单的优化技巧,即简单地把数组的索引作为key。这种做法可能会导致不可预测的渲染结果,因为索引可能会随着数据的改变而改变。例如,如果数据项被排序或过滤,索引可能会打乱,导致渲染结果出错。
  3. 错误警告:在开发模式下,Vue会给出警告,提示缺少key属性可能会导致不可预测的渲染结果。

因此,为了避免这些问题,在使用v-for指令时应该始终提供一个唯一的key属性,以确保高效的虚拟DOM更新和正确的渲染结果。

4. watch在vue中具体有哪些功能?

在Vue中,watch具有以下功能:

  1. 侦听数据变化:watch可以用来侦听data里面的数据是否被修改。一旦修改,就会执行一些其他的操作。这是watch在vue内部提供的一个用于侦听功能的通用的方法,可响应数据的变化,通过特定的数据变化驱动一些操作。
  2. 基础监测和立即执行:watch的另一个特点是在最初绑定的时候不会执行,要等到值改变时才执行监听计算。如果要使它最初绑定的时候就执行,可以使用immediate属性。
  3. 深度监听:watchdeep属性代表是否深度监听。例如,如果一个对象(obj)里面的一个元素发生变化,如果不加deep则无法监测到这个变化。但是,如果对这个对象设置deep监听,任何修改这个对象里面的任何一个属性都会触发这个监听器里的handler。
  4. 监测路由:vue的watch还可以用来监测路由的变化。

5. watch侦听数据变化具体是如何实现的?

在Vue中,watch侦听数据变化是通过观察者模式实现的。当使用watch来侦听一个数据属性时,Vue会创建一个观察者,该观察者会持续追踪该数据属性的变化。当数据属性发生变化时,观察者会触发一个回调函数,这个回调函数可以执行任何自定义的操作。

在具体实现上,watch属性的回调函数会接收两个参数:新值和旧值。通过比较新值和旧值,我们可以确定数据属性是增加、减少还是不变。在回调函数中,我们可以执行任何我们想要的操作,例如更新其他数据属性、发送网络请求、更新视图等。

需要注意的是,watch属性的回调函数只会在数据属性发生变化时被触发,而不是在每次数据属性被访问时。此外,如果数据属性是对象或数组,Vue只会递归地观察对象属性的基本键值(即,非函数的对象属性),而不会观察子对象和数组中元素的变化。如果要深度观察对象或数组的变化,可以使用watchdeep属性。

总之,watch侦听数据变化是通过观察者模式实现的,当数据属性发生变化时,回调函数会被触发并执行相应的操作。