vue2源码解析——Vue.set/$set方法如何给响应式对象添加属性

news2024/9/22 13:38:00

在Vue 2中需要向响应式对象添加新属性时,可以使用Vue.set$set方法来实现。这两个方法的作用是向响应式对象添加属性并确保这个新属性也是响应式的。

 为什么会有vue.set方法

Vue提供了Vue.set方法主要是为了解决在Vue 2.x 中动态添加属性时可能遇到的响应性问题。

在Vue中,当一个对象被创建时,Vue会将其属性转换为响应式属性,以便能够在属性发生变化时触发视图更新。然而,如果在已经创建的对象上直接添加新属性,新属性默认不会具有响应性,因为Vue无法在对象被创建时对新属性进行响应式处理。

为了解决这个问题,Vue提供了Vue.set方法。通过Vue.set方法,Vue能够动态地向已有的响应式对象添加新属性,并确保这个新属性也是响应式的,从而能够在新属性发生变化时触发视图更新。

vue.set方法怎么实现的

vue.set方法首先会区分是对数组还是对象进行新增属性:

数组新增元素

如果是数组:利用vue2改写后的splice方法进行元素插入(此时$set是向数组里新增一个元素)。

对象新增key和value

如果是对象分情况讨论

    对象本身就有这个key,替换传进来的value即可,不用考虑对象是否为响应式
    对象本身没有这个key。考虑对象是否为响应式对象。如果是响应式对象,调用defineReactive给当前对象的key增加响应式依赖。否则,对象不是响应式的,直接给对象加属性,不用考虑响应式问题。

思考:如何知道对象是不是响应式的对象?

在Vue中,每个响应式对象都会有一个__ob__属性,该属性是一个Observer对象,用于跟踪对象的变化。通过检查对象是否具有__ob__属性,可以判断一个对象是否是响应式的。

Vue.set / $set 伪代码实现

在Vue 2中,Vue.set$set方法的实现原理主要涉及到响应式系统中的依赖收集和触发更新机制。下面是这两个方法源码的简单实现:

首先,入参是目标对象obj,新增的属性key值,新增的属性value值

其次:按照流程先判断是否为数组,用Array.isArray等判断,对数组的新增用splice方法

用key in obj判断key是否是obj中已有的属性,如果是,直接修改value值。

判断是否为响应式对象,利用响应式对象本身被加了__ob__属性区分。如果不是响应式这届修改。

继续,如果以上都不成立,那么就是给响应式对象obj添加一个响应式属性key,调用defineReactive方法给对象的指定key加响应式。

// Vue.set 方法定义
Vue.set = function (obj, key, value) {
 //判断是否为数组
  if (Array.isArray(obj) && isValidArrayIndex(key)) {
    obj.length = Math.max(obj.length, key);
    obj.splice(key, 1, value);//数组新增元素调用splice
    return value;
  }
 //判断对象本身是否有这个key
  if (key in obj && !(key in Object.prototype)) {
    obj[key] = value;
    return value;
  }
//vue在响应式拦截的时候会为定义响应式的对象加上__ob__属性,可以用它区分对象是否为响应式对象
  const ob = obj.__ob__;
//非响应式对象
  if (!ob) {
    obj[key] = value;
    return value;
  }
//响应式对象,给这个key加响应式
  defineReactive(ob.value, key, value);
  ob.dep.notify();
  return value;
};

// $set 方法定义
Vue.prototype.$set = function (target, key, value) {
  return Vue.set(target, key, value);
};

源码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1552724.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

八大技术趋势案例(区块链量子计算)

科技巨变,未来已来,八大技术趋势引领数字化时代。信息技术的迅猛发展,深刻改变了我们的生活、工作和生产方式。人工智能、物联网、云计算、大数据、虚拟现实、增强现实、区块链、量子计算等新兴技术在各行各业得到广泛应用,为各个领域带来了新的活力和变革。 为了更好地了解…

钡铼技术R40路由器助力智能船舶航行数据实时传输与分析

钡铼技术R40路由器在智能船舶领域的应用,对于航行数据的实时传输与分析具有重要意义。随着航运业的不断发展和智能化水平的提升,船舶航行数据的及时传输和有效分析对船舶的安全、运营效率等方面至关重要。而引入钡铼技术R40路由器,则可以实现…

前后端分离开发【Yapi平台】【Swagger注解自动生成接口文档平台】

前后端分离开发 介绍开发流程Yapi(api接口文档编写平台)介绍 Swagger使用方式1). 导入knife4j的maven坐标2). 导入knife4j相关配置类3). 设置静态资源映射4). 在LoginCheckFilter中设置不需要处理的请求路径 查看接口文档常用注解注解介绍 当前项目中&am…

Eclipse+Java+Swing实现斗地主游戏

一. 视频演示效果 java斗地主源码演示 ​ 二.项目结构 代码十分简洁,只有简单的7个类,实现了人机对战 素材为若干的gif图片 三.项目实现 启动类为Main类,继承之JFrame,JFrame 是 Java Swing 库中的一个类,用于创建窗…

Cisco Firepower FMCv修改管理Ip方法

FMCv 是部署在VMWARE虚拟平台上的FMC 部署完成后,如何修改管理IP 1 查看当前版本 show version 可以看到是for VMware 2 修改管理IP步骤 2.1 进入expert模式 expert2.2 进入超级用户 sudo su并输入密码 2.3 查看当前网卡Ip 2.4 修改Ip 命令: /…

Scala第十三章节(作为值的函数及匿名函数、柯里化、闭包及控制抽象以及计算器案例)

