当前位置:首页 > 科技  > 软件

有使用过vm.$set吗,原理是什么?

来源: 责编: 时间:2024-07-09 06:59:09 879观看
导读vm.$set 是 Vue.js 提供的一个方法,用于在 Vue 实例中动态添加响应式属性。它的主要作用是确保新添加的属性能够被 Vue 的响应式系统监测到,从而触发视图的更新。使用示例假设我们有一个 Vue 实例var vm = new Vue({ d

vm.$set 是 Vue.js 提供的一个方法,用于在 Vue 实例中动态添加响应式属性。它的主要作用是确保新添加的属性能够被 Vue 的响应式系统监测到,从而触发视图的更新。iKt28资讯网——每日最新资讯28at.com

使用示例

假设我们有一个 Vue 实例iKt28资讯网——每日最新资讯28at.com

var vm = new Vue({  data: {    user: {      name: 'Alice'    }  }});

我们希望在 user 对象中添加一个新的属性 age。直接添加不会触发视图更新iKt28资讯网——每日最新资讯28at.com

vm.user.age = 25; // 直接添加不会触发视图更新

为了确保新添加的属性是响应式的,可以使用 vm.$setiKt28资讯网——每日最新资讯28at.com

vm.$set(vm.user, 'age', 25);

原理

Vue 的响应式系统是基于 Object.defineProperty 实现的。当一个对象被添加到 Vue 实例的 data 中时,Vue 会递归地遍历该对象的所有属性,并使用 Object.defineProperty 将这些属性转换为 getter 和 setter,从而实现响应式。然而,直接添加的新属性并没有通过这种方式定义,因此 Vue 无法检测到这些新属性的变化。vm.$set 方法内部使用了 Vue 的 set 方法,它会确保新添加的属性也能通过 Object.defineProperty 转换为响应式属性。iKt28资讯网——每日最新资讯28at.com

vm.$set 的实现

Vue 源码中 set 方法的实现(Vue 2.x)大致如下:iKt28资讯网——每日最新资讯28at.com

function set(target, key, val) {  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.__ob__;  if (!ob) {    target[key] = val;    return val;  }  defineReactive(ob.value, key, val);  ob.dep.notify();  return val;}function defineReactive(obj, key, val) {  const dep = new Dep();  let childOb = observe(val);  Object.defineProperty(obj, key, {    enumerable: true,    configurable: true,    get: function reactiveGetter() {      const value = val;      if (Dep.target) {        dep.depend();        if (childOb) {          childOb.dep.depend();        }      }      return value;    },    set: function reactiveSetter(newVal) {      const value = val;      if (newVal === value || (newVal !== newVal && value !== value)) {        return;      }      val = newVal;      childOb = observe(newVal);      dep.notify();    }  });}

总结

vm.$set 方法在 Vue 中用于动态添加响应式属性,确保新属性能够被 Vue 的响应式系统监测到。它通过 Object.defineProperty 将新属性定义为响应式属性,并触发依赖更新,确保视图能够正确更新。iKt28资讯网——每日最新资讯28at.com

使用工具学会使用只是第一步,掌握原理并能够通过原理解决问题才是关键,在平时的开发中,使用时多数,然而在遇到复杂问题或者优化时候掌握原理会提高开发效率。iKt28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-99638-0.html有使用过vm.$set吗,原理是什么?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 运小沓 Cuber・数字员工 3.0 发布,WAIC2024 壹沓科技供应链论坛顺利举办

下一篇: 我跟你说@RefreshScope跟Spring事件监听一起用有坑!

标签:
  • 热门焦点
  • 鸿蒙OS 4.0公测机型公布:甚至连nova6都支持

    华为全新的HarmonyOS 4.0操作系统将于今天下午正式登场,官方在发布会之前也已经正式给出了可升级的机型产品,这意味着这些机型会率先支持升级享用。这次的HarmonyOS 4.0支持
  • 6月安卓手机性能榜:vivo/iQOO霸占旗舰排行榜前三

    2023年上半年已经正式过去了,我们也迎来了安兔兔V10版本,在新的骁龙8Gen3和天玑9300发布之前,性能榜的榜单大体会以骁龙8Gen2和天玑9200+为主,至于那颗3.36GHz的骁龙8Gen2领先
  • 0糖0卡0脂 旭日森林仙草乌龙茶优惠:15瓶到手29元

    旭日森林无糖仙草乌龙茶510ml*15瓶平时要卖为79.9元,今日下单领取50元优惠券,到手价为29.9元。产品规格:0糖0卡0脂,添加草本仙草汁,清凉爽口,富含茶多酚,保留
  • 2023年,我眼中的字节跳动

    此时此刻(2023年7月),字节跳动从未上市,也从未公布过任何官方的上市计划;但是这并不妨碍它成为中国最受关注的互联网公司之一。从2016-17年的抖音强势崛起,到2018年的“头腾
  • 破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 阿里大调整

    来源:产品刘有媒体报道称,近期淘宝天猫集团启动了近年来最大的人力制度改革,涉及员工绩效、层级体系等多个核心事项,目前已形成一个初步的“征求意见版”:1、取消P序列
  • 消息称小米汽车开始筛选交付中心:需至少120个车位

    IT之家 7 月 7 日消息,日前,有微博简介为“汽车行业从业者、长三角一体化拥护者”的微博用户 @长三角行健者 发文表示,据经销商集团反馈,小米汽车目前
  • 华为Mate 60保护壳曝光:硕大后置相机模组 凸起程度有惊喜

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
  • 联想小新Pad Pro 12.6将要推出,搭载高通骁龙 870 处理器

    联想小新Pad Pro 12.6将于秋季新品会上推出,官方按照惯例直接在发布会前给出了机型的所有参数。联想小新 Pad Pro 12.6 将搭载高通骁龙 870 处理器,重量为 5
Top