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

React Context 实现全局组件注册

来源于GPT4o:https://ai.openaicloud.cn/?inVitecode=EJSTWFZMQE

第一步:创建全局组件上下文 (GlobalComponentProvider)
我们将创建一个 React Context 和 Provider,用于存储和提供全局组件。

// src/context/GlobalComponentProvider.tsx
import React, { createContext, ReactNode, useContext } from "react";
import { Button, Input } from "antd"; // 这里导入你想全局使用的组件

// 创建一个 Context 存储全局组件
const GlobalComponentContext = createContext<Record<string, React.ComponentType<any>> | null>(null);

interface GlobalComponentProviderProps {
  children: ReactNode;
}

// 创建 Provider 将全局组件注入 Context
export const GlobalComponentProvider = ({ children }: GlobalComponentProviderProps) => {
  const globalComponents = {
    Button, // 在此处注册所有你想全局使用的组件
    Input,
  };

  return (
    <GlobalComponentContext.Provider value={globalComponents}>
      {children}
    </GlobalComponentContext.Provider>
  );
};

// 自定义 Hook 用于访问全局组件
export const useGlobalComponents = () => {
  const context = useContext(GlobalComponentContext);
  if (!context) {
    throw new Error("useGlobalComponents must be used within a GlobalComponentProvider");
  }
  return context;
};

第二步:在项目入口文件中注入 GlobalComponentProvider
将 GlobalComponentProvider 包裹在应用的最外层组件中(通常在 index.tsx 或 main.tsx 文件中),这样所有子组件都能访问全局组件。

// src/index.tsx
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import { GlobalComponentProvider } from "./context/GlobalComponentProvider";

const root = ReactDOM.createRoot(document.getElementById("root")!);
root.render(
  <React.StrictMode>
    <GlobalComponentProvider>
      <App />
    </GlobalComponentProvider>
  </React.StrictMode>
);

第三步:在组件中使用全局组件
通过 useGlobalComponents Hook,可以在任意组件中访问和使用这些全局注册的组件。

// src/App.tsx
import React from "react";
import { useGlobalComponents } from "./context/GlobalComponentProvider";

const App = () => {
  // 使用自定义 Hook 获取全局组件
  const { Button, Input } = useGlobalComponents();

  return (
    <div>
      <h1>Global Components Example</h1>
      <Button type="primary">Click Me</Button>
      <Input placeholder="Type something" />
    </div>
  );
};

export default App;

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

相关文章:

  • “UniApp的音频播放——点击视频进入空白+解决视频播放器切换视频时一直加载的问题”——video.js、video-js.css
  • LeetCode - #187 Swift 实现重复的DNA序列
  • Vue.js 动态设置表格最大高度的实现
  • [LeetCode] 链表完整版 — 虚拟头结点 | 基本操作 | 双指针法 | 递归
  • HTML应用指南:利用GET请求获取全国特斯拉充电桩位置
  • 解决 MySQL 服务无法启动:failed to restart mysql.service unit not found
  • 【2024 CSDN博客之星】技术洞察类:从DeepSeek-V3的成功,看MoE混合专家网络对深度学习算法领域的影响(MoE代码级实战)
  • postgresql的用户、数据库和表
  • 内存原理:计算机存储的核心奥秘
  • Python预训练视觉和大语言模型——精彩试读
  • hive表修改字段类型没有级连导致历史分区报错
  • iOS 内购接入StoreKit2 及低与iOS 15 版本StoreKit 1 兼容方案实现
  • 【算法学习笔记】34:扩展欧几里得算法
  • nginx伪静态配置解释和Nginx 常见的配置
  • Unreal Engine 5 C++ Advanced Action RPG 十章笔记
  • Git合并多次提交,改成一个简洁的提交历史
  • K8S中Pod控制器之ReplicaSet(RS)控制器
  • android 开发中遇到的小问题整理
  • Android平台如何采集屏幕数据并推送RTMP服务器实现无纸化同屏?
  • 项目实战--网页五子棋(游戏大厅)(3)
  • 如何使用 Redis 作为高效缓存
  • 在swiper中显示echarts图表,echarts的点击事件无效,图例点击也没有反应
  • Maven 快速上手
  • [2025分类时序异常检测指标R-AUC与VUS]
  • Spring Boot依赖管理:Maven与Gradle实战对比
  • NPM 下载依赖超时:npm ERR! RequestError: connect ETIMEDOUT