gpt4 book ai didi

reactjs - React-navigation 用 React Context 包裹根 AppContainer

转载 作者:行者123 更新时间:2023-12-03 14:31:21 24 4
gpt4 key购买 nike

我正在寻找使用 react 导航来管理我的 react native 应用程序中的全局状态的方法。我尝试实现基本的 React Context,我想将其包装在 React-navigation 的 createAppContainer() 方法中,但它不起作用。

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

我的 index.js 文件如下所示:

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>
);
}
}

现在,当我从 CitiesScreen 组件访问上下文时,我目前能够获取上下文的 isOnline 状态值,但每当我切换时我的互联网连接(在 Android 模拟器上)打开/关闭,上下文状态发生更改,但组件未重新渲染,并且我的 shouldComponentUpdate() 方法未触发。有什么帮助可以让这项工作成功吗?

最佳答案

就我而言,我将 React 从 16.8 降级到 16.5.0,React 导航版本为 3。我仍在调查,但这只是目前的临时解决方案。

关于reactjs - React-navigation 用 React Context 包裹根 AppContainer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53670243/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com