其他
多个嵌套组件需要共享同一数据且 prop drilling…
当多个嵌套组件需要访问主题、鉴权、语言等同一份跨层级/全局数据时,用 React Context 与 Provider 替代逐层传递 props。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
多个嵌套组件需要共享同一数据且 prop通用
解决思路
- 用 React.createContext() 创建 Context 对象,例如 const DataContext = React.createContext()。
- 用 <DataContext.Provider value={data}> 包裹所有需要访问该数据的组件,把要共享的数据放在 value 上。
- 在消费组件中调用 React.useContext(DataContext) 读取共享值,例如 const { data } = React.useContext(DataContext)。
- 不要再把 data 作为 props 逐层传给不需要它的 SideBar、List、ListItem、Content、Header、Block、Text 等中间组件。
- 共享全局数据(如主题、鉴权、语言)时使用 Provider Pattern;例如主题场景先定义 const ThemeContext = React.createContext()。
- 为主题定义 themes 对象,例如 light 和 dark 分别配置 background、color。
- 在 App 中用 useState 管理当前 theme,并实现 toggleTheme,在 light 和 dark 之间切换。
- 构造 providerValue,把 theme: themes[theme] 和 toggleTheme 放进同一个 value 对象。
- 用 <ThemeContext.Provider value={providerValue}> 包裹 Toggle、List 等需要使用主题的组件。
- 在 Toggle 组件中用 useContext(ThemeContext) 获取 toggleTheme,并把它绑定到 input 的 onClick 上触发切换。
- 在 ListItem、TextBox 等真正需要主题的组件中用 useContext(ThemeContext) 获取 theme,并把 theme 应用到 style 上。
- 创建自定义 hook 封装 context 消费逻辑,例如 function useThemeContext() { const theme = useContext(ThemeContext); return theme; },组件只调用 useThemeContext(),不用逐个导入 useContext 和 Context。
- 在自定义 hook 中做有效性校验,如果 !theme 就 throw new Error("useThemeContext must be used within ThemeProvider")。
- 抽取专用 Provider 组件,例如 function ThemeProvider({ children }) { ... },内部管理 useState、toggleTheme 和 providerValue,并返回 <ThemeContext.Provider value={providerValue}>{children}</ThemeContext.Provider>。
- 在 App 中用 <ThemeProvider> 包裹子组件,把 context 逻辑与渲染组件分离,提高复用性。
- 组件需要主题时改用 useThemeContext(),例如 const theme = useThemeContext()。
- 如果使用 styled-components 等库,优先使用其内置 Provider,例如 import { ThemeProvider } from 'styled-components',并用 <ThemeProvider theme={themes[theme]}> 包裹应用。
- 在 styled component 中通过 ${({ theme }) => ...} 访问 theme.backgroundColor、theme.color,而不是给 ListItem 传 inline style。
- 避免对频繁更新的值过度使用 context,因为所有消费该 context 的组件都会在状态变化时重新渲染。
- 按关注点拆分 context/provider,为不同 usecase 创建多个 provider,减少不必要重渲染;例如计数器中 Reset 组件不应因消费 useCountContext 而在每次计数变化时重渲染。
适用边界 · 注意事项
- 当共享值频繁更新且被大量组件消费时,不要用单个 context 承载,否则所有消费者都会重渲染;应拆分 providers 或改用其他状态管理方案。
- 当组件树很浅、只有少数组件需要传值,或 prop drilling 并不难维护时,直接用 props 更简单,避免过度抽象。
- 当性能对每次 context 更新导致的消费者重渲染非常敏感时,Provider Pattern 可能不适用,需要拆分 context 或评估其他优化方案。