当前位置: 首页 > 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
};
http://www.lryc.cn/news/409393.html

相关文章:

  • 【人工智能】Transformers之Pipeline(六):图像分类(image-classification)
  • 编程语言漫谈之「初始化与赋值」——以C++和汇编语言为示例
  • windows使用ssh-agent管理私钥
  • PostgreSQL 之 to_timestamp函数
  • USB3.0的等长要求到底是多少?
  • 力扣高频SQL 50题(基础版)第二十五题
  • 【C++题解】1581. 马里奥的银币1
  • system和popen函数的异同点
  • Python小工具之httpstat网络分析
  • 挑战房市预测领头羊:KNN vs. 决策树 vs. 线性回归
  • Docker 基础知识
  • 视频主题Qinmei 3.0视频站源码_WordPress影视视频主题/附详细安装教程
  • 数字看板:跨行业需求下的创新与升级
  • 02、爬虫数据解析-Re解析
  • 掀桌子了!原来是咱们的大屏设计太酷,吓着前端开发老铁了
  • JavaScriptfor循环的树形菜单栏·
  • easyExcel 3.x以上版本导入数据后,再把错误信息导出,外加自定义RGB背景色、行高、宽度等
  • React的img图片路径怎么写
  • UGUI优化篇--UGUI合批
  • FineBI连接MySQL5.7
  • 基于tkinter的学生信息管理系统之登录界面和主界面菜单设计
  • web基础以及http协议
  • DataEase一键部署:轻松搭建数据可视化平台
  • 网络安全相关竞赛比赛
  • Vscode——如何快速搜索项目工程中的某个文件的位置
  • Kubernetes 正在弃用 Docker?Docker将何去何从?
  • 编程语言「描述符」漫谈——以C++与Rust为例的行为声明与类型描述
  • 电脑屏幕录制软件哪个好?推荐3款,满足各种录制需求
  • 大模型学习应用 1:用 itrex 创新高效实现 LLM 的部署和微调
  • 【Android】碎片—动态添加、创建Fragment生命周期、通信