提供者模式
参考:提供者模式 | 代码酷
是什么
提供者模式(Provider Pattern)在 React 里通常指:用 Context 的 Provider 在子树根部注入共享数据,深层组件用 useContext(或 Consumer)读取,避免层层透传 props(prop drilling)。
为什么需要
组件树变深时,把 user、theme、locale 等通过每一层 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稳定引用,或改用专用状态库。