我对 reactive源码的理解

reactive 只能够代理对象
首先它判断传递过来的值是否是对象,如果是才会进行代理。变成响应式的。
Proxy 并没有重写对象的属性,只做代理,在取值的时候回调用get,设置值的时候回调用set方法
在get的时候使用了 Reflect.get(target,key)方法
在set的时候使用了 Reflect.set(target,key,value)方法
为什么要这样做?因为这样可以保证this的指向是代理对象
let target = {
name: 'zhangsan',
get say() {
console.log('返回的值',this.name)
return this.name
}
}
const proxy= new Proxy(target, {
get(target, key) {
console.log('取值这里也会被触发')
return Reflect.get(target,key)
},
set(target,key,value) {
return Reflect.set(target, key,value)
}
})
console.log(proxy )

weakMap解决同一个对象被代理多次浪费性能

let state={
name:'xxx',
age:123
}
let state1=reactive(state)
let state2=reactive(state)
console.log( state1===state2 ) true
如果同一个对象被代理多次会浪费性能。
怎么处理这个问题呢?
利用缓存,使用了 weakMap
为什么要使用了weakMap 呢?
weakMap是弱引用,不会造成内存泄漏
weakMap 和 map很像,但是weakMap的key只能够是对象
这样就实现了 同于一个对象被多次代理,返回同一个代理

代理的对象再次被代理

let state={
name:'xxx',
age:123
}
let state1=reactive(state)
let state2=reactive(state1)
怎么解决这个问题了 代理对象被再次代理,可以直接返回,不需要代理了。
它最初是用了 IS_REACTIVE这个字段
会检测代理对象是否有这个字段,如果有,说明这个对象被代理了。
不再需要代理了,直接返回就可以了

vue3 性能方便的提升

1.ref API 的读效率提升 260%,写效率提升约为 50% 。
2.依赖收集的效率提升 40%
3.内存占用减少 17% 。

你对Proxy的理解

Proxy 对象用于创建一个对象的代理,
从而实现拦截和自定义(如属性查找、赋值、枚举、函数调用等)
Proxy并不是深层代理,proxy只会代理第一层。
Vue3中reactive的实现,其实是递归的将对象全部都代理了一遍。

Proxy解决了什么问题

Object.defineProperty无法直接监听对象新增或删除的属性。Proxy可以。
Object.defineProperty我们无法让Map、Set这类数据类型转变为响应式,Proxy可以。

