React native 反应寿命循环和异步存储

React native 反应寿命循环和异步存储,react-native,react-lifecycle,React Native,React Lifecycle,我正在创建一个应用程序,它通过异步存储传递一些重要信息,但现在在另一个屏幕上更新时出现问题。。。。让我们看看: 在屏幕1上: 从componentDidMount上的异步存储加载数据 componentDidMount() { AsyncStorage.getItem("userChats").then((value) => { this.setState({userChats: JSON.parse(value)});

我正在创建一个应用程序,它通过异步存储传递一些重要信息,但现在在另一个屏幕上更新时出现问题。。。。让我们看看: 在屏幕1上:

从componentDidMount上的异步存储加载数据

componentDidMount() {
        AsyncStorage.getItem("userChats").then((value) => {
           this.setState({userChats: JSON.parse(value)});
        });     
}
然后在屏幕2上,我修改用户聊天

我希望当再次回到屏幕1时,屏幕2上所做的更改会反映在屏幕1上,但不会出现,因为componentDidMount不会再次触发

正确的方法是什么


感谢您,componentDidMount是一种生命周期方法。从Screen1导航到Screen2不会卸载Screen1。因此,当您从屏幕2返回到屏幕1时,屏幕1没有安装,因为它没有卸载。因此,
componentDidMount
不被调用

正确的做法是什么?

您应该使用
上下文API
。从
AsyncStorage
加载时,也将该值设置为Context。更新值时,将更改写入异步存储和上下文

备注:
异步存储
可能不需要。这取决于你的要求。很可能,只有使用
上下文API
才能实现这一点

请检查以下零食。这是用钩子做的。可以使用类组件执行相同的操作

更新:

如果要处理的数据太大,不建议使用上下文,因为它将所有数据保存在设备RAM中,并且消耗太多RAM可能会导致应用程序崩溃

在不使用上下文的情况下执行此操作:

(1) 定义从
异步存储
检索数据的函数

loadData() {
    AsyncStorage.getItem("userChats").then((value) => {
        this.setState({userChats: JSON.parse(value)});
    });     
}
(2) 在
componentDidMount
中调用它

componentDidMount() {
    this.loadData()
}
(3) 导航到屏幕2时,将回调函数作为道具传递给调用
loadData
函数

this.props.navigation.navigate('Screen2', {
    onGoBack: () => this.loadData(),
});
(4) 然后在屏幕2中,在
goBack
之前,您可以执行以下操作:

await AsyncStorage.setItem('userChats', updatedData);
this.props.navigation.state.params.onGoBack();
this.props.navigation.goBack();
然后,在屏幕2中调用
loadData
函数


PS:由于使用
state
存储从
AsyncStorage
检索到的数据,因此也可以直接将它们加载到上下文中并使用。但是,请记住,使用太多内存可能会导致应用程序崩溃。

谢谢!我来看看!我可以在上下文中存储任何类型的变量吗?一个相当大的JSON(所有的用户聊天,比如电报)?@MarcoMartin是的,你可以存储任何类型的变量。但是,在这种情况下,大小很重要。当您在上下文中存储如此大的数据时,这些数据将保存在设备RAM中。因此,占用太多资源可能会导致应用程序崩溃。