Skip to content
目录

提供者模式

参考:提供者模式 | 代码酷

是什么

提供者模式(Provider Pattern)在 React 里通常指:用 Context 的 Provider 在子树根部注入共享数据,深层组件用 useContext(或 Consumer)读取,避免层层透传 props(prop drilling)。

为什么需要

组件树变深时,把 userthemelocale 等通过每一层 props 传递冗长且易错。Provider 把「谁提供」和「谁消费」固定在 Context 边界内。

基本用法

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

type Theme = 'light' | 'dark';

const ThemeContext = createContext<{
  theme: Theme;
  toggleTheme: () => void;
} | null>(null);

export function ThemeProvider({ children }: { children: ReactNode }) {
  const [theme, setTheme] = useState<Theme>('light');
  const toggleTheme = () =>
    setTheme((t) => (t === 'light' ? 'dark' : 'light'));

  return (
    <ThemeContext.Provider value={{ theme, toggleTheme }}>
      {children}
    </ThemeContext.Provider>
  );
}

export function useTheme() {
  const ctx = useContext(ThemeContext);
  if (!ctx) throw new Error('useTheme must be used within ThemeProvider');
  return ctx;
}

常见场景

  • 主题、语言、认证用户。
  • 设计系统 Token(仅样式相关时也可配合 CSS 变量)。

注意

  • Context 默认值在测试与 Storybook 中要包好 Provider,否则 useContext 得到 undefined
  • 高频更新的 value 会导致大范围重渲染,可拆多个 Context 或使用 useMemo 稳定引用,或改用专用状态库。

参考

MIT License.