我对vue3的理解的更多相关文章

  1. 第三十五篇:vue3,(组合式api的初步理解)

    好家伙, 来一波核心概念:数据劫持是响应式的核心 1.由set up开始 (1)vue3中的一个新的配置项,值为一个函数. (2)组件中所用的到的:数据,方法,计算属性均要配置在set up中. (3 ...

  2. Vue3生命周期的理解

    beforeCreate():在实例生成之前 created():在实例生成之后 beforeMount():在模板已经被编译成函数之后,组件内容被渲染到页面之前 mounted():在组件内容被渲染 ...

  3. 预计2019年发布的Vue3.0到底有什么不一样的地方?

    摘要: Vue 3.0预览. 原文:预计今年发布的Vue3.0到底有什么不一样的地方? 作者:小肆 微信公众号:技术放肆聊 Fundebug经授权转载,版权归原作者所有. 还有几个月距离 vue2 的 ...

  4. 深入理解Proxy 及 使用Proxy实现vue数据双向绑定

    阅读目录 1.什么是Proxy?它的作用是? 2.get(target, propKey, receiver) 3.set(target, propKey, value, receiver) 4.ha ...

  5. 深入理解 Object.defineProperty 及实现数据双向绑定

    Object.defineProperty() 和 Proxy 对象,都可以用来对数据的劫持操作.何为数据劫持呢?就是在我们访问或者修改某个对象的某个属性的时候,通过一段代码进行拦截行为,然后进行额外 ...

  6. 纯小白入手 vue3.0 CLI - 3.3 - 路由的导航守卫

    vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 尽量把纷繁的知识,肢解重组成为可以堆砌的知识. ...

  7. 纯小白入手 vue3.0 CLI - 2.7 - 组件之间的数据流

    vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 尽量把纷繁的知识,肢解重组成为可以堆砌的知识. ...

  8. 纯小白入手 vue3.0 CLI - 2.6 - 组件的复用

    vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 我的 github 地址 - vue3.0St ...

  9. 纯小白入手 vue3.0 CLI - 2.5 - 了解组件的三维

    vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 我的 github 地址 - vue3.0St ...

  10. 纯小白入手 vue3.0 CLI - 2.4 - 新组件 Forms.vue 中学习表单

    vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 我的 github 地址 - vue3.0St ...

随机推荐

  1. 顶会VLDB‘22论文解读:CAE-ENSEMBLE算法

    摘要:针对时间序列离群点检测问题,提出了基于CNN-AutoEncoder和集成学习的CAE-ENSEMBLE深度神经网络算法,并通过大量的实验证明CAE-ENSEMBLE算法能有效提高时间序列离群点 ...

  2. AI贺新年,开发者的虎年这样过才有意思

    摘要:祝所有的开发者们新春快乐,万事如意迎新年,如虎添翼旺全年! 普通人拜年,发一个祝福微信.程序员拜年,运行一串代码,制作独一无二的拜年短视频. 普通人送祝福,新年快乐.程序员送祝福,信手捏来一首拜 ...

  3. 开心档之Java 测验

    目录 Java 测验 Java 测验 Java 测验技术文档 Java测验是一种衡量Java编程水平的测试,可以通过一系列问题和编程任务来测试Java开发人员的技能水平和理解程度.Java测验可以用于 ...

  4. Cmder - 想让你的windows下 cmd 和 SecureCRT 操作 Linux 一样帅吗 附字符集编码 chcp 936、chcp 65001

    想让你的windows下 cmd 和 SecureCRT 操作 Linux 一样帅的命令行显示吗. 下载 cmder 绿色版,然后用我的配置文件,替换原来的文件启动就可以了 配置文件下载:cmder ...

  5. Axure 母版与元件

    需要重复使用的元件,建议创建成母版: 如果修改了母版,所有页面中的母版元件将会被同步修改 元件:添加后,所有的 Axure 都可以使用 母版:只适用当前的 Axure 原型 拖放行为: 任意位置:可以 ...

  6. termius macos 破解版,激活版下载,永久激活,亲测可用

    termius 是一款非常值得推荐的 SSH/SFTP 跨平台终端工具,其十分亮眼的功能是可以上传文件夹,这是其他几款终端工具都不具备的,比如说 macOS 自带的终端.号称 21 世纪最强终端的 w ...

  7. MIGO BAPI_GOODSMVT_CREATE创建及增强

    1.MIGO过账BAPI新增字段 BAPI新增收货行号字段,保存外围系统的数据 1.1.MATDOC表新增收货行号 1.2.MSEG表新增收货行号 创建DDL视图用于扩展NSDM_E_MSEG 1.3 ...

  8. XShell、XFtp免费许可证增强:删除标签限制!

    大家好,我是DD! XShell相信大家都不陌生了,作为Windows平台下最强大的SSH工具,是大部分开发者的必备工具.但由于免费许可证的标签限制,有不少开发者会去找破解版使用.虽然功能是可以使用了 ...

  9. POJ:3660 Cow Contest (传递闭包 + Floyd)

    POJ 3660 http://poj.org/problem?id=3660 思路: 传递闭包 输入A > B,那么我们可以建立一套A ->B 的边. 然后求出传递闭包. 判断一个人是否 ...

  10. 【每日一题】31.「土」秘法地震 (二维前缀和 / DP)

    补题链接:Here 题意就是要找每一个 \(k * k\) 的小正方形里至少有一个1的数量 显然我们可以通过二维前缀和处理出(1, 1) 到 (n, m) 的数量 然后通过枚举处理出答案,具体思想是容 ...