1. useContext 的 Provider 拆分与 re-render 性能治理
useContext 的 Provider 如何拆分才能治理 re-render 性能?拆分的原则与边界是什么?
- context 值变化触发所有消费者重渲染
- Provider 拆分的粒度与 value 稳定性
- 组合 context 与选择器方案的取舍
useContext 的性能问题在于"广播式"更新:Provider 的 value 变化时,所有直接消费该 context 的组件(无论是否 memo)都会重渲染,且 memo 无法阻断 context 消费。治理手段之一是按"变化频率"拆分 Provider:把高频变化的数据(输入内容、鼠标位置)与低频数据(主题、用户信息)拆成不同 context,高频消费者只订阅自己的 context,避免低频数据变化波及高频组件或反之;拆分原则是"同一 context 内的值应具有相近的变化频率与消费群体"。
其它治理手段:用 useMemo 稳定 value 对象(每次渲染新引用会让所有消费者重渲染);组件按 context 拆"薄壳"——把消费 context 的逻辑放在叶子组件,避免大组件整树重渲染;对"大量条目各自读取共享数据"的场景,拆分 context 无法根治,考虑状态库(useSyncExternalStore 细粒度订阅)或选择器模式。边界:过度拆分会带来 Provider 嵌套地狱与维护成本,实践中拆 2-4 个按频率分层即可;React 19 的 React Compiler 不解决 context 广播问题(编译器无法推断 context 语义),仍需人工设计。
答题核心是"context 广播式更新 + 按变化频率拆分 Provider + value 稳定性",再补充薄壳组件与状态库两条替代路径,最后用拆分粒度边界收尾。