Vue中$set

$set

你在vue开发中有没有遇见过 模型数据改变了 但是视图没有发生改变的情况 是怎么解决这个问题的?

出现的场景

当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对象)时,向对象中添加新的属性,如果更新此属性的值,是不会更新视图的。

<template>
<div class="hello">
    <h1>$set</h1>
    你在vue开发中有没有遇见过 模型数据改变了 但是视图没有发生改变的情况 是怎么解决这个问题的?
    <h1>{{arr.name}}-----{{arr.age}}</h1>
    <button @click="fun()">点我添加一个age</button>
</div>
</template>

<script>
export default {
data(){
  return {
    arr:{
      name:"xixi"
    }
  }
},
methods:{
  fun(){

    this.arr.age=18
    console.log(this.arr.age)
  }
},
name: 'HelloWorld',
props: {
  msg: String
}
}
</script>


<style >

</style>

出现这种情况的原理

官方这样说:

当你把一个普通的 JavaScript 对象传入 Vue 实例作为 data 选项,Vue 将遍历此对象所有的属性,并使用 Object.defineProperty 把这些属性全部转为 getter/setter。 受现代 JavaScript 的限制 (以及废弃 Object.observe),Vue 不能检测到对象属性的添加或删除。由于 Vue 会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 data 对象上存在才能让 Vue 转换它,这样才能让它是响应的。

 

简单点来解释:

Object.defineProperty只会在初始化的时候监听data模型数据 如果中途加入新的对象属性 那么这个方法就不会监听到 不监听也就没有了双向绑定 没有了双向绑定就不会有模型变了视图发生改变这一说

 

解决问题

$set()

<template>
<div class="hello">
    <h1>$set</h1>
    你在vue开发中有没有遇见过 模型数据改变了 但是视图没有发生改变的情况 是怎么解决这个问题的?
    <h1>{{arr.name}}-----{{arr.age}}</h1>
    <button @click="fun()">点我添加一个age</button>
</div>
</template>

<script>
export default {
data(){
  return {
    arr:{
      name:"xixi"
    }
  }
},
methods:{
  fun(){

    // this.arr.age=18
    // this.$set(要操作的数据,新增的内容,值)
    this.$set(this.arr,"age",19)
    console.log(this.arr.age)
  }
},
name: 'HelloWorld',
props: {
  msg: String
}
}
</script>


<style scoped>

</style>
posted @ 2021-12-02 12:30  Teil  阅读(134)  评论(0编辑  收藏  举报