我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Vue.set()和this.$set()使用和区别

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Vue.set()和this.$set()使用和区别

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


data () {
  return {
    student: {
      name: '',
      sex: ''
    }
  }
}
mounted () { // ——钩子函数,实例挂载之后
  this.student.age = 24
}

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

正确写法:this.$set(this.data,”key”,value')


mounted () {
  this.$set(this.student,"age", 24)
}

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

例如:


const app = new Vue({
  data: {
    a: 1
  }
  // render: h => h(Suduko)
}).$mount('#app1')

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

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


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

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

我们先来看看Vue.set()的源码:


import { set } from '../observer/index'

...
Vue.set = set
...

再来看看this.$set()的源码:


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原型上。


function set (target: Array<any> | Object, key: any, val: any): any {
  if (process.env.NODE_ENV !== 'production' &&
    (isUndef(target) || isPrimitive(target))
  ) {
    warn(`Cannot set reactive property on undefined, null, or primitive value: ${(target: any)}`)
  }
  if (Array.isArray(target) && isValidArrayIndex(key)) {
    target.length = Math.max(target.length, key)
    target.splice(key, 1, val)
    return val
  }
  if (key in target && !(key in Object.prototype)) {
    target[key] = val
    return val
  }
  const ob = (target: any).__ob__
  if (target._isVue || (ob && ob.vmCount)) {
    process.env.NODE_ENV !== 'production' && warn(
      'Avoid adding reactive properties to a Vue instance or its root $data ' +
      'at runtime - declare it upfront in the data option.'
    )
    return val
  }
  if (!ob) {
    target[key] = val
    return val
  }
  defineReactive(ob.value, key, val)
  ob.dep.notify()
  return val
}

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

参考:

vue中遇到的坑 --- 变化检测问题(数组相关)

到此这篇关于Vue.set()和this.$set()使用和区别的文章就介绍到这了,更多相关Vue.set()和this.$set()内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Vue.set()和this.$set()使用和区别

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Vue.set()和this.$set()的区别是什么

Vue.set()和this.$set()的区别是什么?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。data () { return { student: {
2023-06-15

Vue中的Vue.set和this.$set怎么使用

这篇文章主要介绍“Vue中的Vue.set和this.$set怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue中的Vue.set和this.$set怎么使用”文章能帮助大家解决问题。一、
2023-06-29

MySQL update set 和 and的区别

问题描述最近接到一个奇怪的咨询,update 语句执行没有报错,但是没有更新数据,具体有问题的语句类似于如下形式:update test.stu set cname = '0' and math = 90 and his = 80 wher
2022-05-14

Vuex中this.$store.commit()和this.$store.dispatch()区别是什么

这篇文章主要讲解了“Vuex中this.$store.commit()和this.$store.dispatch()区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vuex中this
2023-06-29

java中this和super有什么区别

这篇文章将为大家详细讲解有关java中this和super有什么区别,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,
2023-06-14

java中super和this有什么区别

在Java中,super和this是两个关键字,用于引用父类和当前类的实例。1. super关键字:- super关键字用于引用父类的成员变量和方法。- super关键字必须在子类的构造方法的第一行。- 使用super关键字可以调用父类的构
2023-08-11

php中get和set有哪些区别

这篇文章主要介绍“php中get和set有哪些区别”,在日常操作中,相信很多人在php中get和set有哪些区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php中get和set有哪些区别”的疑惑有所帮助!
2023-06-29

java中this和super的区别是什么

java中this和super的区别是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、We
2023-06-14

php中get和set的区别是什么

php中get和set的区别:“__get()”方法是用于获取私有成员属性值的,返回的结果是获取到的属性值,而“__set()”方法是用于设置私有成员属性值的,该方法没有返回值。
2014-11-04

编程热搜

目录