isRef, isReactive 与 isReadonly的原理
vue3中的
isRef
、isReadonly
与isReactive
是怎么实现的呢?学习自尚硅谷
isRef#
在获取数据的时候,返回的Ref object中加入一个_is_ref
属性,就可以在获取的时候判断该属性,从而判断是否是ref
对象
/* 自定义shallowRef */ function shallowRef(target) { const result = { _value: target, // 用来保存数据的内部属性 _is_ref: true, // 用来标识是ref对象 get value () { return this._value }, set value (val) { this._value = val console.log('set value 数据已更新, 去更新界面') } } return result }
isReactive#
在proxy对象里面的reactiveHandler
中,当我get这个object的属性的时候,在对应的get方法内判断这个属性名字是不是_is_reactive
,具体代码参见我的另一篇文章https://www.cnblogs.com/lyzz1314/p/14812191.html
isReadonly#
和isReactive
相同的道理,参见isReadonly
实现代码:https://www.cnblogs.com/lyzz1314/p/14810733.html
/* 判断是否是ref对象 */ function isRef(obj) { return obj && obj._is_ref } /* 判断是否是reactive对象 */ function isReactive(obj) { return obj && obj._is_reactive } /* 判断是否是readonly对象 */ function isReadonly(obj) { return obj && obj._is_readonly } /* 是否是reactive或readonly产生的代理对象 */ function isProxy (obj) { return isReactive(obj) || isReadonly(obj) } /* 测试判断函数 */ console.log(isReactive(reactive({}))) console.log(isRef(ref({}))) console.log(isReadonly(readonly({}))) console.log(isProxy(reactive({}))) console.log(isProxy(readonly({})))
作者:lyzz1314
出处:https://www.cnblogs.com/lyzz1314/p/14812244.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
欢迎转载转载请注明出处
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步