this.$set的正确使用

this.#set(obj, key, value)

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

<template>
  <div class="hello">
    <button @click="setMessage">添加属性</button>
    {{ student.name }}
    <input type="text" v-model="student.age">
  </div>
</template>
<script>
export default {
  data() {
    return {
      student: {
        name: '张三',
      }
    }
  },
  methods: {
    setMessage() {
      this.student.age = 15
      console.log(this.student)
    }
  }
}
</script>

当我们点击按钮,为student添加一个age属性,看看视图层是否能够更新

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

那么,我们该如何解决这个问题呢
解决这个问题的方法大体有两种:

  1. 使用this.$set(obj, key, value)/vue.set(obj, key, value)
<script>
export default {
 data() {
   return {
     student: {
       name: '张三',
     }
   }
 },
 methods: {
   setMessage() {
     this.$set(this.student, 'age', 15)
     console.log(this.student)
   }
 }
}
</script>
  1. 通过Object.assign(target, sources)方法
<script>
export default {
  data() {
    return {
      student: {
        name: '张三',
      }
    }
  },
  methods: {
    setMessage() {
      this.student.age = 15
      this.student = Object.assign({}, this.student)
      console.log(this.student)
    }
  }
}
</script>

我们发现,通过这两种方式为对象添加属性之后,他的对象身上多了get和set方法,所以,此时我们再次操作该属性的时候,就会引起视图的更新啦
在这里插入图片描述

  • 179
    点赞
  • 556
    收藏
    觉得还不错? 一键收藏
  • 40
    评论
this.$set()是Vue.js提供的一个方法,用于在Vue实例中改变数组或对象的值,并且能够驱动视图更新。这个方法的语法是this.$set(object, key, value),其中object是要改变的数组或对象,key是要改变的属性名或索引,value是要设置的新值。通过调用this.$set()方法,Vue会在内部使用一些技巧来触发视图的重新渲染,确保更新后的数据能够正确地显示在界面上。 举个例子,如果你有一个数组arr,想要改变其中某个索引的值,并且让v-for指令更新对应的视图,你可以使用this.$set()方法来实现。比如,假设你要将数组arr中的第一个元素改为新的值newValue,你可以这样写代码:this.$set(arr, 0, newValue)。这样,Vue会自动更新视图,显示新的值。 此外,如果你想在Vue组件的方法中使用this.$set(),需要确保该方法是在Vue实例中定义的,并且要传入正确的作用域scope。例如,在beginEdit方法中使用this.$set()来改变数组arr的某个索引的值,可以这样写代码:this.$set(this.arr, scope.$index, true)。这样就可以将指定索引位置的值设置为true,并且能够触发视图更新。 总之,使用this.$set()可以在Vue中改变数组或对象的值,并且能够自动更新视图,保证界面显示的数据与实际数据同步。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [this.$set的用法](https://blog.csdn.net/m0_59006402/article/details/119918110)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 40
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值