当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对象)时,向对象中添加新的属性,如果更新此属性的值,是不会更新视图的。 ## this.$set的作用 this.$set实现什么功能,为什么要用它?当发现我们给对象加了一个属性,在控制台能打印出来,但是却没有更新到视图上时,也许这个时候就需要用到`this.$set()`这个方法了。简单来说 this.$set 的功能就是解决这个问题的啦。 > 官方解释:向响应式对象中添加一个属性,并确保这个新属性同样是响应式的,且触发视图更新。它必须用于向响应式对象上添加新属性,因为 Vue 无法探测普通的新增属性(比如 this.myObject.newProperty = ‘hi’),你会发现vue官网是 vue.set,vue.set的用法,连接https://cn.vuejs.org/v2/api/#Vue-set 我们现在讲的这个`this.$set()`和它有什么关系呢?咱先说`this.$set()`,因为他们俩的区别就涉及原理问题啦。 ## this.$set怎么使用 ### 1.vue 中写在标签的代码 ```javascript <template> <div id="app"> <p v-for="item in items" :key="item.id"> {{item.message}} </p> <button class="btn" @click="handClick()"> 更改数据 </button> </div> </template> <script> export default { name: 'App', data () { return { items: [ { message: "one", id: "1" }, { message: "two", id: "2" }, { message: "three", id: "3" } ] } }, mounted () { this.items[0] = { message:'first',id:'4'} //此时对象的值更改了,但是视图没有更新 // let art = {message:'first',id:"4"} // this.$set(this.items,0,art) //$set 可以触发更新视图 }, methods: { handClick(){ let change = this.items[0] change.message="shen" this.$set(this.items,0,change) } } } </script> ``` ### 2. 这个例子是对象,所以没有用push  export default{}中data数据  > 在点击按钮触发changeValue方法, 调用方法:this.$set( target, key, value ) target:要更改的数据源(可以是对象或者数组) key:要更改的具体数据 value :重新赋的值  在没有点击按钮的时候,界面是这样的,虽然界面没有显示出来,但是控制台已经打印出来了   当点击按钮的时候,调用this.$set方法,成功显示第三个属性,这就是整个过程啦。 ### this.$set应用场景 当你需要为对象添加一个新属性时,或者遇到上边所说的问题的时候可以试试这个方法。