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

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

原创
作者头像
用户1349575
发布于 2022-02-22 05:19:29
发布于 2022-02-22 05:19:29
1.2K00
代码可运行
举报
文章被收录于专栏:编程社区编程社区
运行总次数:0
代码可运行

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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
代码运行次数:0
运行
AI代码解释
复制
setMessage:function(){
     this.$set(this.student,'age','18')
     console.log(this.student)
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
var vm=new Vue({
    el:'#test',
    data:{
        //data中已经存在info根属性
        info:{
            name:'小明';
        }
    }
});
//给info添加一个性别属性
Vue.set(vm.info,'sex','男');

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

Vue.set()的源码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { set } from '../observer/index'

...
Vue.set = set
...

this.$set()的源码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
vue中 this.$set的用法
当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对象)时,向对象中添加新的属性,如果更新此属性的值,是不会更新视图的。
IT工作者
2022/02/23
1K0
Vue.set与this.$set源码
在 Vue 2.X 项目开发中,有时候需要对数组进行修改,或是对对象新增一个属性,但是发现页面并不会同步更新。例如:
骤雨重山
2023/04/27
3050
Vue学习笔记②
计算属性将被混入到 Vue 实例中。所有 getter 和 setter 的 this 上下文自动地绑定为 Vue 实例。
ymktchic
2022/01/18
6910
Vue学习笔记②
vue.set()与this.$set()用法与区别
vue初始化实例对象的时候会把属性转为setter/getter,这样数据才会是动态响应的(即data中的数据是动态响应的),vue才能够监听到属性的添加、删除、修改(受ES5的限制)
can4hou6joeng4
2023/11/29
1640
Vue技术之列表渲染
更新时的一个问题 this.persons[0] = {id:'001',name:'马老师',age:50,sex:'男'} 更改data数据,Vue不监听,模板不改变。
张哥编程
2024/12/13
920
Vue技术之列表渲染
Vue-基础核心(二)
​ v-if可以和v-else-if、v-else一起使用,但要求结构不能被“打断”
小沐沐吖
2022/09/09
1.1K0
Vue-基础核心(二)
腾讯二面vue面试题总结
对象内部通过 defineReactive 方法,使用 Object.defineProperty 来劫持各个属性的 setter、getter(只会劫持已经存在的属性),数组则是通过重写数组7个方法来实现。当页面使用对应属性时,每个属性都拥有自己的 dep 属性,存放他所依赖的 watcher(依赖收集),当属性变化后会通知自己对应的 watcher 去更新(派发更新)
bb_xiaxia1998
2022/11/18
7530
Vue中的$set的使用
在我们使用vue进行开发的过程中,可能会遇到一种情况:当生成vue实例后,当再次给数据赋值时,有时候并不会自动更新到视图上去; 当我们去看vue文档的时候,会发现有这么一句话:如果在实例创建之后添加新的属性到实例上,它不会触发视图更新。如下代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>vue $set</title> <script src="https://static.runoob.com/assets/vue/1.0.1
李文杨
2018/03/14
1.5K0
Vue中的$set的使用
美团前端vue面试题_2023-05-19
Vue3最重要更新之一就是Composition API,它具有一些列优点,其中不少是针对Options API暴露的一些问题量身打造。是Vue3推荐的写法,因此掌握好Composition API应用对掌握好Vue3至关重要
用户10358241
2023/05/19
1K0
Vue常用特性-数组变异方法与动态数组响应式数据
数组变异方法 在 Vue 中,直接修改对象属性的值无法触发响应式。当你直接修改了对象属性的值,你会发现,只有数据改了,但是页面内容并没有改变 变异数组方法即保持数组方法原有功能不变的前提下对其进行功能拓展 push() 往数组最后面添加一个元素,成功返回当前数组的长度 pop() 删除数组的最后一个元素,成功返回删除元素的值 shift() 删除数组的第一个元素,成功返回删除元素的值 unshift() 往数组最前面添加一个元素,成功返回当前数组的长度 splice() 有三个参数,第一个是想要
梨涡浅笑
2020/12/02
1.3K0
第十六章 vue数据监测原理
概念: **​​Object.defineProperty()​​ **方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。
张哥编程
2024/12/13
850
校招前端二面高频vue面试题
在Vue中,对响应式处理利用的是Object.defineProperty对数据进行拦截,而这个方法并不能监听到数组内部变化,数组长度变化,数组的截取变化等,所以需要对这些操作进行hack,让Vue能监听到其中的变化。 那Vue是如何实现让这些数组方法实现元素的实时更新的呢,下面是Vue中对这些方法的封装:
bb_xiaxia1998
2022/12/20
1.5K0
Vue.set()方法
Vue.set() 方法用于在 Vue 实例中的响应式对象中设置属性值。它的语法如下:
堕落飞鸟
2023/05/21
9380
Vue第二天
小城故事
2024/08/24
910
Vue 全家桶,深入Vue 的世界
可以看到text值的变化是0 5 10 15 … 而并没有出现 0 1 2 3 … 这样连续的变化
FinGet
2019/06/28
2.7K0
Vue 全家桶,深入Vue 的世界
阿里前端面试问到的vue问题
虽然文档不建议在应用中直接使用 mixin,但是如果不滥用的话也是很有帮助的,比如可以全局混入封装好的 ajax 或者一些工具函数等等。
bb_xiaxia1998
2022/10/29
9270
vue 中 $set与$delete的使用
Vue无法检测property的添加或移除,由于Vue会在初始化实例时对property执行getter/setter转换,所以propterty必须在data对象上存在才能让Vue将它转换为响应式的。例如
tianyawhl
2020/06/22
1.1K0
Vue基础:响应式
Vue不是框架(前端框架往往需要解决路由、试图管理、数据持久化等流程),Vue只关注视图层。
奋飛
2019/08/15
1.1K0
实现简易的 Vue 响应式
我们首先封装一个响应式处理的方法 defineReactive,通过 defineProperty 这个方法重新定义对象属性的 get 和 set 描述符,来实现对数据的劫持,每次 读取数据 的时候都会触发 get ,每次 更新数据 的时候都会触发 set ,所以我们可以在 set 中触发更新视图的方法 update 来实现一个基本的响应式处理。
PHP开发工程师
2022/03/23
4630
实现简易的 Vue 响应式
前端高频vue面试题总结3
通过webpack的tree-shaking功能,可以将无用模块“剪辑”,仅打包需要的
bb_xiaxia1998
2023/01/05
1.2K0
相关推荐
vue中 this.$set的用法
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验