手写一个简易的响应式系统

class Dep {  constructor() {    this.subscribers = new Set();  }  depend() {    if (activeEffect) {      this.subscribers.add(activeEffect);    }  }  notify() {    this.subscribers.forEach(effect => effect());  }}let activeEffect = null;function reactive(obj) {  return new Proxy(obj, {    get(target, key) {      const dep = getDep(target, key);      dep.depend();      return Reflect.get(target, key);    },    set(target, key, value) {      const dep = getDep(target, key);      const result = Reflect.set(target, key, value);      dep.notify();      return result;    }  });}function getDep(target, key) {  let depsMap = targetMap.get(target);  if (!depsMap) {    depsMap = new Map();    targetMap.set(target, depsMap);  }  let dep = depsMap.get(key);  if (!dep) {    dep = new Dep();    depsMap.set(key, dep);  }  return dep;}const targetMap = new WeakMap();function effect(fn) {  activeEffect = fn;  fn();  activeEffect = null;}

代码说明:

实现了基本的依赖收集(Dep类)和响应式对象(Proxy代理)

支持对象属性的get/set拦截,自动追踪依赖关系

使用effect函数注册副作用函数,触发时自动更新

通过WeakMap存储依赖关系,避免内存泄漏

模拟了Vue2的核心响应式机制,但未处理数组和新增属性


标签:

相关文章

如果百度不收录,如何提高网站人气

假设你是一个新兴的瑜伽品牌,你创建了一个网站来宣传你的瑜伽课程和品牌。然而,你发现百度搜索引擎并没有收录你的网站,这导致你的网站流量和人气较低。以下是你可以采取的一些策略来提高网站人气:优化网站结构:...

国庆节之后

国庆节之后,秋意渐浓,天空如洗,阳光更加灿烂。在这片美丽的土地上,繁华的都市和静谧的乡村都在庆祝这个重要的节日。国人们以独特的方式,让这个日子充满了色彩和热情。随着金秋的步伐,丰收的季节来临。果园中的...

前端聊天室

<!DOCTYPE html> <html> <head>   <title>Socket.IO 聊天室&...

‌前端开发中的一场「交通革命」——小明与面向对象的故事

第一章:初识面向对象前端工程师小明接到一个需求:‌开发交互式交通信号灯管理系统‌,要求每个信号灯能独立切换红、黄、绿三色,且支持动态增减数量。面对看似复杂的逻辑,小明决定采用 ‌面向对象编程(OOP)...

前端数组操作

JavaScript数组是前端开发中最常用的数据结构之一,下面我将详细介绍数组的创建、操作和常用方法。一、数组创建方式‌字面量创建‌(最常用方式):var arr1 = ...

数组和对象

数组和对象是编程中最基础且强大的两种数据结构,它们的联合使用可以构建出复杂且高效的数据处理方案。本文将全面介绍数组与对象联合使用的各个方面,包括基本概念、不同语言的实现方式、最佳实践、性能优化以及常见...