Issue:我有一个围绕我的整个应用程序的上下文,但我需要一个额外的上下文,用于单个抽屉屏幕及其子屏幕和组件.

DataProvider是整个应用程序使用的.

我已经创建了一个仅供抽屉导航器中的‘Component’A即屏幕A及其在Stack Navigator中的子屏幕(A子屏幕)使用的上下文.

到目前为止,已经完成了哪些工作:

阅读了文档并使用两个上下文包装了整个应用程序,但考虑到只有部分抽屉导航器和屏幕实际需要AContext,我只需要包装只需要它的屏幕/组件,以防止不必要的重新呈现屏幕和最初不需要上下文的组件.

在这种情况下,有没有什么建议,或者可以忽略不计?

下面是我的App.js代码:

const DrawerNavigator = () => {
  
  return (
    <Drawer.Navigator
      initialRouteName=
      screenOptions={({ navigation }) => ({
        headerTitle: "",
      }
      )}
    >
      <Drawer.Screen
        name="A"
        component={A}
        options={{
          // freezeOnBlur: true,
        }}
      />
      <Drawer.Screen
        name="B"
        component={B}
        options={{
          freezeOnBlur: true,
        }}
      />
      <Drawer.Screen
        name="C"
        component={C}
        options={{
          freezeOnBlur: true,
        }}
      />
    </Drawer.Navigator>
  )
};

export default function App() {
  return (
    <>
      <DataProvider>
        <AProvider>
          <NavigationContainer>
            <Stack.Navigator
              screenOptions={({ navigation }) => ({
                headerTitle: "",
              })}
            >
              <Stack.Screen
                name="HOME"
                component={DrawerNavigator}
                options={{ headerShown: false }}
              />
              <Stack.Screen
                name="ASubScreen"
                component={ASubScreen}
                options={{
              />
              <Stack.Screen
                name="D"
                component={D}
                options={{ headerTitle: "" }}
              />
              <Stack.Screen
                name="E"
                component={E}
                options={{ headerTitle: "" }}
              />Ï
            </Stack.Navigator>
          </NavigationContainer>
          <ConsentModal />
        </AProvider>
      </DataProvider>
      <StatusBar style="dark" />
      <Toast />
    </>
  );
}

以下是上下文代码:

import React, { useEffect, useState } from "react";

export const AContext = React.createContext();

export const PayEProvider = ({ children }) => {
  const [currentUser, setCurrentUser] = useState(null);

  return (
    <AContext.Provider
      value={{
        currentUser,
        setCurrentUser
      }}
    >
      {children}
    </AContext.Provider>
  );
};

推荐答案

根据AContext值是什么,或者AProvider提供程序组件需要处理和更新它,这可能可以忽略不计,但从设计/实现来看,这是一个很好的编码实践,可以尽可能地限制变量的范围.换句话说,只在必要时将状态/上下文/等提升到应用程序 struct 的高度.

对于React-Navigation Screen组件,我相信你有几个基本的 Select :

  • 创建一个屏幕组件来呈现上下文提供程序和实际的屏幕组件,所有这些都在component prop上.

    const ASubScreenLayout = (props) => {
      ...
    
      return (
        <AProvider>
          ...
          <ASubScreen {...props} />
          ...
        </AProvider>
      );
    };
    
    export default function App() {
      return (
        <>
          <DataProvider>
            <NavigationContainer>
              <Stack.Navigator
                screenOptions={({ navigation }) => ({
                  headerTitle: "",
                })}
              >
                ...
                <Stack.Screen
                  name="ASubScreen"
                  component={ASubScreenLayout}
                  options={{ ... }}
                />
                ...
              </Stack.Navigator>
            </NavigationContainer>
            <ConsentModal />
          </DataProvider>
    
          <StatusBar style="dark" />
          <Toast />
        </>
      );
    }
    
  • 使用children render prop函数,它基本上是上面的解决方案.

    export default function App() {
      return (
        <>
          <DataProvider>
            <NavigationContainer>
              <Stack.Navigator
                screenOptions={({ navigation }) => ({
                  headerTitle: "",
                })}
              >
                ...
                <Stack.Screen
                  name="ASubScreen"
                  options={{ ... }}
                >
                  {(props) => (
                    <AProvider>
                      <ASubScreen {...props} />
                    </AProvider>
                  )}
                </Stack.Screen>
                ...
              </Stack.Navigator>
            </NavigationContainer>
            <ConsentModal />
          </DataProvider>
    
          <StatusBar style="dark" />
          <Toast />
        </>
      );
    }
    

Javascript相关问答推荐

序列查找器功能应用默认值而不是读取响应

根据总价格对航班优惠数组进行排序并检索前五个结果- Angular HTTP请求

从PWA中的内部存储读取文件

Cookie中未保存会话数据

调用removeEvents不起作用

我不知道为什么setwritten包装promise 不能像我预期的那样工作

PrivateRoute不是路由组件错误

为什么当我解析一个promise时,输出处于挂起状态?

当使用';字母而不是与';var#39;一起使用时,访问窗口为什么返回未定义的?

在使用位板时,如何在Java脚本中判断Connect 4板中中柱的对称性?

在Reaction中的handleSubmit按钮内,useSelector值仍然为空

在VS代码上一次设置多个变量格式

传递方法VS泛型对象VS事件特定对象

有没有一种直接的方法可以深度嵌套在一个JavaScript对象中?

是否可以将异步调用与useState(UnctionName)一起使用

如果我的列有条件,我如何呈现图标?

需要刷新以查看Mern堆栈应用程序中的更改

当达到高度限制时,如何裁剪图像?使用html和css

如何从Reaction-Redux中来自API调用的数据中筛选值

如何从嵌套的json中获取最大值