【问题标题】:How to avoid overrated item after set state?设置状态后如何避免高估项目?
【发布时间】:2019-10-19 22:26:21
【问题描述】:

我有一个从 firebase 获取数据的功能, 我想在获取后将数据设置为状态, 所以我只是声明一个数组并将所有数据推送给他们,然后我用我的状态设置这个数组

但是当我记录这些状态或渲染它时,我遇到了 RN 0.61.2 的一些问题,它在 RN 0.58.0 中完美运行我不知道为什么/如何!!!

当我记录状态时,我只看到高估的数据“我在 DB 中只有 4 个项目”,但记录器向我打印了十多个, 当我只是渲染这些数据“状态”时,他们会告诉我

NSNumber 类型的 JSON 值“5”无法转换为 Nsstring

那我该如何避免呢?

这是我的代码片段

  this.state = {
      RecommendedProviders: [],
}

componentDidMount() {
      this._recommendedProvider();
}

_recommendedProvider = () => {
    let Recommended = [];
    firebase
      .database()
      .ref('recommendationProviders')
      .once('value')
      .then(snapshot => {
        snapshot.forEach(childSnapshot => {
          Recommended.push({
            gKey: childSnapshot.key,
            id: childSnapshot.val().id,
            username: childSnapshot.val().username,
            service: childSnapshot.val().service,
            aboutMe: childSnapshot.val().aboutMe,
            coordinates: {
              longitude: childSnapshot.val().coordinates.longitude,
              latitude: childSnapshot.val().coordinates.latitude,
            },
            city: childSnapshot.val().city,
            mobileNumber: childSnapshot.val().mobileNumber,
            token: childSnapshot.val().token._55,
          });
        });
        console.log('Recommended', Recommended); //when i log this i can just see array of 4 item
        this.setState({RecommendedProviders: Recommended});
      });
    //   .then(() => this.setState({RecommendedProviders: Recommended}));
  };

用户界面

<FlatList
     horizontal
     data={this.state.RecommendedProviders}
     renderItem={({item}) => {
        console.log('@item/', item); /when i log this i can just see more than 4 item maybe 20 :D
     }}
    keyExtractor={(item, index) => index.toString()}
/>

【问题讨论】:

    标签: javascript reactjs firebase-realtime-database


    【解决方案1】:

    好的,首先关于那个记录器:

    NSNumber 类型的 JSON 值“5”无法转换为 Nsstring

    这个错误是因为keyExtractor 需要一个字符串作为返回值。所以,为了避免它,你可以试试这个:

    <FlatList
        keyExtractor={(item, index) => 'item' + index}
    />
    

    最后,关于你的日志:

    我用你的要点创建了一个博览会的小吃,它的 SDK 基于 react-native 0.59,你可以检查它here。我还尝试使用下面的代码模拟您的异步获取,并且效果很好。

    new Promise((resolve, reject) => {
      setTimeout(resolve, 2000, [
        { id: 1, username: 'test', service: 'example' },
        { id: 2, username: 'test', service: 'example' },
        { id: 3, username: 'test', service: 'example' },
        { id: 4, username: 'test', service: 'example' },
      ]);
    }).then(res => {
      const providers = [];
    
      res.forEach(item => providers.push(item));
    
      this.setState({ RecommendedProviders: providers }, () =>
        console.log('object', this.state.RecommendedProviders)
      );
    });
    

    如果不会对您的应用程序产生负面影响,我认为这可能是降级您的 RN 版本的解决方案。

    希望对你有所帮助。

    【讨论】:

    • 嘿@LuizMariz,感谢您的回答,但遗憾的是 keyExtractor 和 renderItem 都不起作用,这是按照您的回答后的日志,日志项 i.imgur.com/wv6yd2X.png,,这是我声明的推荐数组i.imgur.com/8VVYJV9.png
    • @OliverD 你可以为你的组件和 package.json 创建一个 Github gist。还有错误的打印。
    • 谢谢,我很高兴你想帮忙,但遗憾的是在这个版本中没有工作我只做了两件事,但你的静态数据和数据来自 firebase 但仍然存在问题,并且这是一个旧项目,只需将其升级并使用 RN v 0.60+ 将所有第三方库处理为 Proportional :( 并且花费太多时间,所以你可以告诉我什么建议 :(
    • OH MY GOD,与 F* 风格相关的问题,我只是传递给 shadowOffset 一个数字,他们接受我在这里看到的对象 facebook.github.io/react-native/docs/0.60/… 和当我传递类似 {width:5, height:10} 的东西时NSNumber 类型的错误 JSON 值“5”无法转换为 Nsstring Gone!
    猜你喜欢
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 2010-09-07
    • 2021-03-05
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多