Vue2源码解析实现—Vue响应式实现(对data中对象的属性劫持)

腾讯云TDSQL MySQL版 - 开发指南兼容性 语言结构 分布式实例支持所有 MySQL 使用的文字格式,包括: String Literals Numeric Literals Date and Time Literals Hexadecimal Literals Bit-Value Literals Boolean Literals NULL Values String Literals String Literals 是一个 bytes 或者 characters 的序列,两端被单引号'或者双引号"包围,TDSQL MySQL版 阅读详情

Vue2源码解析实现

Vue响应式实现

  • Vue响应式原理
    vue 实现数据响应式 ,是通过数据劫持侦测数据变化,发布订阅模式进行依赖收集与视图更新,Observe实现数据劫持,递归给对象属性,绑定setter和getter函数
  • 实现机制
    Vue的双向绑定实现机制核心:
    • 依赖于Object.defineProperty()实现数据劫持
    • 订阅模式
  • Vue2源码实现 —— 对data中对象的属性劫持

1. 创建一个index.js作为入口文件,创建一个Vue函数,并且抽离初始化文件进行模块化

import { initMixin } from "./init"; // 初始化 抽离模块化

function Vue(options) {
  // new Vue 时是进行初始化
  this._init(options);
}

initMixin(Vue);

export default Vue;

2. 创建初始化文件init.js,在Vue函数的实例上创建一个_init方法进行初始化状态

import { initStates } from "./initState";

export function initMixin(Vue) {
  Vue.prototype._init = function (options) {
    let vm = this;
    vm.$options = options;
    // 初始化状态
    initStates(vm);
  };
}

3. 创建初始化状态文件initState.js,在这里面写所有的初始化方法(data,props,watch,methods…)

import { observer } from "./observer/index";

export function initStates(vm) {
  let opts = vm.$options;
  if (opts.data) {
    initData(vm);
  }
  if (opts.props) {
    initProps(vm);
  }
  if (opts.watch) {
    initWatch(vm);
  }
  if (opts.computed) {
    initComputed(vm);
  }
  if (opts.methods) {
    initMethods(vm);
  }
}

//! Vue2 对data进行初始化
function initData(vm) {
  //> 会有两种初始化方式 1. 对象  2. 函数
  let data = vm.$options.data;
  data = vm._data = typeof data === "function" ? data.call(vm) : data;
  //> 对数据data进行劫持
  observer(data);
}

function initProps() {}
function initWatch() {}
function initComputed() {}
function initMethods() {}

4. 创建一个文件夹observer里面的index.js,在这里面进行数据的劫持和发布订阅模式

export function observer(data) {
  //> 判断data是否是对象或者空
  if (typeof data != "object" || data == null) {
    return data;
  }

  //> 1. 对象通过一个类
  return new Observer(data);
}

//> vue2 进行劫持是通过Object.defineProperty()  //! 缺点:只能是对象中的一个属性进行劫持 懒劫持
class Observer {
  constructor(value) {
    //> 进行遍历 让每一个属性都劫持到
    this.walk(value);
  }
  walk(data) {
    //> keys 是对象所有的属性
    let keys = Object.keys(data);
    for (let i = 0; i < keys.length; i++) {
      //> 对我们每一个属性进行劫持
      const key = keys[i];
      const value = data[key];
      //   console.log(value);
      defineReactive(data, key, value);
    }
  }
}

//> 对对象属性进行劫持
function defineReactive(data, key, value) {
  observer(value); //! 进行递归 ,深层次的劫持
  Object.defineProperty(data, key, {
    get() {
      return value;
    },
    set(newValue) {
      if (newValue == value) return;
      observer(newValue); // 如果用户设置的值是对象,也要进行劫持
      value = newValue;
    },
  });
}
  • 总结
    1. 需要多data数据进行判断,是对象还是函数,如果是函数就要改变this执行为vm
    2. Object.defineProperty 有缺点,只能对对象中的一个属性进行劫持 所以进行遍历
    3. 递归 将深层次的数据进行get set劫持

  • 运行

    为了方便打印查看是否进行数据劫持 在vm实例上添加_data属性存放data数据
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

ROS从入门到精通1-1:ROS核心架构、常用指令与计算图 本文介绍ROS的核心架构,各个文件、目录的用途、常用命令行工具、动态计算图原理。 阅读详情

相关推荐

Speedtree学习笔记(案例)——拥有多种材质的植物如何导入使用(以草为例)

注:Speedtree无论保存还是导入模型其存储路径不可有中文。 第一步拆分草的模型 根据所需的材质去拆分(例:假若草的果实,茎秆和叶子是不同的材质那么就需拆分为三份;假若画的全部颜色及材质一样就没有必要去拆分模型) 第二步导入草的模型 在Mesh面板中依次导入草的模型——Do nothing additional right now 第三步扩大草的生长区域范围(可省略)...

L人青的博客 5722

Vue2响应式原理源码解读

