广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue.set()和this.$set()使用和区别
  • 399
分享到

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

2024-04-02 19:04:59 399人浏览 独家记忆
摘要

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

在我们使用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()内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Vue.set()和this.$set()使用和区别

本文链接: https://www.lsjlt.com/news/127411.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Vue.set()和this.$set()使用和区别
    在我们使用vue进行开发的过程中,可能会遇到一种情况:当生成vue实例后,当再次给数据赋值时,有时候并不会自动更新到视图上去; 当我们去看vue文档的时候,会发现有这么一句话:如果在...
    99+
    2022-11-12
  • Vue.set()和this.$set()的区别是什么
    Vue.set()和this.$set()的区别是什么?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。data () {  return&...
    99+
    2023-06-15
  • Vue中的Vue.set和this.$set怎么使用
    这篇文章主要介绍“Vue中的Vue.set和this.$set怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue中的Vue.set和this.$set怎么使用”文章能帮助大家解决问题。一、...
    99+
    2023-06-29
  • Vue.set与this.$set的用法与使用场景介绍
    目录Vue.set()和this.$set()介绍:一。为什么有Vue.set二。解决方法数组对象三。Vue.set对于数组对于对象注意四。使用场景Vue.set()和this.$s...
    99+
    2022-11-13
  • Vuex中this.$store.commit()和this.$store.dispatch()区别说明
    目录this.$store.commit()和this.$store.dispatch()的区别commit: 同步操作dispatch: 异步操作其他了解Vuex应用实例this....
    99+
    2022-11-13
  • MySQL update set 和 and的区别
    问题描述 最近接到一个奇怪的咨询,update 语句执行没有报错,但是没有更新数据,具体有问题的语句类似于如下形式: update test.stu set cname = '0' and math ...
    99+
    2022-05-14
    MySQL update set MySQL update and
  • Java 中的 this 和 super 区别
    目录1、简介2、引子2.1 父类中声明无参构造函数2.2 子类显示的通过super调用父类的有参构造函数3、this4、super 5、总结5.1 对比差异 5.2 相同点 5.3 ...
    99+
    2022-11-12
  • Vuex中this.$store.commit()和this.$store.dispatch()区别是什么
    这篇文章主要讲解了“Vuex中this.$store.commit()和this.$store.dispatch()区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vuex中this...
    99+
    2023-06-29
  • ssl和set的区别是什么
    ssl和set的区别:ssl是基于传输层的协议,而set则是基于应用层的协议。ssl在建立安全通道之后,会将有所传输的信息都加密,而set会有选择地加密一部分敏感信息。ssl缺乏一套完整的认证体系,不能提供完备的防抵赖功能,因此set的安全...
    99+
    2022-10-04
  • Java中this和super的区别及this能否调用到父类使用
    目录1.super 关键字1.1 super 方法使用1.2 super 属性使用2.this 关键字2.1 this 属性使用2.2 this 方法使用2.3 this 访问父类方...
    99+
    2022-11-13
  • Vue中this.$router和this.$route的区别及push()方法
    官房文档里是这样说明的: 通过注入路由器,我们可以在任何组件内通过 this.$router 访问路由器,也可以通过 this.$route ...
    99+
    2022-11-12
  • php中get和set有哪些区别
    这篇文章主要介绍“php中get和set有哪些区别”,在日常操作中,相信很多人在php中get和set有哪些区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php中get和set有哪些区别”的疑惑有所帮助!...
    99+
    2023-06-29
  • java中this和super有什么区别
    这篇文章将为大家详细讲解有关java中this和super有什么区别,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,...
    99+
    2023-06-14
  • java中super和this有什么区别
    在Java中,super和this是两个关键字,用于引用父类和当前类的实例。1. super关键字:- super关键字用于引用父类...
    99+
    2023-08-11
    java
  • php中get和set的区别是什么
    本教程操作环境:windows10系统、PHP7.1版、DELL G3电脑php中get和set的区别是什么一般来说,总是把类的属性定义为private,这更符合现实的逻辑。但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义...
    99+
    2014-11-04
    PHP
  • redis中set和list的区别有哪些
    这篇文章给大家分享的是有关redis中set和list的区别是什么的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。list和set的区别:1、List和Set都是接口继承于Coll...
    99+
    2022-10-18
  • java中set和list的区别是什么?
    Java中的集合共包含三大类,它们分别是Set(集),List(列表)以及Map(映射)。它们都处在java.util中并且都为接口。它们各自都有各自的实现类。下面给大家介绍一下set和list的区别,希望对大家有所帮助。java中set和...
    99+
    2020-08-03
    java入门 java set list
  • es6的set和map的区别有哪些
    今天小编给大家分享一下es6的set和map的区别有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来...
    99+
    2022-10-19
  • Java中的this和super区别是什么
    这篇文章主要介绍“Java中的this和super区别是什么”,在日常操作中,相信很多人在Java中的this和super区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的this和supe...
    99+
    2023-06-25
  • 浅谈synchronized加锁this和class的区别
    目录synchronized 用法1.加锁 class 共享一个类实例2.加锁 class 创建多个实例3.加锁 this 共享一个类实例4.加锁 this 创建多个类实例总结syn...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作