跳到主要内容

简述Vue 怎么⽤ vm.$set() 解决对象新增属性不能响应的问 题 ?

参考答案:

在 Vue.js 中,当你试图向一个已经存在的对象添加新的属性时,Vue 可能无法检测到这个变化,因此这个新属性不会触发视图的更新。这是因为 Vue 在初始化时会遍历所有的属性,并使用 Object.defineProperty 把这些属性全部转为 getter/setter,从而可以监听属性的变化。但对于后来添加的属性,Vue 无法追踪到,所以视图不会更新。

为了解决这个问题,Vue 提供了 vm.$set() 方法。这个方法可以解决对象新增属性不能响应的问题。vm.$set() 方法接收三个参数:

  1. 目标对象
  2. 要添加的属性名(字符串形式)
  3. 要添加的属性值

vm.$set() 方法可以在不改变原对象的情况下,向对象添加新的响应式属性。当使用 vm.$set() 添加新属性后,如果属性值发生变化,视图将会更新。

例如,如果你有一个名为 item 的对象,你想添加一个名为 newProp 的新属性,你可以这样做:

this.item.newProp = 'some value' // 这样添加的新属性不会触发视图的更新

this.$set(this.item, 'newProp', 'some value') // 这样添加的新属性会触发视图的更新

使用 vm.$set() 方法添加的新属性是响应式的,当属性值发生变化时,视图会自动更新。这是因为它使用了 Vue 的响应式系统,使得新属性可以被 Vue 的依赖追踪机制追踪到。

需要注意的是,vm.$set() 只能解决对象新增属性不能响应的问题,对于数组,Vue 提供了其他的方法来处理,如 splice()push()pop()shift()unshift()sort()reverse() 等。