我有一个应用程序,我正在使用3 Context Provider.为了让应用程序正常工作,我必须将<App/>包在所有这些providers中.随着我的应用程序的发展,我希望能有更多的Provider 来提供我需要连接的更多类型的数据.我已经开始觉得,可能有更好的方式让供应商进入<App />.

My 100 Code:

import React from 'react';
import { createStackNavigator } from 'react-navigation-stack';
import { createAppContainer } from 'react-navigation';
import { Provider as BlogProvider} from './src/context/BlogContext';
import { Provider as VehicleProvider} from './src/context/VehicleContext';
import { Provider as AuthProvider} from './src/context/AuthContext';

import IndexScreen from './src/screens/IndexScreen';
import ShowScreen from './src/screens/ShowScreen';
import CreateScreen from './src/screens/CreateScreen';
import EditScreen from './src/screens/EditScreen';
import VehicleScreen from './src/screens/VehicleScreen';

const navigator = createStackNavigator(
  {
    Index: IndexScreen,
    Show: ShowScreen,
    Create: CreateScreen,
    Edit: EditScreen,
    Debug: DebugScreen,
    Vehicle: VehicleScreen,

  },
  {
    initialRouteName: 'Index',
    defaultNavigationOptions: {
      title: 'Main'
    }
  }
);

const App = createAppContainer(navigator);

export default () => {
  return (
    <BlogProvider>
      <VehicleProvider>
        <AuthProvider>
             <App />
        </AuthProvider>
      </VehicleProvider>
    </BlogProvider>
  );
};

Some of the questions I have are:

  1. 是否有更好的方法在应用程序中使用多个上下文提供程序.
  2. 这些提供者的嵌套顺序对应用程序有影响吗?
  3. 我们可以跳过在<App/>中添加提供者,而是在需要的任何屏幕中导入它们,并在其中包装该屏幕元素吗?

推荐答案

我不会按问题的顺序回答.

Answer 3

如果提供程序仅为特定组件提供上下文,则应在该组件中导入并使用它.DO NOT用它包裹App.

原因是,无论何时更新提供者,每个使用者都将重新呈现,您不能使用React.memoReactPureComponentshouldComponentUpdate来停止它.You should not overuse context

const Root = () => {
  return (
    <AppProvider>
      <ComponentProvider>
        <App/>
      <ComponentProvider>
    </AppProvider>
  )
}

const App = () => {
  return (
    <>
      <ComponentA/>
      <ComponentB/>
    <>
  )
}

const ComponentContext = createContext()
const ComponentProvider = ({ children }) => {
  // If any value here is updated --> all consumer will be render
  // --> App re-render --> ComponentA and ComponentB re-render
  return (
    <ComponentContext.Provider value={{ value1, value2, value }}>
      {children}
    </ComponentContext.Provider>
  )
}

你应该这样做

const Root = () => {
  <AppProvider>
    <App/>
  </AppProvider>
}

const App = () => {
  return (
   <>
    <ComponentA/>
    <ComponentB/>
   <>
  )
}

const ComponentA = () => {
  return (
    <ComponentProvider>
      <OtherComponent/>
    <ComponentProvider>
   )
}

const ComponentContext = createContext()
const ComponentProvider = ({ children }) => {
  // If any value here is updated --> all consumer (ComponentA only) will be render
  return (
    <ComponentContext.Provider value={{ value1, value2, value3 }}>
      {children}
    </ComponenContext.Provider>
  )
}

Answer 1

答案3可以回答这个问题,在正确的位置使用上下文(对于仅使用上下文的组件.不要在应用程序级别随机使用每个上下文).如果上下文经常更新,我建议不要使用other ways,这样就可以使用React.memoPureComponentshouldComponentUpdate来防止不必要的重新渲染,从而优化性能.

Answer 2

订单不会影响应用程序.

React-native相关问答推荐

如何在API调用期间将本地存储(Expressc存储)中的令牌传递到后台

如何更改分隔底部标签和屏幕内容的线的 colored颜色 ?React Native Tab导航器

如何在Recact Native中单击Back按钮后调用函数

在 react native 平面列表中动态定位弹出窗口

Error: Invariant Violation: Touchable child must either be native or forward setNativeProps to a native component stack

Eslint 错误,configuration for rule "import/no-cycle" is invalid

纯在 Swift 中的 React Native 应用程序

React-Native Android 中隐藏(hide)的元素溢出

React Native - 用分机拨打电话号码

如何使用react钩子设置状态数组

更改默认的 React Native 下拉箭头图标

将 svg 转换为 react-native-svg

无法在 react native >= 0.60 中链接assets(字体)

Rich ReactNative TextInput

如何将 Leaflet.js 与 react-native 一起使用

如何在 React Native 的 MapView 中设置标记

Tools > Android 菜单在 Android Studio 中不存在

在react-native中调试应用程序崩溃

React Native 模块中的依赖注入

React Context:TypeError:render is not a function