【问题标题】:Is it possible to access functional context from class component in react-native?是否可以从 react-native 中的类组件访问功能上下文?
【发布时间】:2020-09-25 16:04:10
【问题描述】:

我目前正在使用 react-native 项目 v0.63.2 并使用 @react-navigation-5。初始屏幕、登录屏幕和选项卡屏幕的导航基于上下文。

appContext.js

import React from 'react';
const AppContext = React.createContext({IsLoading: true, IsLoggedIn: false});
export default AppContext;

navigationContainer.js

import AppContext from './appContext';
const StackApp = createStackNavigator();
export const StackNavigator = () => {
  const [appState, setAppState] = React.useState({});
  const state = { appState, setAppState };
  React.useEffect(() => {
    setAppState({ IsLoading: true, IsLoggedIn: false });
  }, []);

  return (
    <AppContext.Provider value={state}>
      {appState.IsLoading ? (
        <SplashScreen />
      )
        : (
          <NavigationContainer>
            <StackApp.Navigator>
              {
                appState.IsLoggedIn
                  ?
                  <>
                    <StackApp.Screen name='BottomTabScreen' component={BottomTabScreen} options={{ headerShown: false }} />
                  </>
                  :
                  <StackApp.Screen name='LoginScreen' component={NavigatorLogin} options={{ headerShown: false }} />
              }
            </StackApp.Navigator>
          </NavigationContainer>
        )}
    </AppContext.Provider>
  )
}

我用一个类组件重新创建了新的登录页面。它可以作为功能组件加载所有以前的方式。但我无法修改/更新IsLoggedIn: true 的上下文。

我尝试过的:- initLogin.js

import AppContext from '../navigator/appContext';
const AppState = ({ newContext }) => {
  const { setAppState } = React.useContext(AppContext);
  console.log('setAppState:=> ' + JSON.stringify(setAppState));
  console.log('newContext:=> ' + JSON.stringify(newContext));
  setAppState(newContext);
}
export class initSignIn extends Component {
   onPressLogin = () => {
      AppState({ IsLoggedIn: true });
   }
}

这将引发错误挂钩规则

无效的挂钩调用。 Hooks 只能在函数组件内部调用

我也尝试过使用静态上下文。没有错误,但未定义的值表明键 IsLoggedIn 不存在。

我的一些参考:

  1. How to use React Context inside function of Class component
  2. SO Answer

我添加了零食最小脚本。由于我使用的 UI Kitten 主题,可能会出现错误。我对零食不熟悉 Minimal Script

【问题讨论】:

  • 有没有零食可以让我们检查一下?
  • 以前不要吃零食。不过明天我会用snack添加一些极简的脚本。
  • 抛开导航,你只是想从一个类组件中更新上下文,对吧?也许我今天晚些时候会创建一个:)
  • 正确。我只想更新上下文,以便navigationContainer.js 可以从登录导航到底部选项卡,并在注销时返回登录
  • 请检查我的答案:)

标签: javascript reactjs react-native


【解决方案1】:

这将是一个使用上下文和类组件的工作示例。 请记住,当您从一个类访问它时,您只能使用一个上下文。

在这里,我创建了一个按钮组件,它将更新上下文。 如您所见,我在上下文中有一个函数,它将更新我们从 useState 传递 setAppState 函数的上下文。

  const AppContext = React.createContext({
      appState: { IsLoading: true, IsLoggedIn: false },
      setAppState: () => {},
    });
    
    export default function App() {
      const [appState, setAppState] = React.useState({
        IsLoading: false,
        IsLoggedIn: false,
      });
    
      return (
        <AppContext.Provider value={{ appState, setAppState }}>
          <View style={styles.container}>
            <Text style={styles.paragraph}>{JSON.stringify(appState)}</Text>
            <Button />
          </View>
        </AppContext.Provider>
      );
    }
    
    class Button extends React.PureComponent {
      render() {
        return (
          <TouchableOpacity
            onPress={() =>
              this.context.setAppState({
                IsLoading: !this.context.appState.IsLoading,
                IsLoggedIn: true,
              })
            }>
            <Text>Update</Text>
          </TouchableOpacity>
        );
      }
    }
    Button.contextType = AppContext;

小吃的网址 https://snack.expo.io/@guruparan/contextwithclass

【讨论】:

  • 我在按钮点击功能上使用this.context.setAppState({IsLoading: !this.context.appState.IsLoading,IsLoggedIn: true,})时得到[TypeError: undefined is not an object (evaluating '_this.context.appState.IsLoading')]
  • 你是想吃零食还是其他地方?
  • 在我可以运行您的零食后,我尝试在initSignIn.js 文件中申请。在登录屏幕上,我还在类声明之后声明Button.contextType = AppContext,我从我的问题中从文件库导入AppContext。它与 PureComponent 有关系吗?我只记得我在 vscode 上使用 rnce 快捷方式将类组件创建为 Component,而不是 PureComponent。其他的,我按照你的方式。
  • 纯组件不会有问题,能不能根据你现在的代码做个零食,检查起来会更方便
  • https://snack.expo.io/@luiey/ashamed-chips 目前是我尝试申请的。我提到的错误在设备上。在零食上,零食导入ui小猫有错误(不知道如何解决零食)。忽略错误。流,App --&gt; src/navigation/navigationContainer --&gt; src/init/initLogin
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2020-05-30
  • 2021-01-30
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
相关资源
最近更新 更多