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

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

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

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

使用示例

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

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

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

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

为了确保新添加的属性是响应式的,可以使用 vm.$set7yB28资讯网——每日最新资讯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 转换为响应式属性。7yB28资讯网——每日最新资讯28at.com

vm.$set 的实现

Vue 源码中 set 方法的实现(Vue 2.x)大致如下:7yB28资讯网——每日最新资讯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 将新属性定义为响应式属性,并触发依赖更新,确保视图能够正确更新。7yB28资讯网——每日最新资讯28at.com

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

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

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

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

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

标签:
  • 热门焦点
  • 掘力计划第 20 期:Flutter 混合开发的混乱之治

    在掘力计划系列活动第20场,《Flutter 开发实战详解》作者,掘金优秀作者,Github GSY 系列目负责人恋猫的小郭分享了Flutter 混合开发的混乱之治。Flutter 基于自研的 Skia 引擎
  • 服务存储设计模式:Cache-Aside模式

    Cache-Aside模式一种常用的缓存方式,通常是把数据从主存储加载到KV缓存中,加速后续的访问。在存在重复度的场景,Cache-Aside可以提升服务性能,降低底层存储的压力,缺点是缓存和底
  • 腾讯VS网易,最卷游戏暑期档,谁能笑到最后?

    作者:无锈钵来源:财经无忌7月16日晚,上海1862时尚艺术中心。伴随着幻象的精准命中,硕大的荧幕之上,比分被定格在了14:12,被寄予厚望的EDG战队以绝对的优势战胜了BLG战队,拿下了总决
  • “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • 阿里大调整

    来源:产品刘有媒体报道称,近期淘宝天猫集团启动了近年来最大的人力制度改革,涉及员工绩效、层级体系等多个核心事项,目前已形成一个初步的“征求意见版”:1、取消P序列
  • 华为HarmonyOS 4.0将于8月4日发布 或搭载AI大模型技术

    华为宣布HarmonyOS4.0将于8月4日正式发布。此前,华为已经针对开发者公布了HarmonyOS4.0,以便于开发者提前进行适配,也因此被曝光出了一些新系统的特性
  • AMD的AI芯片转单给三星可能性不大 与台积电已合作至2nm制程

    据 DIGITIMES 消息,英伟达 AI GPU 出货逐季飙升,接下来 AMD MI 300 系列将在第 4 季底量产。而半导体业内人士表示,近日传出 AMD 的 AI 芯片将转单给
  • iQOO 11S或7月上市:搭载“鸡血版”骁龙8Gen2 史上最强5G Soc

    去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,iQOO 11不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞屏,同时在快充
  • 中关村论坛11月25日开幕,15位诺奖级大咖将发表演讲

    11月18日,记者从2022中关村论坛新闻发布会上获悉,中关村论坛将于11月25至30日在京举行。本届中关村论坛由科学技术部、国家发展改革委、工业和信息化部、国务
Top