代码之家  ›  专栏  ›  技术社区  ›  sbqq

react导航使用react上下文包装根AppContainer

  •  0
  • sbqq  · 技术社区  · 7 年前

    createAppContainer() 方法,但它不起作用。

    最后,我从中包装了一个应用程序容器 index.js 文件使用上下文的HOC,但当上下文的状态更改时,react导航似乎在重新呈现嵌套组件方面存在问题。我可以从嵌套组件访问上下文,但当上下文状态更改时,它们不会被呈现。

    我的

    import { AppRegistry } from "react-native";
    import App from "./src/App";
    import { withAppContextProvider } from "./src/AppContext";
    import { name as appName } from "./app.json";
    
    AppRegistry.registerComponent(appName, () => withAppContextProvider(App));
    

    我的上下文类如下所示:

    // for new react static context API
    export const AppContext = createContext({});
    
    // create the consumer as higher order component
    export const withAppContext = ChildComponent => props => (
      <AppContext.Consumer>
        {context => <ChildComponent {...props} global={context} />}
      </AppContext.Consumer>
    );
    
    // create the Provider as higher order component (only for root Component of the application)
    export const withAppContextProvider = ChildComponent => props => (
      <AppContextProvider>
        <ChildComponent {...props} />
      </AppContextProvider>
    );
    
    export class AppContextProvider extends Component {
      state = {
        isOnline: true
      };
    
      handleConnectivityChange = isOnline => {
        this.setState({ isOnline });
      };
    
      componentDidMount = async () => {
        NetInfo.isConnected.addEventListener(
          "connectionChange",
          this.handleConnectivityChange
        );
      };
    
      componentWillUnmount() {
        NetInfo.isConnected.removeEventListener(
          "connectionChange",
          this.handleConnectivityChange
        );
      }
    
      render() {
        return (
          <AppContext.Provider
            value={{
              ...this.state
            }}
          >
            {this.props.children}
          </AppContext.Provider>
        );
      }
    }
    

    我的 App.js 文件看起来像:

    const HomeStack = createStackNavigator(
      {
        Home: HomeScreen,
        Cities: CitiesScreen
      },
      getStackConfig({ initialRouteName: "Home" })
    );
    
    const SettingsStack = createStackNavigator(
      {
        Settings: SettingsScreen
      },
      getStackConfig({ initialRouteName: "Settings" })
    );
    
    export default createAppContainer(
      createBottomTabNavigator(
        {
          Home: HomeStack,
          Settings: SettingsStack
        }
      )
    );
    

    CitiesScreen

    import { AppContext } from "../AppContext";
    
    class CitiesScreen extends Component {
      static contextType = AppContext;
    
      render() {
        return (
          <View style={styles.container}>
            <Text>This value should change on isOnline update: {this.context.isOnline}</Text>
          </View>
        );
      }
    }
    

    现在,当我访问上下文时,例如从 城市屏幕 组件,我当前可以获取 isOnline 上下文状态,但每当我打开/关闭internet连接(在android emulator上)时,上下文状态都会更改,但组件不会重新呈现,我的 shouldComponentUpdate() 方法不会被触发。有什么帮助吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Thịnh Phạm    7 年前

    在我的例子中,我将React从16.8降级到16.5.0,React导航版本是3。 我还在调查,但这只是暂时的解决办法。