我怎樣才能避免React/JSX Pyramid的厄運?

我喜歡在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發生變化時從re-rendering中分離出來。

即使沒有上下文,您仍然可以將來自不同包的提供者堆疊到它們自己的金字塔中。下面是我的一個React Native應用程序的根目錄,例如:

<DataContext.Provider value={data}>
    <AppearanceProvider>
        <SafeAreaProvider>
            <NavigationContainer>
                <Tab.Navigator>
                    // tab screens here
                </Tab.Navigator>
            </NavigationContainer>
        </SafeAreaProvider>
    </AppearanceProvider>
</DataContext.Provider>

有沒有一個干凈的方法來“崩潰”,或以某種方式避免,這些金字塔的厄運?

? 最佳回答:

“清理”所謂的末日金字塔對性能沒有任何好處。有多個層次是完全好的。

在實現下面的代碼之前,請確保不要僅僅因為可以就在全局級別提供上下文。上下文提供程序必須包裝在使用它的組件附近,這意味著不總是在根級別。

也就是說,這里有一個簡單的高階組件,它可以包裝多個提供者以提供Reduxcompose式API。

/**
 * Check if the object has a property matching the key
 * NOTE: Works only for shallow objects.
 * @param object
 * @param key
 * @returns {boolean|boolean}
 */
const hasProperty = (object, key) =>
  object ? Object.hasOwnProperty.call(object, key) : false;
const hasProps = (arg) =>
  hasProperty(arg, 'provider') && hasProperty(arg, 'props');

export const withContextProviders = (...providers) => (Component) => (props) =>
  providers.reduceRight((acc, prov) => {
    let Provider = prov;
    if (hasProps(prov)) {
      Provider = prov.context;
      const providerProps = prov.props;
      return <Provider {...providerProps}>{acc}</Provider>;
    }
    return <Provider>{acc}</Provider>;
  }, <Component {...props} />);

Usage:

const Component = () => {...}
export withContextProviders(ThemeProvider, I8nProvider)(Component)
// OR
export withContextProviders({provider: ThemeProvider, props: {darkMode: true}}, I8nProvider)(Component)
// OR
export withContextProviders(ThemeProvider, {provider: I8nProvider, props: {lang: 'en'}})(Component)
// OR
const providers = [{provider: ThemeProvider, props: {darkMode: true}}, {provider: I8nProvider, props: {lang: 'en'}}]
export withContextProviders(...providers)(Component)

注意:這并不構成單例,也就是說,如果兩個組件用這個HoC包裝,它們都將獲得自己的context實例。對于這種情況,建議在根級別用provider包裝組件

再說一次,有多個層次是完全好的。

主站蜘蛛池模板: 精品视频一区二区三三区四区| 精品成人一区二区三区四区| 中文字幕一区二区日产乱码| 亚洲无删减国产精品一区| 极品尤物一区二区三区| 中文字幕一区在线播放| 精品一区二区三区免费毛片| 一本大道在线无码一区| 久久久久人妻一区二区三区vr| 国产一区二区四区在线观看| 高清一区二区在线观看| 精品国产区一区二区三区在线观看| 精品无码AV一区二区三区不卡| 免费看一区二区三区四区| 亚洲免费一区二区| 人妻内射一区二区在线视频| 无码一区二区三区亚洲人妻| 亚洲色偷精品一区二区三区| 亚洲一区欧洲一区| 无码精品尤物一区二区三区| 久久人做人爽一区二区三区| 日韩人妻一区二区三区免费 | 无码一区二区三区在线 | 精品在线一区二区| 精品一区二区三区无码视频| 日本一区二区在线免费观看| 国产aⅴ一区二区| 久久久久女教师免费一区| 丝袜人妻一区二区三区网站| 国产福利电影一区二区三区,日韩伦理电影在线福 | 波多野结衣中文字幕一区二区三区 | 国产午夜精品一区二区| 国产不卡视频一区二区三区| 国产成人片视频一区二区| 中文字幕在线无码一区| 国产探花在线精品一区二区| 一区二区视频在线| 麻豆AV天堂一区二区香蕉| 国产在线一区二区杨幂| 国产伦精品一区二区三区视频金莲| 国产美女露脸口爆吞精一区二区|