interview
vue-basics
为什么 Vue 中给对象添加新属性后界面没有刷新

Vue 基础面试题, 为什么 Vue 中给对象添加新属性后,界面没有刷新?

Vue 基础面试题, 为什么 Vue 中给对象添加新属性后,界面没有刷新?

QA

Step 1

Q:: 为什么 Vue 中给对象添加新属性后,界面没有刷新?

A:: 在 Vue 中,当你向一个响应式对象添加一个新属性时,该属性并不会被 Vue 的响应式系统所追踪。这是因为 Vue 是通过 Object.defineProperty 进行响应式绑定的,只有在 Vue 初始化时已经存在的属性才会被追踪。如果需要让新添加的属性也能够响应式更新,你可以使用 Vue.set(obj, 'newProp', value) 或者通过 this.$set(this.obj, 'newProp', value) 来确保新属性能够被 Vue 的响应式系统追踪。此外,在 Vue 3 中,响应式系统进行了更新,使用 Proxy 对象替代了 Object.defineProperty,从而解决了这个问题。

Step 2

Q:: Vue 2.x 中的响应式系统是如何工作的?

A:: Vue 2.x 的响应式系统主要是通过 Object.defineProperty 来劫持对象的 getter 和 setter,从而实现对数据的追踪和更新。每个属性在初始化时都会被 Vue 绑定到一个 Dep(依赖收集器)中,当属性发生变化时,Dep 会通知所有依赖这个属性的 watcher(观察者)进行视图更新。这个机制是 Vue 2.x 实现响应式数据的核心。

Step 3

Q:: 如何处理 Vue 对象中属性的删除问题?

A:: 与添加新属性类似,Vue 对删除对象中的属性也不能进行自动追踪和更新。在 Vue 2 中,如果你需要删除一个对象的属性,并希望界面更新,你可以使用 Vue.delete(obj, 'propName')this.$delete(obj, 'propName')。在 Vue 3 中,由于响应式系统的改进,删除属性也能被正确地追踪到。

Step 4

Q:: Vue 中如何监听对象或数组的变化?

A:: 在 Vue 2 中,可以通过 watch 选项来监听对象或数组的变化。然而,如果是对象的深层次属性变化,默认情况下 Vue 并不会追踪,除非你设置 deep: true。在 Vue 3 中,watch 选项的 API 进行了扩展,支持更灵活的监听方式。此外,你也可以使用 computed 计算属性来追踪特定的属性变化,特别是当你只关心对象或数组中的部分属性时。

用途

这些面试题围绕 Vue 的响应式系统展开,考察了候选人对 Vue 核心机制的理解。在实际生产环境中,理解和掌握 Vue 的响应式系统非常重要,因为这直接关系到应用的数据流和 UI 的更新方式。如果开发者不了解 Vue 如何追踪数据的变化,可能会导致数据更新异常、性能问题以及难以调试的 bug。尤其是在构建复杂的前端应用时,合理地使用 Vue 的响应式系统能够提高代码的维护性和性能。\n

相关问题

🦆
Vue 3 的 Proxy 响应式系统与 Vue 2 的响应式系统相比有哪些改进?

Vue 3 使用了 Proxy 代替 Vue 2Object.defineProperty,解决了 Vue 2 中的一些限制,例如动态添加属性时不能追踪、对数组的操作支持不够全面等。Proxy 可以直接拦截对象的操作,因此 Vue 3 的响应式系统更灵活,支持深度嵌套对象的动态追踪,并且在性能上也有所提升。

🦆
你在项目中遇到过哪些 Vue 响应式系统相关的 bug?你是如何解决的?

这个问题旨在考察候选人是否在实践中遇到并解决过实际问题。理想的回答应该描述一个或多个实际的 bug 场景,如数据没有正确更新、页面不刷新等,并详细解释解决过程,体现出对 Vue 响应式系统的深刻理解。

🦆
在 Vue 中如何实现一个全局状态管理?

全局状态管理可以通过 Vuex 实现,Vuex 是一个专为 Vue.js 应用设计的状态管理模式。它通过集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。在实际应用中,使用 Vuex 可以有效解决多个组件之间共享状态的问题。

🦆
Vue 中的计算属性和侦听器 Watchers 有什么区别?什么时候使用?

计算属性 (computed) 是基于它们的依赖进行缓存的,只有当依赖的响应式数据发生变化时才会重新计算,适用于需要基于已有数据派生出新的数据的场景。而侦听器 (watchers) 则用于执行更复杂的异步或开销较大的操作,适用于需要在数据变化时执行一些副作用操作的场景。