【发布时间】:2021-10-03 14:05:54
【问题描述】:
我喜欢在我的 React 和 React Native 项目中使用上下文,这意味着每个项目有多个上下文提供者。结果,我的应用程序的根目录通常如下所示:
<ContextA.Provider value={valueA}>
<ContextB.Provider value={valueB}>
<ContextC.Provider value={valueC}>
// ...and so on until rendering actual app content
</ContextC.Provider>
</ContextB.Provider>
</ContextA.Provider>
这会创建一个看起来和感觉都像是不良风格/做法的提供商金字塔。
我可以将我的上下文值集中到一个大提供者中:
<BigContext.Provider value={ valueA, valueB, valueC }>
/// app content
</BigContext.Provider>
...但是有一些充分的理由希望保持上下文分离 - 主要是防止仅对 valueA 感兴趣的组件在仅 valueB 更改时重新渲染。
即使没有上下文,您仍然可以让来自不同软件包的提供程序堆叠到它们自己的金字塔中。这是我的一个 React Native 应用程序的根目录,例如:
<DataContext.Provider value={data}>
<AppearanceProvider>
<SafeAreaProvider>
<NavigationContainer>
<Tab.Navigator>
// tab screens here
</Tab.Navigator>
</NavigationContainer>
</SafeAreaProvider>
</AppearanceProvider>
</DataContext.Provider>
有没有一种干净的方法来“崩溃”或以某种方式避免这些末日金字塔?
【问题讨论】:
-
我个人将我的提供者保存在一个名为
Providers的单独组件中,并且仅使用该组件来包装我的应用程序内容。我仍然创造了那个金字塔,但让它远离眼睛。不幸的是,没有办法避免这种情况。唯一的选择是使用像 redux 或 mobx 这样的状态管理库,但对于小型项目来说这可能是一种矫枉过正 -
唯一一种不好的风格/做法可能是您将不同类型的提供者混为一谈。例如,假设您有多个用于状态管理的提供程序和多个用于导航的提供程序。您可以做的是创建一个名为
StateManagementProviders的组件并将所有相关的提供程序放在那里,另一个名为NavigationProviders。然后,您可以将这两个提供程序嵌套在您的App组件中。 -
在某种意义上,你可以说拥有多个嵌套的 div 就是 Doom 的 div,看不到尝试折叠它的有价值的理由
-
@DennisVash 你没看错,但在这种情况下,没有一个嵌套的提供者只有一个孩子,从而创建了一个直金字塔。如果您有 5 个以上的嵌套 div,每个 div 只有一个孩子,那么您通常会做错事。
标签: reactjs react-native jsx use-context