React组件通信——context(提供者/消费者)

发布于:2025-06-19 ⋅ 阅读:(16) ⋅ 点赞:(0)

Context 是 React 提供的一种组件间通信方式,主要用于解决跨层级组件 props 传递的问题。它允许数据在组件树中"跨级"传递,无需显式地通过每一层 props 向下传递。

一、Context 核心概念

1. 基本组成

  • React.createContext:创建 Context 对象

  • Context.Provider:提供数据的组件

  • Context.Consumer 或 useContext:消费数据的组件

2. 工作原理

二、示例

创建 Context 文件(独立模块)

// contexts/ThemeContext.js
import { createContext } from 'react';

// 1. 创建Context并导出
const ThemeContext = createContext('light'); // 默认值

// 2. 导出Provider组件
export const ThemeProvider = ThemeContext.Provider;

// 3. 直接导出Context对象
export default ThemeContext;

提供者文件

// App.js
import React, { useState } from "react";
import { ThemeProvider } from "./contexts/ThemeContext";
import ThemedButton from "./ThemeButton";

function App() {
  const [theme, setTheme] = useState("dark");

  return (
    <ThemeProvider value={theme}>
      <ThemedButton />
      <button onClick={() => setTheme(theme === "dark" ? "light" : "dark")}>
        切换主题
      </button>
    </ThemeProvider>
  );
}

export default App;

消费者文件

// ThemedButton.js
import React, { useContext } from "react";
import ThemeContext from "./contexts/ThemeContext";

function ThemedButton() {
  // 方式一:使用从Context文件导入的同一个Context对象
  const theme = useContext(ThemeContext);

  return (
    <div>
      <button
        style={{
          background: theme === "dark" ? "#333" : "#EEE",
          color: theme === "dark" ? "white" : "black",
        }}
      >
        当前主题: {theme}
      </button>

      {/* 方式二:适用于class组件 */}
      <ThemeContext.Consumer>
        {(theme) => {
          return (
            <button
              style={{
                background: theme === "dark" ? "#333" : "#EEE",
                color: theme === "dark" ? "white" : "black",
              }}
            >
              当前主题: {theme}
            </button>
          );
        }}
      </ThemeContext.Consumer>
    </div>
  );
}

export default ThemedButton;

网站公告

今日签到

点亮在社区的每一天
去签到