this.$set用法和作用

1,283 阅读1分钟

在工作中遇到数据变了,但是视图没有改变的时候可以使用this.$set方法

用法

向响应式对象中添加一个 property,并确保这个新 property 同样是响应式的,且触发视图更新。
它必须用于向响应式对象上添加新 property

参数

调用方法:this.$set( target, key, value )
target:要更改的数据源(可以是对象或者[数组])
key:要更改的具体数据
value :重新赋的值

对象实例

我们在项目开发的过程中,经常会遇到这种情况:为data中的某一个对象添加一个属性

<template>
  <div>
    <button @click="setData">添加属性</button>
    {{ obj.name }}
    <input v-model="obj.age">
  </div>
</template>

当我们点击按钮,为student添加一个age属性,输入出数据已加上,但是视图没有更数据

<script>
export default {
  data() {
    return {
      student: {
        name: '张三',
      }
    }
  },
  methods: {
    setMessage() {
      this.student.age = 15
      console.log(this.student)
    }
  }
}
</script>

在这里我们发现虽然这个对象身上已经有了该属性,但是视图层并没有更新该数据,是什么造成的呢?由于受JavaScript的限制,vue.js不能监听对象属性的添加和删除,因为在vue组件初始化的过程中,会调用getter和setter方法,所以该属性必须是存在在data中,视图层才会响应该数据的变化

使用this.$set(obj, key, value)
this.$set(this.student, 'age', 15)

数组实例

我们在项目开发的过程中,经常会遇到这种情况:改变数组第一个对象的数据,

<template>
 <div id="app">
	  <p v-for="item in items" :key="item.id">
	  	{{item.message}}
	  </p>
 </div>
</template>
<script>
export default {
 data () {
  return {
   items: [
        { message: "one", id: "1" },
        { message: "two", id: "2" },
        { message: "three", id: "3" }
      ]
  }
 },
 mounted () {
    // this.items[0] = { message:'ximi',id:'4'} //此时对象的值更改了,但是视图没有更新
   let art = {message:'ximi',id:"4"} 
   this.$set(this.items,0,art) //$set 可以触发更新视图
 },
}
</script>