当前位置: 首页 > article >正文

React中用到的Javascript设计模式详解

以下是对 React 响应式底层使用的设计模式的更加详细说明,并提供简单的代码示例,展示这些模式在 React 中的实现方式。


1. 观察者模式(Observer Pattern)

观察者与发布订阅设计模式

定义

观察者模式用于建立一对多的依赖关系,当对象状态发生变化时,所有依赖的观察者会被自动通知。
在这里插入图片描述
在这里插入图片描述

在 React 中的实现

React 的状态管理和组件更新使用了观察者模式。组件的 state 变化会触发依赖于该状态的 UI 更新。

代码示例

class Observable {
  constructor() {
    this.subscribers = []; // 订阅者列表
  }

  subscribe(observer) {
    this.subscribers.push(observer); // 添加订阅者
  }

  notify(data) {
    this.subscribers.forEach((observer) => observer(data)); // 通知所有订阅者
  }
}

// React 组件模拟
const state = new Observable();

function App() {
  const [count, setCount] = React.useState(0);

  React.useEffect(() => {
    state.subscribe((newCount) => {
      setCount(newCount); // 当状态变化时更新 UI
    });
  }, []);

  return (
    <button onClick={() => state.notify(count + 1)}>Count: {count}</button>
  );
}

2. 发布-订阅模式(Publish-Subscribe Pattern)

定义

发布-订阅模式通过中间代理(如事件总线)解耦发布者和订阅者,发布者通过中介通知订阅者。

在 React 中的实现

React 的事件系统和 Redux 都使用了发布-订阅模式。例如,Redux 中的 dispatch 通知所有订阅者。

代码示例

// 简单的事件总线实现
class EventBus {
  constructor() {
    this.events = {};
  }

  subscribe(event, callback) {
    if (!this.events[event]) {
      this.events[event] = [];
    }
    this.events[event].push(callback);
  }

  publish(event, data) {
    if (this.events[event]) {
      this.events[event].forEach((callback) => callback(data));
    }
  }
}

const eventBus = new EventBus();

function Publisher() {
  return (
    <button onClick={() => eventBus.publish("increment", 1)}>
      Publish Event
    </button>
  );
}

function Subscriber() {
  const [count, setCount] = React.useState(0);

  React.useEffect(() => {
    eventBus.subscribe("increment", (data) => setCount((c) => c + data));
  }, []);

  return <div>Count: {count}</div>;
}

function App() {
  return (
    <div>
      <Publisher />
      <Subscriber />
    </div>
  );
}

3. 代理模式(Proxy Pattern)

在这里插入图片描述

定义

代理模式为对象提供一个代理,以控制对对象的访问或增加功能

在 React 中的实现

React 的事件代理(如合成事件)和 Fiber 是代理模式的应用,代理真实 DOM 和任务调度。

代码示例

// 自定义代理函数
const createProxy = (target) => {
  return new Proxy(target, {
    get(obj, prop) {
      console.log(`Accessing property ${prop}`);
      return obj[prop];
    },
    set(obj, prop, value) {
      console.log(`Setting property ${prop} to ${value}`);
      obj[prop] = value;
      return true;
    },
  });
};

const state = createProxy({ count: 0 });

function App() {
  const [count, setCount] = React.useState(state.count);

  function increment() {
    state.count += 1; // 更新代理对象
    setCount(state.count); // 触发 UI 更新
  }

  return <button onClick={increment}>Count: {count}</button>;
}

4. 策略模式(Strategy Pattern)

定义

策略模式定义一系列算法,将它们封装起来并使它们可以互换

在 React 中的实现

React 的 Diff 算法使用策略模式,根据节点的类型选择不同的更新策略。

代码示例

// 策略模式实现
const strategies = {
  text: (node, value) => (node.textContent = value),
  style: (node, value) => Object.assign(node.style, value),
};

function applyUpdate(node, type, value) {
  if (strategies[type]) {
    strategies[type](node, value); // 根据类型选择策略
  }
}

