【问题标题】:Array of objects inside Async Storage - React Native异步存储中的对象数组 - React Native
【发布时间】:2018-04-04 16:08:12
【问题描述】:

我正在尝试将一组对象保存在异步存储中,这些对象将呈现为列表。用户将能够向数组中添加新项目并更新和删除每个项目。

目前,在保存数据时,我发现我的对象数组只包含 1 个对象,并且每次添加新对象时,都会覆盖以前的对象。

也许这与用于创建每个项目的密钥有关,但我不确定在使用 Async 时如何自动生成唯一密钥?

随后,当将 async 设置为 state 时,我在渲染列表时只有 1 项要循环。

List.js

constructor(props) {
    super(props);
    this.state = {
      data: []
    };
  }

onLoad = async () => {
  try {
    const data = [];
    const item = await AsyncStorage.getItem('@foods');
    const d = JSON.parse(item);
    const { title } = d;
    data.push({ title });
  this.setState({ data });
console.log(this.state);
  } catch (error) {
    alert('Error', 'There was an error while loading the data');
  }
}

  render() {
    return (
        <View>
        <FlatList
          data={this.state.data}
          renderItem={({ item }) => <Text>{item.title}</Text>}
        />
        </View>
       );
     }

AddItem.js 标题(处于状态)由用户输入设置

constructor(props) {
    super(props);
    this.state = {
      title: ''
    };
  }

saveData = () => {
  const { title } = this.state;

  const data = {
    title
  };

  AsyncStorage.setItem('@foods', JSON.stringify(data));
  alert('save success');
}

我的对象数组应该如下所示:

  const list = [
  {
    title,
    description,
    servingSize,
    servingNum
  },
  {
    title,
    description,
    servingSize,
    servingNum
  }
.....etc
]

【问题讨论】:

  • 您尝试过 Promise.all 吗?这是最简单的方法
  • @RaajNadar 我会在哪里包含它?
  • 等等,我给你举个例子!
  • 那么你知道数组中插入了多少项或设置以及获取两者都是动态的吗??
  • @RaajNadar 是的,两者都是动态的,用户应该能够创建、更新和删除任意数量的项目(出于性能原因,我想在未来对其进行限制)

标签: reactjs react-native


【解决方案1】:

你尝试的东西完全错了试试这个方法!

从 AsyncStorage 获取多个数据

async loadData() {
   try {
       await Promise.all([AsyncStorage.getItem('data1'), AsyncStorage.getItem('data2')]).then((data) => {
          if ( data[0] != null && data[1] != null ) {
              someVar1 = data[0]; // First data from 1st promise
              someVar2 = data[1]; // Second data from 2nd promise
          }
       });
    } catch (error) {
       console.log(error);
    }
}

编辑:刚刚看到您也想在 AsynStorage 中设置数据

loadData() {
   AsyncStorage.multiSet([['data1', someVar.toString()], ['data2', someVar2.toString()]], (data) => {
       if(data) {
           alert("Something went wrong!");
       } else {
           // do something if the set was successful

        }
   });
}

【讨论】:

  • 如何在不知道需要返回多少项的情况下循环遍历数组?
  • 粘贴您的 JSON 或数组结构!
  • 我已更新以显示对象数组的外观
猜你喜欢
  • 1970-01-01
  • 2021-03-18
  • 1970-01-01
  • 2022-01-17
  • 2019-10-25
  • 1970-01-01
  • 2021-05-09
  • 2018-09-23
  • 1970-01-01
相关资源
最近更新 更多