Skip to content

Context:跨层传参的「广播」,不是全局 Redux替代品

知识背景

Props 一层层向下传(prop drilling)在深层组件树里很冗长。Context 让中间层不必显式传递,由 Provider 注入值、下层 useContext 读取。
典型用途:主题、当前语言、轻量用户态、路由/表单库内部。Context 的值变化时,消费该 Context 的组件都会重渲染(除非拆分 Context 或配合 memo + 稳定 value技巧)。


知识详解与通俗解释

1. 最小示例

jsx
const ThemeCtx = createContext('light');

function App() {
  return (
    <ThemeCtx.Provider value="dark">
      <Toolbar />
    </ThemeCtx.Provider>
  );
}

function Toolbar() {
  const theme = useContext(ThemeCtx);
  return <span>{theme}</span>;
}

2. 性能注意:value 每次是新对象会拖垮子树

jsx
// 不好:每次 App 渲染都是新对象,所有消费者都更新
<Ctx.Provider value={{ user, token }}>

// 较好:useMemo 合并 value,或拆成多个 Context
const auth = useMemo(() => ({ user, token }), [user, token]);
<AuthCtx.Provider value={auth}>

通俗说:Context 像公司广播:广播稿天天换全文,全楼人都得抬头听;拆频道(多个 Context)或稳定广播稿(memo 对象)能减少骚动。

3. 何时不该只用 Context

高频更新、复杂异步数据流、时间旅行调试——更适合 Redux / Zustand / React Query 等;Context 更适合中低频、范围明确的共享。

4. 默认值与多层 Provider

createContext(default) 仅在没有匹配 Provider时生效;外层 Provider 可覆盖内层,类似 CSS 就近原则。


总结

  • Context 解决 跨层传递,不是替代所有全局状态。
  • value 引用稳定性决定重渲染范围,是性能关键。
  • 大应用常见模式:服务器状态用请求库,客户端全局用专用 store,主题/语言用 Context