当前位置: 首页 > news >正文

vue Ref 和 Reactive 原理解析

文章目录

  • Ref
  • Reactive

Ref

  • ref 的语义是指向一个值的引用,主要用于处理基本数据类型和单一值对象,即对值的引用进行包装和管理,而不是对对象的操作进行拦截,对于基础类型通过 getter 和 setter 实现拦截
  • 使用 Proxy 拦截对象的所有操作(如 get、set、deleteProperty 等),这是一个强大的 API,但同时也带来一定的性能开销。对于基础的响应式处理,使用 Proxy 显得过于繁重
  • ref 更适合用于单一值的场景,它的设计初衷就是为了处理这些简单情况,通过 getter 和 setter 可以更简洁地实现响应式
  • 但是如果 ref 在处理对象时,会将对象转换为响应式对象。这种转换实际上是通过 reactive 实现的,即在 ref 中如果传递的是对象类型,最终会使用 Proxy 来实现响应式功能。
export function ref(value?: unknown) {return createRef(value, false);
}function createRef(rawValue: unknown, shallow: boolean) {if (isRef(rawValue)) {return rawValue;}return new RefImpl(rawValue, shallow);
}class RefImpl<T> {private _value: T;private _rawValue: T;constructor(value: T, public readonly __v_isShallow: boolean) {this._rawValue = value;this._value = __v_isShallow ? value : toReactive(value);}get value() {trackRefValue(this);return this._value;}set value(newVal) {if (hasChanged(newVal, this._rawValue)) {this._rawValue = newVal;this._value = toReactive(newVal);triggerRefValue(this);}}
}// 判断 ref 的引用值是否是对象
function toReactive(value: any): any {return isObject(value) ? reactive(value) : value;
}

Reactive

  • reactive 主要用于将复杂对象变成响应式对象,这些对象可能包含嵌套的结构。对于这种情况,Proxy 是更合适的工具,因为它能够拦截和处理对象的所有操作,确保对象及其嵌套结构的每个部分都是响应式的
export function reactive(target: object) {if (isReadonly(target)) {return target;}return createReactiveObject(target, false, mutableHandlers, mutableCollectionHandlers);
}function createReactiveObject(target: Target,isReadonly: boolean,baseHandlers: ProxyHandler<any>,collectionHandlers: ProxyHandler<any>
) {if (!isObject(target)) {if (__DEV__) {console.warn(`value cannot be made reactive: ${String(target)}`);}return target;}const proxy = new Proxy(target,collectionType ? collectionHandlers : baseHandlers);return proxy;
}export const mutableHandlers: ProxyHandler<object> = {get,set,deleteProperty,has,ownKeys
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • STM32智能家居控制系统教程
  • C语言实现三子棋
  • 【中项】系统集成项目管理工程师-第9章 项目管理概论-9.1PMBOK的发展与9.2项目基本要素
  • 机器学习之心一区级 | Matlab实现SMA-Transformer-LSTM多变量回归预测(黏菌算法优化)
  • 一个Spring Boot Web项目一些常用的配置点
  • DAY28-贪心
  • openGauss触发器详解
  • 昇思25天学习打卡营第XX天|Pix2Pix实现图像转换
  • Yarn 介绍
  • JavaScript轮播图
  • 软件工程简记
  • PHP枚举的使用 php enum
  • 【Torch】一行代码将神经网络模型输出转化为numpy格式进行分析
  • 每日一题 ~乘积最大子数组
  • 捷径,这世上有没有捷径
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • Angular2开发踩坑系列-生产环境编译
  • AngularJS指令开发(1)——参数详解
  • CSS实用技巧干货
  • ERLANG 网工修炼笔记 ---- UDP
  • gulp 教程
  • JavaScript设计模式之工厂模式
  • Python学习之路13-记分
  • react 代码优化(一) ——事件处理
  • Ruby 2.x 源代码分析:扩展 概述
  • Shadow DOM 内部构造及如何构建独立组件
  • Transformer-XL: Unleashing the Potential of Attention Models
  • vue学习系列(二)vue-cli
  • 阿里研究院入选中国企业智库系统影响力榜
  • 飞驰在Mesos的涡轮引擎上
  • 聚簇索引和非聚簇索引
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 来,膜拜下android roadmap,强大的执行力
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 如何设计一个比特币钱包服务
  • -- 数据结构 顺序表 --Java
  • 双管齐下,VMware的容器新战略
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 移动端唤起键盘时取消position:fixed定位
  • 赢得Docker挑战最佳实践
  • 7行Python代码的人脸识别
  • AI算硅基生命吗,为什么?
  • # SpringBoot 如何让指定的Bean先加载
  • #大学#套接字
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (k8s)Kubernetes本地存储接入
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (力扣)1314.矩阵区域和
  • (七)glDrawArry绘制
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (十三)Flink SQL
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计