【问题标题】:How do I get my flatList to render an Array objects with nested objects as attributes from useState?如何让我的 flatList 将具有嵌套对象的 Array 对象作为 useState 的属性呈现?
【发布时间】:2019-09-26 12:05:41
【问题描述】:

我想做以下事情: 1) 从 API 检索数据 2) 将其存储在本地 Realm 实例中 3) 拉取存储在领域中的对象数组并将数据分配给数据挂钩 4) 在平面列表中显示

请注意,该对象包含 2 个对象作为属性。

这是我的 JS 代码:

 const [data, setData] = useState([]);

 const writeData = response => { //data contains the response 
Realm.open({
  schema: [ExpenseSchema, UserSchema, AmountSchema],inMemory: true
}).then(realm => {
  realm.write(() => {
    response.map(expense => {
        realm.create("expense", expense);
       setData(data => [...data, expense]); //1) works if I do this
    });
   const objects = realm.objects('expense');
   const values =Object.values(objects);
    //setData([values]); //2) this one doesn't work, nor any of the following attempts
//setData(data => [...data, values]);
  //  setData([values]);
    //setData(objects);
 //setData([objects] 
  });
});
};

第二个 setData 调用是我想要工作的调用,但是在进行 Realm 查询时对象数组的格式并没有被 flatlist 识别为数据源,并在尝试时抛出以下错误渲染:

TypeError: undefined is undefined is not an object (evaluating 'item.amount.currency')

以下是适用于 flatList 数据源的格式的响应,如下所示:

Array [
  Object {
    "amount": Object {
      "currency": "EUR",
      "value": "1854.99",
    },
    "category": "",
    "comment": "",
    "date": "2018-09-10T02:11:29.184Z",
    "id": "5b996064dfd5b783915112f5",
    "index": 0,
    "merchant": "McD",
    "receipts": Array [],
    "user": Object {
      "email": "aaa@ggg.com",
      "first": "Ombly",
      "last": "Lee",
    },
  },
  Object {
    "amount": Object {
      "currency": "GBP",
      "value": "3222.88",
    },
    "category": "",
    "comment": "",
    "date": "2018-08-13T07:11:01.680Z",
    "id": "5b99606474ab17b7820b3922",
    "index": 1,
    "merchant": "BK",
    "receipts": Array [],
    "user": Object {
      "email": "gler@spoto.com",
      "first": "Gler",
      "last": "Spot",
    },
  }, etc....

这是我在存储后从本地 RealmDB 请求它时的样子:

Array [
  Object {
    "0": Object {  <---- seems this extra line is causing the issues. 
      "amount": Object {
        "currency": "EUR",
        "value": "1854.99",
      },
      "date": 2018-09-10T02:11:29.184Z,
      "id": "5b996064dfd5b783915112f5",
      "merchant": "McD",
      "receipt": null,
      "user": Object {
        "email": "aaa@ggg.com",
        "first": "Ombly",
        "last": "Lee",
      },
    },
    "1": Object {
      "amount": Object {
        "currency": "GBP",
        "value": "3222.88",
      },
      "date": 2018-08-13T07:11:01.680Z,
      "id": "5b99606474ab17b7820b3922",
      "merchant": "BK",
      "receipt": null,
      "user": Object {
        "email": "gler@spoto.com",
        "first": "Gler",
        "last": "Spot",
      },
    }, etc....

基本上,我需要以一种可以用作平面列表数据源的方式从 Realm 检索数据。

提前非常感谢您。

编辑 以下是 API 响应的外观:

{
"expenses": [
    {
        "id": "5b996064dfd5b783915112f5",
        "amount": {
            "value": "1854.99",
            "currency": "EUR"
        },
        "date": "2018-09-10T02:11:29.184Z",
        "merchant": "McD",
        "receipts": [],
        "comment": "",
        "category": "",
        "user": {
            "first": "Ombly",
            "last": "Lee",
            "email": "aaa@ggg.com"
        },
        "index": 0
    },
    {
        "id": "5b99606474ab17b7820b3922",
        "amount": {
            "value": "3222.88",
            "currency": "GBP"
        },
        "date": "2018-08-13T07:11:01.680Z",
        "merchant": "BK",
        "receipts": [],
        "comment": "",
        "category": "",
        "user": {
            "first": "Gler",
            "last": "Spot",
            "email": "gler@spoto.com"
        },
        "index": 1
    }, etc....
 ]

我的平面列表

 return (
<View>
  <ScrollView>
    <FlatList
      data={data}
      showsVerticalScrollIndicator={false}
      renderItem={({ item }) => (
        <ExpenseCard
          date={item.date}
          category={item.category}
          amount={item.amount.currency + item.amount.value}
          merchant={item.merchant}
          user={
            item.user.first + " " + item.user.last + "\n" + item.user.email
          }
        />
      )}
      keyExtractor={item => item.id}
    />
  </ScrollView>
</View>
  );
}

【问题讨论】:

  • 对于这个额外的{} 括号,您必须先在服务器上过滤或设置数据,然后才能在此 API 中发送数据。
  • @NajamUsSaqib 你能举个过滤器的例子吗?另外,我没有能力修改服务器。
  • 请您的后端开发人员修改它。并从您的console.log()分享实际的dala
  • 这些数据结构sn-ps来自console.log。此外,就响应而言,API 响应结构是完全标准的 - 我已将其添加到底部以提供示例。
  • 请添加您的Flatlist

标签: reactjs react-native realm react-hooks


【解决方案1】:

试试这个:

<FlatList 
     data={this.state.YourApiData.expenses} //You need to access expenses key.
     showsVerticalScrollIndicator={false}
     renderItem={({item,index}) =>
           <View key={index}>
              <View >
                <Text>ID: {item.id}</Text>
                <Text>Amount and Currency: {item.amount.value} - {item.amount.currency}</Text>
                <Text>Date: {item.date}</Text>
               </View>
            </View>
    />

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 2022-06-30
    • 2018-04-16
    • 1970-01-01
    相关资源
    最近更新 更多