我对vue3的理解
我对 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的理解的更多相关文章
- 第三十五篇:vue3,(组合式api的初步理解)
好家伙, 来一波核心概念:数据劫持是响应式的核心 1.由set up开始 (1)vue3中的一个新的配置项,值为一个函数. (2)组件中所用的到的:数据,方法,计算属性均要配置在set up中. (3 ...
- Vue3生命周期的理解
beforeCreate():在实例生成之前 created():在实例生成之后 beforeMount():在模板已经被编译成函数之后,组件内容被渲染到页面之前 mounted():在组件内容被渲染 ...
- 预计2019年发布的Vue3.0到底有什么不一样的地方?
摘要: Vue 3.0预览. 原文:预计今年发布的Vue3.0到底有什么不一样的地方? 作者:小肆 微信公众号:技术放肆聊 Fundebug经授权转载,版权归原作者所有. 还有几个月距离 vue2 的 ...
- 深入理解Proxy 及 使用Proxy实现vue数据双向绑定
阅读目录 1.什么是Proxy?它的作用是? 2.get(target, propKey, receiver) 3.set(target, propKey, value, receiver) 4.ha ...
- 深入理解 Object.defineProperty 及实现数据双向绑定
Object.defineProperty() 和 Proxy 对象,都可以用来对数据的劫持操作.何为数据劫持呢?就是在我们访问或者修改某个对象的某个属性的时候,通过一段代码进行拦截行为,然后进行额外 ...
- 纯小白入手 vue3.0 CLI - 3.3 - 路由的导航守卫
vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 尽量把纷繁的知识,肢解重组成为可以堆砌的知识. ...
- 纯小白入手 vue3.0 CLI - 2.7 - 组件之间的数据流
vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 尽量把纷繁的知识,肢解重组成为可以堆砌的知识. ...
- 纯小白入手 vue3.0 CLI - 2.6 - 组件的复用
vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 我的 github 地址 - vue3.0St ...
- 纯小白入手 vue3.0 CLI - 2.5 - 了解组件的三维
vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 我的 github 地址 - vue3.0St ...
- 纯小白入手 vue3.0 CLI - 2.4 - 新组件 Forms.vue 中学习表单
vue3.0 CLI 真小白一步一步入手全教程系列:https://www.cnblogs.com/ndos/category/1295752.html 我的 github 地址 - vue3.0St ...
随机推荐
- 云小课|3种常用Git工作流推荐
本文分享自华为云社区<[云小课]应用平台第44课 常用Git工作流推荐>,作者: 应用万花筒. . 1. Git工作流-动静有法 简单来说,工作流就是开发团队预置的开发流程和解决问题时使用 ...
- 华为云MVP程云:知识化转型,最终要赋能一线
摘要:如今的智能语音助手,可以帮助我们完成日常生活中的一些常规动作.同样,在企业中,智能问答机器人也在扮演着同样的角色. 本文分享自华为云社区<[亿码当先,云聚金陵]华为云MVP程云:知识化转型 ...
- Solon cloud 常用配置
一.配置示例: solon: app: name: "solon-consul-test" group: "test" solon.cloud.consul: ...
- C-Shopping基于Next.js,开源电商平台全新亮相
嗨,大家好!欢迎来到C-Shopping,这是一场揭开科技面纱的电商之旅.我是C-Shopping开源作者"继小鹏",今天将为你介绍一款基于最新技术的开源电商平台.让我们一同探索吧 ...
- Blazor与Vue标签代码的可维护性对比
通过一个简单示例来进行对比, Vue的ElementUI组件的行内编辑: Blazor的AntDesginBlazor组件的行内编辑: 区别: el-table-column的label属性相当于Co ...
- C#写日志工具类(新版)
源码:https://gitee.com/s0611163/LogUtil 昨天打算把我以前写的一个C#写日志工具类放到GitHub上,却发现了一个BUG,当然,已经修复了. 然后写Demo对比了NL ...
- L1-046 整除光棍 (20分)
问题描述 这里所谓的"光棍",并不是指单身汪啦~ 说的是全部由1组成的数字,比如1.11.111.1111等.传说任何一个光棍都能被一个不以5结尾的奇数整除.比如,111111就可 ...
- Android 原生 SQLite 数据库的一次封装实践
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/CL4MsQEsrWS8n7lhXCOQ_g作者:Li Bingyan 本文主要讲述原生SQLi ...
- 技术分享 | 不同格式标准SBOM清单横评:SPDX、CDX和DSDX
为了保证安全性.降低开发.采购及维护的相关成本,复杂动态的现代软件供应链对软件资产透明度提出了更高的要求.使用清晰的软件物料清单(SBOM)收集和共享信息,并在此基础上进行漏洞.许可证和授权管理等,可 ...
- 森林消防智慧预警:火灾监测 Web GIS 可视化平台
前言 森林火灾是一种突发性强.破坏性大.处置救助较为困难的自然灾害.2021 年前三季度全国共发生森林火灾 527 起,受害森林面积约 2628 公顷,15 人死亡:发生草原火灾 12 起,受害草原面 ...