简述Vue 怎么⽤ vm.$set() 解决对象新增属性不能响应的问 题 ?
参考答案:
在 Vue.js 中,当你试图向一个已经存在的对象添加新的属性时,Vue 可能无法检测到这个变化,因此这个新属性不会触发视图的更新。这是因为 Vue 在初始化时会遍历所有的属性,并使用 Object.defineProperty 把这些属性全部转为 getter/setter,从而可以监听属性的变化。但对于后来添加的属性,Vue 无法追踪到,所以视图不会更新。
为了解决这个问题,Vue 提供了 vm.$set()
方法。这个方法可以解决对象新增属性不能响应的问题。vm.$set()
方法接收三个参数:
- 目标对象
- 要添加的属性名(字符串形式)
- 要添加的属性值
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()
等。