You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React项目初始化全局状态,实现路由组件间数据共享

React 路由组件间全局状态共享方案

你要的这种全局状态共享需求,用 React Context 就能实现,而且完全支持读写操作——之前你对 Context 的理解有偏差,它不仅是用来包裹组件的容器,更是 React 官方推荐的轻量全局状态传递方案。下面是适配你需求的完整实现:


1. 创建全局状态 Context

新建 GlobalStateContext.tsx 文件,封装全局状态的创建、Provider 和便捷获取 Hook:

import React, { createContext, useContext, useState, ReactNode } from 'react';

// 定义全局状态的类型(TypeScript 语法,JS 项目可省略)
type GlobalStateType = {
  globalNumber: number;
  setGlobalNumber: (value: number) => void;
};

// 创建 Context,初始值设为 null,后续由 Provider 注入实际状态
const GlobalStateContext = createContext<GlobalStateType | null>(null);

// 全局状态 Provider 组件,包裹需要访问状态的子组件
export const GlobalStateProvider = ({ children }: { children: ReactNode }) => {
  // 初始化全局计数器为 0
  const [globalNumber, setGlobalNumber] = useState(0);

  return (
    <GlobalStateContext.Provider value={{ globalNumber, setGlobalNumber }}>
      {children}
    </GlobalStateContext.Provider>
  );
};

// 自定义 Hook,简化全局状态的获取逻辑
export const useGlobalState = () => {
  const context = useContext(GlobalStateContext);
  if (!context) {
    throw new Error('useGlobalState 必须在 GlobalStateProvider 内部使用');
  }
  return context;
};

2. 修改根组件注入全局状态

更新 index.tsx,用 GlobalStateProvider 包裹路由组件:

import React from "react";
import ReactDOM from "react-dom/client";

import { BrowserRouter as Router, Route, Routes } from "react-router-dom";
import App1 from "./App1";
import App2 from "./App2";
// 导入全局状态 Provider
import { GlobalStateProvider } from "./GlobalStateContext";

const root = ReactDOM.createRoot(
  document.getElementById("root") as HTMLElement
);

root.render(
  <React.StrictMode>
    {/* 用 Provider 包裹整个路由系统,让所有子组件都能访问全局状态 */}
    <GlobalStateProvider>
      <Router>
        <Routes>
          <Route path="/app1" element={<App1 />} />
          <Route path="/app2" element={<App2 />} />
        </Routes>
      </Router>
    </GlobalStateProvider>
  </React.StrictMode>
);

3. 在路由组件中读写全局状态

修改 App1.tsx(写状态):

// 导入自定义 Hook
import { useGlobalState } from "./GlobalStateContext";

const App1 = () => {
  // 获取全局状态和更新方法
  const { globalNumber, setGlobalNumber } = useGlobalState();
  return (
    <button
      onClick={() => {
        setGlobalNumber(globalNumber + 1);
      }}
    >
      Click me to increment global number!
    </button>
  );
};
export default App1;

修改 App2.tsx(读状态):

// 导入自定义 Hook
import { useGlobalState } from "./GlobalStateContext";

const App2 = () => {
  // 获取全局状态值
  const { globalNumber } = useGlobalState();
  return <h1>Global number is currently: {globalNumber}</h1>;
};
export default App2;

实现效果

在 /app1 页面点击按钮递增计数器后,切换到 /app2 页面就能看到更新后的数值,完全满足你的需求。

内容的提问来源于stack exchange,提问作者Steinn Hauser Magnússon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 21:50:22