// 示例应用
const node = document.createElement("div");
applyUpdate(node, "text", "Hello World");
applyUpdate(node, "style", { color: "red", fontSize: "20px" });
console.log(node); // <div style="color: red; font-size: 20px;">Hello World</div>

5. 组合模式(Composite Pattern)

定义

组合模式将对象组合成树形结构,用来表示“整体-部分”的层次关系。

在 React 中的实现

React 组件树的设计就是组合模式的体现,每个组件可以包含子组件。

代码示例

function App() {
  return (
    <div>
      <Header />
      <Main>
        <Sidebar />
        <Content />
      </Main>
      <Footer />
    </div>
  );
}

function Header() {
  return <header>Header</header>;
}

function Main({ children }) {
  return <main>{children}</main>;
}

function Sidebar() {
  return <aside>Sidebar</aside>;
}

function Content() {
  return <section>Content</section>;
}

function Footer() {
  return <footer>Footer</footer>;
}

6. 高阶组件模式(HOC,Higher-Order Component)

定义

高阶组件是一个函数,接受组件作为参数并返回一个增强的组件

在 React 中的实现

高阶组件用于为现有组件添加功能,例如权限控制、日志记录等。

代码示例

function withLogger(WrappedComponent) {
  return function EnhancedComponent(props) {
    console.log("Props received:", props);
    return <WrappedComponent {...props} />;
  };
}

function Button({ label }) {
  return <button>{label}</button>;
}

const EnhancedButton = withLogger(Button);

function App() {
  return <EnhancedButton label="Click Me" />;
}

总结

React 响应式底层用到了多个设计模式:

  1. 观察者模式:用于状态和 UI 的同步。
  2. 发布-订阅模式:用于事件系统和状态管理。
  3. 代理模式:用于事件代理和 Fiber 调度。
  4. 策略模式:用于 Diff 算法和状态更新策略。
  5. 组合模式:用于组件树的组织。
  6. 高阶组件模式:用于增强组件功能。

这些设计模式相互结合,使 React 具备高性能、灵活性和易扩展性,同时简化了开发者的工作。


http://www.kler.cn/a/508918.html

相关文章:

  • Linux 管道操作
  • CSS:语法、样式表、选择器
  • HTML5 Canvas实现的跨年烟花源代码
  • Autodl转发端口,在本地机器上运行Autodl服务器中的ipynb文件
  • OpenCV相机标定与3D重建(55)通用解决 PnP 问题函数solvePnPGeneric()的使用
  • IP层之分片包的整合处理
  • Chromium 132 编译指南 Mac篇(一)- 环境准备
  • C#高级:用Csharp操作鼠标
  • Vue.js组件开发案例(比较两个数字大小)
  • 数据库:Redis命令行帮助解释
  • HarmonyOS NEXT开发进阶(九):UIAbility 组件生命周期及启动模式讲解
  • Google Titans 是否会终结基于 Transformer 的大语言模型(LLMs)
  • sort(函数模板)和priority_queue(类模板)的比较器重载
  • Dexie.js 事务管理详解
  • 读spring官方文档的一些关键知识点介绍
  • Node-Red使用笔记
  • 关于安科瑞Acrel-1000DP分布式光伏监控系统的实际案例分析-安科瑞 蒋静
  • 【JavaEE】Spring(1)
  • ASP .NET Core 学习 (.NET 9)- 创建 API项目,并配置Swagger及API 分组或版本
  • 论文浅尝 | 从大型语言模型进行情境化提炼以完成知识图谱(ACL2024)
  • 人脸识别【python-基于OpenCV】
  • 一文读懂服务器的HBA卡
  • SpringBoot的Bean-初级获取bean对象
  • Unity新版InputSystem短按与长按,改键的实现
  • 《自动驾驶与机器人中的SLAM技术》ch4:基于预积分和图优化的 GINS
  • Nginx调优