【问题标题】:Run An Function Only Once Per App Installation In React Native ( Class Component )在 React Native(类组件)中,每个应用程序安装只运行一次函数
【发布时间】:2020-11-08 11:52:10
【问题描述】:

所以我有一个问题,我只想在应用程序中只运行一次函数

我只需要将一个空数组初始化一次到异步存储。稍后我将使用 ComponentWillMount() 在数组中执行读写函数...

问题是我如何首先初始化一个空数组,并且我不希望它以后是空的(比如当应用程序关闭和打开时)

每次屏幕渲染时我都会读取存储在异步存储中的数据...但是当第一次屏幕渲染时安装应用程序...我没有调用以下函数

setObjectValue = async () => {
  try {
    const jsonValue = JSON.stringify(this.state.data)
    await AsyncStorage.setItem('Emails', jsonValue)
    this.setState({ value : this.state.data.length })
  } catch(e) {
    // save error
  }
  console.log('Done.')
}

但如果我在读取之前调用它...它会擦除现有数据并将其设置为一个空数组(因为我有一个具有数据的构造函数:[])所以当我读取数据时我得到一个空数组数组

您可以在此处查看完整代码 - https://snack.expo.io/@belgin/budget-tracker

感谢任何帮助的人:)

【问题讨论】:

  • 您已经在读取数组并使用 getMyObject 设置它这里有什么问题?
  • 是的,但应用程序第一次运行时它不会(因为我还没有上传任何值)当应用程序第一次渲染屏幕时......它会尝试读取对象尚未在异步存储中初始化(未调用 setObjectValue)
  • 是的,但是如果电子邮件在异步存储中不可用,您可以设置一个空数组吗?
  • 是的,但是当我每次屏幕渲染时,数组的值都会变为空
  • 如果您运行此snack.expo.io/@belgin/budget-tracker ...您可以注意到,当使用 UNSAFE_componentWillMount() 时,新的电子邮件按钮没有给出任何响应...但是当我删除这组代码时.. . 它有效

标签: react-native react-native-android react-navigation react-native-ios react-native-flatlist


【解决方案1】:

您的应用需要进行一些更改。

首先将 UNSAFE_componentWillMount 替换为 componentDidMount

并像下面这样更改您的 getMyObject ,这将确保它仅在值存在时才更新

 getMyObject = async () => {
    try {
      const jsonValue = await AsyncStorage.getItem('Emails');
      if (jsonValue) {
        const data = JSON.parse(jsonValue);
        this.setState({ data: data, value: data.length });
      }
    } catch (e) {
      // read error
    }
  };

同时从您更新 asyncStorage 的函数中删除 setState 调用,这将显示无效数据,因为您的调用已完成而状态未更新。

您也可以在状态更新后更新 asyncStorage,如下所示

this.setState({ data: this.state.data },()=>this.setObjectValue());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 2013-09-05
    • 2020-08-03
    相关资源
    最近更新 更多