首页 > 其他分享 >响应式原理实现

响应式原理实现

时间:2023-09-06 17:35:50浏览次数:18  
标签:map depend target 实现 响应 let key 原理 obj

响应式原理实现

 1 // 保存当前需要收集的响应式函数
 2 let activeReactiveFn=null
 3 class Depend{
 4     constructor(){
 5         this.rectiveFns=new Set()
 6     }
 7     depend(){
 8         if(activeReactiveFn){
 9             this.rectiveFns.add(activeReactiveFn)
10         }
11     }
12     notify(){
13         this.rectiveFns.forEach(fn=>{
14             fn()
15         })
16     }
17 }
18 //封装一个响应式的函数
19 function watchFn(fn){
20     activeReactiveFn=fn
21     fn()
22     activeReactiveFn=null
23 }
24 // 封装一个获取depend函数
25 const targetMap=new WeakMap()
26 function getDepend(target,key){
27     //根据target对象获取map的过程
28     let map=targetMap.get(target)
29     if(!map){
30         map=new Map()
31         targetMap.set(target,map)
32     }
33     //根据key获取depend对象
34     let depend=map.get(key)
35     if(!depend){
36         depend=new Depend()
37         map.set(key,depend)
38     }
39     return depend
40 }
41 
42 function reactive(obj){
43     //监听对象的属性变量:Proxy(vue3)/Object.defineProperty(vue2)
44     //vue3
45     // return new Proxy(obj,{
46     //     get(target,key,receiver){
47     //         const depend=getDepend(target,key)
48     //         depend.depend()
49     //         return Reflect.get(target,key,receiver)
50     //     },
51     //     set(target,key,newValue,receiver){
52     //         Reflect.set(target,key,newValue,receiver)
53     //         let depend=getDepend(target,key)
54     //         depend.notify()
55     //     }
56     // })
57     //vue2
58     Object.keys(obj).forEach(key=>{
59         let value=obj[key]
60         Object.defineProperty(obj,key,{
61             get(){
62                 const depend=getDepend(obj,key)
63                 depend.depend()
64                 return value
65             },
66             set(newValue){
67                 value=newValue
68                 let depend=getDepend(obj,key)
69                 depend.notify()
70             }
71         })
72     })
73     return obj
74 }
75 
76 //对象的响应式
77 const obj=reactive({
78     name:'koo',
79     age:18
80 })
81 
82 watchFn(function(){
83     console.log('hello world',obj.name)
84 })
85 
86 obj.name='john'

 

标签:map,depend,target,实现,响应,let,key,原理,obj
From: https://www.cnblogs.com/KooTeam/p/17682898.html

相关文章

  • Vue + GitLab 实现自动化部署
      二、Linux安装nginx在Linux上安装NGINX的步骤如下:打开终端(命令行界面)。使用以下命令安装NGINX:对于Ubuntu/Debian系统:sudoapt-getinstallnginx对于CentOS/RHEL系统:sudoyuminstallnginx等待安装完成。使用以下命令启动NGI......
  • TwinCAT3 - 实现Dictionary
    目录1,前言2,C#的字典3,TwinCAT3的字典定义功能块添加方法4,用起来1,前言C#有字典,TwinCAT没字典,咋办,自己写一个咯2,C#的字典C#的字典使用很简单,下面是最基本的使用Dictionary<string,object>dic=newDictionary<string,object>();dic.Add("key1",1);dic.Add("key2","ABC")......
  • Linux实现多硬盘数据存储
    fdisk-l查看可用磁盘设备1/#fdisk-l2Disk/dev/mmcblk1:7456MB,7818182656bytes,15269888sectors3238592cylinders,4heads,16sectors/track4Units:sectorsof1*512=512bytes56Disk/dev/mmcblk1doesn'tcontainavalidpartitiont......
  • 《Java架构师的第一性原理》65系统架构之架构设计方法论
     4规范(Musthave)规范一:非数据服务做到无状态,避免同一集群内的节点间有功能差异;做到实例可以被随时停止、重启、增加,并且完全不依赖于本地磁盘或者内存规范二:服务具备优雅重启规范三:服务提供的API建议采用http\grpc,json\pb规范,不建议其他自定义格式规范四......
  • ​​Android平台GB28181历史视音频文件下载规范探讨及技术实现
    技术背景上篇blog,我们提到了Android平台GB28181历史视音频文件检索规范探讨及技术实现,文件检索后,GB28181平台侧,可以针对文件列表进行回放或下载操作,本文主要探讨视音频文件下载相关。规范解读视音频文件下载基本要求SIP服务器接收到媒体接收者发送的视音频文件下载请求后向媒体流......
  • 如何找到 Spartacus 动态加载 library 的准确实现地址
    Spartacus里SmartEditFeatureModule这段实现代码:import{NgModule}from'@angular/core';import{CmsConfig,provideConfig}from'@spartacus/core';import{SmartEditRootModule,SMART_EDIT_FEATURE,}from'@spartacus/smartedit/ro......
  • 实现:修改密码~确认新密码~重置密码~提交操作✔
    1.功能效果图:2.基本布局先需要引入elementUI插件-注册基本布局code<template><el-cardclass="box-card"><divslot="header"class="clearfix"><span>重置密码</span></div><!--表单--&g......
  • 操作系统中文件系统的实现和分配方式探析(下)
    非连续空间存放方式我们已经对连续分配的方式有了一定的了解,并且也清楚了它存在的问题和局限性。为了解决这些问题,非连续存放的方式应运而生。非连续空间存储大致可以分为两种形式:链表形式和索引形式。链式分配链式分配是一种离散分配的方式,用于为文件分配非连续的磁盘块。它有......
  • HTML5与CSS3实现动态网页(上)
    结构标签article:标记定义一篇文章header:标记定义一个页面后者一个区域的头部nav:标记定义导航链接section:标记定义一个区域aside:标记定义页面内容部分的侧边栏hgroup:标记定义文件中一个区块的相关信息figure:标记定义一组媒体内容以及他们的标题figcaption:标签定义figure元......
  • 操作系统原理 1.1_2 操作系统的特征
    学习教程:【王道计算机考研操作系统-哔哩哔哩】https://b23.tv/fFY1XPi操作系统的特征并发并发:指两个或多个事件在同一时间间隔内发生,这些事件宏观上是同时发生,微观上是交替发生的。并发性是操作系统一个最基本的特征。易混概念—并行:指两个或多个事件在同一时刻同时发生。......