我对 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. 大力出奇迹,揭秘昇腾CANN的AI超能力

    摘要:CANN(Compute Architecture for Neural Networks)异构计算架构,是以提升用户开发效率和释放昇腾AI处理器极致算力为目标,专门面向AI场景的异构计算架构. ...

  2. 华为云GaussDB:发挥生态优势,培养应用型DBA

    摘要:GaussDB首要的任务是解决华为的业务连续性的需求,同时也是要确保使用GaussDB的客户的业务能够连续,所以我们坚持战略投入,坚持从每一行代码,坚持从生态开始来构建整个数据库体系. 本文分享 ...

  3. 联合枚举类型:从C语言看枚举与联合类型到TypeScript/Python

    枚举,还是从hello world 开奖,大部分的人应该是从C开始的,比如我.当然,这部分也可以跳过. 详说枚举类型: C语言中的enum 计算机入门时候有点印象: enum是C语言中的一个关键字,e ...

  4. ​  appuploader使用教程

    ​ appuploader使用教程 转载:appuploader使用教程 目录 问题解决秘籍 登录失败 don't have access,提示没权限或同意协议 上传后在app管理中心找不到版本提交 ...

  5. 低门槛上手快!火山引擎 VeDI 这样满足数据分析新需求

      更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 近日,市场研究机构 IDC 发布<2022 年 V2 全球大数据支出指南>. 数据显示,2021 ...

  6. 性能提升-如何设置Windows操作系统TIME_WAIT状态的TCP连接快速回收时间?

    大规模Windows环境下,采用Nginx反向代理服务后,操作系统会产生较多TIME_WAIT的TCP(Transmission Control Protocol)连接,操作系统默认TIME_WAIT ...

  7. 图解 Promise 实现原理(二)—— Promise 链式调用

    本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/Xz2bGaLxVL4xw1M2hb2nJQ作者:Morrain 很多同学在学习 Promis ...

  8. <vue 路由 4、嵌套路由>

    一.效果 点击about后,新闻和体育属于about的子路由调用的页面 知识点说明 路由里使用children属性可以实现路由的嵌套 三.代码结构 注:主要是标红的几个文件 四.代码 重新编写这几个文 ...

  9. 引入阿里在线图标(微信小程序)

    https://www.bilibili.com/video/BV1WJ41197sD?p=49

  10. asio 使用 openssl 示例

    #include <boost/asio.hpp> #include <boost/asio/ssl.hpp> #include <boost/algorithm/str ...