前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >this.$set()和Vue.set()

this.$set()和Vue.set()

原创
作者头像
用户1349575
发布2022-02-22 13:19:29
1.1K0
发布2022-02-22 13:19:29
举报
文章被收录于专栏:编程社区

在我们使用vue进行开发的过程中,可能会遇到一种情况:当生成vue实例后,当再次给数据赋值时,有时候并不会自动更新到识图上去;当我们去看vue文档时,会发现这么一句话:如果在实例创建之后添加新的属性到实例上,它不会触发识图更新。

代码语言:javascript
复制
<div id="app">
  <template>
    <div class="hello">
      <button @click="setMessage">添加属性</button>
      {{ student.name }}
      <input type="text" v-model="student.age">
    </div>
  </template>
</div>

代码语言:javascript
复制
 new Vue({
    el:"#app",
    data:function(){
      return{
        student:{
          name:'zz'
        }
      }
    },
    methods:{
      setMessage:function(){
        this.student.age='18'
        console.log(this.student)
      }
    }
  })

受ES5的限制,vue不能检测到对象属性的添加或删除。因为vue在初始化实例时将属性转为getter/setter,所以属性必须在data对象上才能让vue转换它,才能让它是响应的。

正确的写法:this.$set(this.student,‘key’,‘value’)

代码语言:javascript
复制
setMessage:function(){
     this.$set(this.student,'age','18')
     console.log(this.student)
}

vue不允许动态添加根级响应式属性。

代码语言:javascript
复制
const app = new Vue({
  data: {
    a: 1
  }
  // render: h => h(Suduko)
}).$mount('#app1')

Vue.set(app.data, 'b', 2)

只可以使用Vue.set(object, propertyName, value)方法向嵌套对象添加响应式属性,例如

代码语言:javascript
复制
var vm=new Vue({
    el:'#test',
    data:{
        //data中已经存在info根属性
        info:{
            name:'小明';
        }
    }
});
//给info添加一个性别属性
Vue.set(vm.info,'sex','男');

Vue.set()和this.$set()实现原理

Vue.set()的源码:

代码语言:javascript
复制
import { set } from '../observer/index'

...
Vue.set = set
...

this.$set()的源码:

代码语言:javascript
复制
import { set } from '../observer/index'

...
Vue.prototype.$set = set
...

结果我们发现Vue.set()和this.$set()这两个api的实现原理基本一模一样,都是使用了set函数。set函数是从 …/observer/index 文件中导出的,区别在于Vue.set()是将set函数绑定在Vue构造函数上,this.$set()是将set函数绑定在Vue原型上。

我们发现set函数接收三个参数分别为target、key、val,其中target的值为数组或者对象,这正好和官网给出的调用Vue.set()方法时传入的参数对应上。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档