章节目标 掌握作为值的函数及匿名函数的用法了解柯里化的用法掌握闭包及控制抽象的用法掌握计算器案例 1.高阶函数介绍 Scala 混合了面向对象和函数式的特性,在函数式编程语言中,函数是“头等公民”,它和Int、String、Class等其他 类型处于…

Unity3d使用Jenkins自动化打包(Windows)(二)

文章目录 前言一、Unity工程准备二、Unity调取命令行实战一实战二实战三实战四实战五 总结 前言 自动化打包的价值在于让程序员更轻松地创建和管理构建工具链,提高编程效率,将繁杂的工作碎片化,变成人人(游戏行业特指策划&#x…

ChatGPT 商业金矿(上)

原文:ChatGPT Business Goldmines 译者:飞龙 协议:CC BY-NC-SA 4.0 第一章:为什么我写这本书 欢迎阅读《ChatGPT 多源收入:20 个利润丰厚的业务,任何人都可以在一周内使用 ChatGPT 开始》。我很高兴分享我…

C语言例4-32:利用for语句实现循环次数未知的例子

从键盘输入若干个整数&#xff0c;求其中的最大者和最小者&#xff0c;直到输入“0”为止 算法分析&#xff1a; 读取第一个整数i&#xff0c;并假设它是当前最大整数max&#xff0c;也是当前最小整数min当,则重复执行以下操作&#xff0c;若i<min&#xff0c;则mini;从键…

Java中读取html文件转成String,展示在浏览器

这里写目录标题 第一章1.1&#xff09;pom中引入依赖和html文件示例1.2&#xff09;使用hutool工具包读取html文件转为string1.3&#xff09;页面显示 第一章 1.1&#xff09;pom中引入依赖和html文件示例 引入hutool工具包依赖 <dependency><groupId>cn.hutool&…

华为防火墙配置指引超详细(包含安全配置部分)以USG6320为例

华为防火墙USG6320 华为防火墙USG6320是一款高性能、高可靠的下一代防火墙,适用于中小型企业、分支机构等场景。该防火墙支持多种安全功能,可以有效抵御网络攻击,保护网络安全。 目录 华为防火墙USG6320 1. 初始配置 2. 安全策略配置 3. 防火墙功能配置 4. 高可用性配…

iPhone用GPT替代Siri

shigen坚持更新文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 个人IP&#xff1a;shigen 前一段时间&#xff0c;因为iCloud协议的更新&#xff0c;我的云盘空间无法正常…

Starrocks基于主机和容器的读写测试

背景介绍 在云原生时代&#xff0c;存算分离架构显然已经是当下大数据架构的必备选型&#xff0c;但是在不同的虚拟化计算资源&#xff08;主机、容器&#xff09;之上&#xff0c;是否能有差异点以及对于不同服务的性能损耗程度如何&#xff1f;来判断应该在什么样的场景下选…

Micron 256 GB DDR5-8800 MCR DIMM:适用于大型服务器的大型内存

美光本周宣布&#xff0c;它已经开始对其 256 GB multiplexer combined &#xff08;MCR&#xff09; DIMM 进行采样&#xff0c;这是该公司迄今为止容量最大的内存模块。这些全新的基于 DDR5 的 MCRDIMM 面向下一代服务器&#xff0c;特别是那些由英特尔至强可扩展“Granite R…

Nginx官方镜像Dockerfile浅析

目录 Dockerfile获取 dfimage逆向获取 Nginx官网获取 Dockerfile分析 启动命令分析 Docker 容器入口点脚本分析 exec "$" exec 命令 "$" 参数 总结 在云原生技术快速发展的今天&#xff0c;Docker 作为容器技术的代表&#xff0c;为软件的打包、…

Mybatis的动态SQL~

MyBatis有一个强大特性就是它的动态SQL。在实际项目开发中&#xff0c;经常需要根据不同条件拼接SQL语句&#xff0c;拼接时还要确保不能忘了必要的空格&#xff0c;有时候还要注意省掉列名列表最后的逗号...等等。在使用JDBC 或其他类似持久层框架操作数据库时&#xff0c;处理…

Swagger添加JWT验证(ASP.NET)

文章目录 JWT1、解析2、配置JWT JWT 1、解析 1&#xff09;客户端向授权服务系统发起请求&#xff0c;申请获取“令牌”。 2&#xff09;授权服务根据用户身份&#xff0c;生成一张专属“令牌”&#xff0c;并将该“令牌”以JWT规范返回给客户端 3&#xff09;客户端将获取到的…

uniapp h5 引入阿里云一键登录

参考官方文档: 如何将H5页面接入网页端SDK并一键登录_号码认证服务(PNVS)-阿里云帮助中心 本文主要分享uniapp 对SDK依赖文件的引入 采用npm包引入的方法: 1.下载 // 下载npm资源并添加依赖到package.json npm i aliyun_numberauthsdk_web -S tips: 查看package.json文件,确…

Linux shell编程学习笔记42:md5sum

0 前言 前几天在国产电脑上遇到一个问题&#xff0c;先后接到两个文件&#xff0c;如何判断这两个文件内容是否相同&#xff1f; 如果是在Windows系统&#xff0c;可以用fc命令&#xff0c;或者用我自己写的FileInfo&#xff0c;提取两个文件有MD5、SHA1、CRC32值进行比较来判…

李宏毅【生成式AI导论 2024】第5讲 让语言模型彼此合作,把一个人活成一个团队

GPD4,它也有非常强大的能力。但是GPT4如果跟其他的语言模型合作,他们其实可以发挥1加1大于二的力量。 为什么要让模型合作? 那怎么让模型彼此合作呢?有很多不同的方式。一个可能性是假设你现在手边就有一堆语言模型,他们可能有不同的能力使用,他们可能有不同的成本局来…