欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > js高阶-响应式原理

js高阶-响应式原理

2025/3/29 16:20:05 来源:https://blog.csdn.net/qq_73270720/article/details/145262654  浏览:    关键词:js高阶-响应式原理

what

  • 当变量变化的时候,涉及到这个变量的操作重新执行
  • 更多是针对对象类型进行监听(原始数据类型是不变的,任何的修改实质是创建了新值)

how

  • 响应式对象创建 Proxy
  • 响应式对象与依赖之间的映射关系 weakMap-map-set
  • 依赖函数收集

创建响应式对象

vue3

//响应式对象创建function reactive(obj) {return new Proxy(obj, {get(target, key) {const depend = getDepend(target, key);//依赖收集depend.addDepend();//返回return Reflect.get(target, key);},set(target, key, value) {const depend = getDepend(target, key);depend.notify();Reflect.set(target, key, value);},});}

vue2方式

//vue2的响应式操作function reactive2(obj){Object.keys(obj).forEach(key=>{let value = obj[key]Object.defineProperty(obj,key,{get(){const depend = getDepend(obj,key)depend.depend()return value},set(newValue){const depend = getDepend(obj,key)depend.notify()value = newValue}})})return obj}

对象-依赖关系

let targetMap = new WeakMap(); // 响应式对象与依赖关系的映射 1.对象与属性的映射 2.属性与依赖函数的映射class Depend {constructor() {this.reactiveFns = new Set();}//收集依赖addDepend() {if (activeReactiveFn) {this.reactiveFns.add(activeReactiveFn);}}//通知依赖notify() {this.reactiveFns.forEach((fn) => {if(fn){fn()}});}}function getDepend(target, key) {//1.根据target获取maplet map = targetMap.get(target);if (!map) {map = new Map();targetMap.set(target, map);}//2.根据key获取dependlet depend = map.get(key);if (!depend) {depend = new Depend();map.set(key, depend);}return depend;}

依赖函数收集

let activeReactiveFn = null; // 当前激活的响应式函数
//响应式函数收集---被watchFn收集的函数会成为响应式的依赖,当数据变化这些函数会被调用function watchFn(fn) {activeReactiveFn = fn;fn();activeReactiveFn = null;}

使用

const obj = {name: "张三",age: 18,};//1.创建响应式对象const objRef = reactive(obj);//2.收集依赖函数watchFn(()=>{console.log(objRef.name)})watchFn(()=>{console.log(objRef.age)})

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词