vue三大核心系统 Compiler模块:编译模板系统; Runtime模块:也可以称之为Renderer模块,真正渲染的模块; Reactivity模块:响应式系统; 渲染系统,该模块主要包含三个功能: 功能一:h函数,用于返回一个VNode对象; 功能二:mount函数,用于将VNode挂载到DOM上; 功能三:patch函数,用于对两个VNode进行对比,决定如何处理新的VNode; h函数的实现: 直接返回一个VNode对象即可 Mount函数 – 挂载VNode 第一步:根据tag,创建HTML

wyh666csdn的博客 1420

Ceres Solver:从入门到使用

Ceres Solver是谷歌开源的C++非线性优化库,能够解决有约束或无约束条件下的非线性最小二乘问题。2010年之后大量的运用在谷歌的产品开发中,尤其在谷歌开源的cartographer中被大量的使用。 ceres可以在Linux,Windows,macOS,Andrioid,IOS系统进行安装使用,详情可查看下方的官网链接。 Ceres Solver 官网:http://ceres-solver.org/

非晚非晚的博客 1万+

VUE2数据响应式源码实现

通过自定义defineReactive函数对Object.defineProperty进行封装,并进行导出//传的值等于对象本身的值get() {console.log('访问了' + key + '属性');return val;},console.log('修改了' + key + '属性');})observe函数会在下文中进行讲解。

erqiae的博客 1440

Lenovo 拯救者15ISK硬件升级实战:从内存到固态硬盘的全面优化

本文详细介绍了为联想拯救者15ISK笔记本电脑进行硬件升级的完整实战指南。通过评估升级可行性,指导如何挑选兼容的内存条与NVMe固态硬盘,并提供详细的拆机安装步骤与系统安装避坑技巧。升级后,笔记本的开机速度、软件加载及多任务处理能力获得飞跃式提升,让老旧设备重获新生。

weixin_29310631的博客 555

CMU开源NavRL:深度强化学习如何破解无人机动态避障难题?

卡内基梅隆大学(CMU)开源了NavRL框架,利用深度强化学习解决无人机在复杂环境中的动态避障难题。该框架通过创新的状态表示、多目标奖励函数设计以及独立的安全屏障机制,使无人机能够通过仿真训练自主学会灵活、安全的导航策略,并成功实现从仿真到真实环境的零样本迁移。

hope8的博客 720

Vue2源码解析(2)——响应式详解

vue2的响应式源码

如果相遇,那么你好哦~ 285

计量经济学——事件研究法/事件分析法

计量经济学——事件研究法/事件分析法

weixin_46189461的博客 6752

Vue2.x 源码 - 响应式原理

上一篇:Vue2.x 源码 - VNode渲染过程(update、patch) Vue2.x 实现响应式的核心是利用的 ES5 的 Object.defineProperty ,这也是 Vue 不兼容 IE8 及其以下浏览器的原因; 文章目录响应式对象 响应式对象 Object.defineProperty 的作用就是直接在一个对象上定义一个新属性,或者修改一个已经存在的属性,并返回该对象; Object.defineProperty(obj, prop, descriptor) obj :需要定义.

weixin_43299180的博客 1854

别再只会按按钮了!用NanoStat开源项目学ESP32硬件设计:BOOT与自动下载电路的避坑指南

本文通过NanoStat开源项目深入解析ESP32硬件设计中BOOT与自动下载电路的关键技术。从启动机制、电路设计陷阱到三极管选型,提供了一套完整的避坑指南和优化方案,帮助开发者提升设计可靠性和烧录效率。特别适合中级开发者学习ESP32硬件设计的精髓。

weixin_30296405的博客 439

WinClaw安全实战 02|五层纵深防护体系全解析:从原理到实操,打造零风险AI智能体

2026年AI智能体爆发式普及,OpenClaw以27.3万GitHub星标成为现象级工具,但恶意Skill投毒、提示词注入、数据外泄等安全事故频发,国家互联网应急中心、工信部等多部门接连发布风险警示。威努特基于国家关键信息基础设施安全防护经验,打造WinClaw安全版AI智能体,其核心竞争力在于**五层纵深防护体系**。本文从安全痛点切入,通过真实事故案例揭示风险本质,全景解构五层防护的架构设计与技术原理,逐层拆解身份认证、安装审查、消息拦截、执行约束、监控审计的实现逻辑,搭配20+实操演示、对比表格

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 497

Vue的双向绑定(数据劫持)

介绍Vue2.0和3.0的双向绑定原理

weixin_42274805的博客 1414

HMC7044调试指南与FPGA开发

最后,我们介绍了在FPGA开发中使用HMC7044的几个常见应用场景,包括时钟分配、时钟同步、高精度时钟生成和时钟域交叉。根据您的应用需求,您可以选择不同的时钟分配方案,例如使用PLL生成特定频率的时钟信号,或者通过分频器生成较低频率的时钟信号。HMC7044可以提供精确的时钟同步功能,确保各个FPGA板之间的时钟信号保持一致,从而实现可靠的数据传输和协同操作。HMC7044可以实现时钟域之间的交叉,通过生成和分配不同频率的时钟信号,使得不同时钟域的模块能够协同工作。FPGA开发中的HMC7044应用。

CqpFsharp的博客 3616

分析Vue2源码中数据代理、数据劫持的过程,数据代理和数据劫持真的不是同一个东西哦~

最近总刷到数据代理就是数据劫持这样的说法的文章,可是我真的不信!!!然后我就找了源码梳理函数调用的过程,发现数据代理和数据劫持确实不是同一个东西。本篇文章记录用于复习、回顾。

Concise200的博客 3075

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

vue中响应式是什么?怎么理解响应式原理?

vue中响应式是什么? 概念: 官网解释:Vue 最独特的特性之一,是其非侵入性的响应式系统。数据模型仅仅是普通的 JavaScript 对象。而当你修改它们时,视图会进行更新。 简而言之就是数据变页面变 实现原理: Vue在组件和实例初始化的时候,会将data里的数据进行数据劫持(object.definepropty对数据做处理)。被解除过后的数据会有两个属性:一个叫getter,一个叫set...

A-Select ° 6388

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【vue源码03】深入学习vue源码实现——data与setup方法的底层实现

深入学习vue源码,老曹带你彻底搞懂data和setup的底层实现和原理应用。

silverclayz的技术分享 1042

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Vue2源码解析实现—Vue响应式实现(对data中数组进行劫持)

在上一个文章中写到对data中的对象属性进行劫持,接着后面实现对data中的数组进行劫持。

HAI_GUI的博客 269

vue2 源码解析-双向数据绑定原理

1、vue 2 是通过Object.defineProperty()对组件内的data数据进行递归绑定getter和setter,同时通过Dep进行依赖收集管理2、vue2 是(通过Object.defineProperty递归遍历)劫持的属性3、vue3 是(通过proxy代理)劫持的整个data对象。

weixin_44862629的博客 1824

vue源码解析3——数据劫持

3 数据劫持 数据劫持是vue中用来实现数据绑定的一种技术,通过defineProperty()来监视data中所有属性(任意层次)数据的变化, 一旦变化就去更新界面。 function Watcher(vm, exp, cb) { this.cb = cb; // <1>保存回调函数,主要用与更新节点 this.vm = vm; this.exp = ...

123木头人的博客 640

vue响应式原理理解(data,computed,watch)

摘要 双向绑定之前写过一次了。 本文从data,watch,comuted的实现原理出发,并根据自己的理解进行了总结。 先贴个大佬文章链接:实现一个最精简的响应式系统来学习Vue的data、computed、watch源码 讲的非常清晰,让我对响应式有了更深刻更清晰的理解。 vue2响应式原理解析 data的响应 vue2中的简单而言就是object.defineProperty劫持get和set,对于数组直接赋值等操作不能实现响应式,对于data中新增的属性也不支持响应,必须用vue.$set设置。 vu

qq_45428582的博客 1034

Vue2.0响应式原理源码解析

Vue2.0响应式原理源码解析

玛已的小空间 1536

vue2.x源码 数据响应式原理

vue 2源码分析 数据响应式原理

weixin_38039976的博客 1138

vue 数组 指定位置添加数据_VUE 响应式原理源码:带你一步精通 VUE

作者 | 爱编程的小和尚责编 | 王晓曼出品 | 优快云博客学过 VUE 如果不了解响应式的原理,怎么能说自己熟练使用 VUE,要是没有写过一个简易版的 VUE 怎么能说自己精通 VUE,这篇文章通过300多行代码,带你写一个简易版的 VUE,主要实现 VUE 数据响应式 (数据劫持结合发布者-订阅者)、数组的变异方法、编译指令,数据的双向绑定的功能。本文需要有一定 VUE 基础,并不适合新手学...

weixin_39917576的博客 1644

Vue实现数据响应式原理

Vue中的数据响应式: 我们修改代码(例如修改data中的属性值),不需要我们刷新,页面就重新渲染 ——— 这就是数据响应式。 程序猿只需要把属性添加到data中,然后在模板里用==插值语句{{}}或者v-bind:==指令等手段就可以实现该功能 ...

curry0711的博客 946

VUE中实现数据代理和数据劫持(Vue原理之步骤二)

整理面试题,不是让大家去只刷面试题,而是熟悉目前实际面试中常见的考察方式和知识点,做到心中有数,也可以用来自查及完善知识体系。《前端基础面试题》,《前端校招面试题精编解析大全》,《前端面试题宝典》,《前端面试题:常用算法》PDF完整版点击这里领取识点,做到心中有数,也可以用来自查及完善知识体系。《前端基础面试题》,《前端校招面试题精编解析大全》,《前端面试题宝典》,《前端面试题:常用算法》PDF完整版点击这里领取[外链图片转存中…(img-jRfgPkBX-1712975544507)]

2401_84092694的博客 1155

源码篇 剖析 Vue2 双向绑定原理

Vue 源码角度深度剖析理解双向绑定原理(Vue3 的响应式系统即将更新...)

XZZXBC的博客 1352
上一篇: Vue2源码解析实现—rollup搭建环境
下一篇: Vue2源码解析实现—Vue响应式实现(对data中数组进行劫持)
龟中的程序员
博客等级 码龄7年 328粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龟中的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值