【问题标题】:React Native load data from API using hooksReact Native 使用钩子从 API 加载数据
【发布时间】:2019-11-16 23:17:15
【问题描述】:

我是 ReactNative 的新手,我正在尝试从这里获取一些数据 https://www.dystans.org/route.json?stops=Hamburg|Berlin

当我尝试使用 console.log 结果时,它会返回完整的 API 响应。我不知道为什么在第一个 results.distance 中有效并返回距离,但是当我尝试在 FlatList 中执行此操作时,没有返回任何内容。有时,当我只想返回 item.distance 但不能像<Text>{item.stops[0].nearByCities[0].city}</Text> 这样的东西在我的代码中也没有在控制台中的任何地方时它会起作用。我收到错误: undefined 不是对象(评估 'results.stops[0]')

imports...

const NewOrContinueScreen = ({ navigation }) => {
  const [searchApi, results, errorMessage] = useDystans();

  console.log(results.distance);

  return (
    <SafeAreaView forceInset={{ top: "always" }}>
      <Text h3 style={styles.text}>
        Distance: {results.distance}
      </Text>
      <Spacer />
      <FlatList
        extraData={true}
        data={results}
        renderItem={({ item }) => (
          <Text>{item.distance}</Text>
          // <Text>{item.stops[0].nearByCities[0].city}</Text>
        )}
        keyExtractor={item => item.distance}
      />
      <Spacer />
    </SafeAreaView>
  );
};


const styles = StyleSheet.create({});

export default NewOrContinueScreen;

这是我的钩子代码:

import { useEffect, useState } from "react";
import dystans from "../api/dystans";

export default () => {
  const [results, setResults] = useState([]);
  const [errorMessage, setErrorMessage] = useState("");

  const searchApi = async () => {
    try {
      const response = await dystans.get("route.json?stops=Hamburg|Berlin", {});
      setResults(response.data);
    } catch (err) {
      setErrorMessage("Something went wrong with useDystans");
    }
  };

  useEffect(() => {
    searchApi();
  }, []);

  return [searchApi, results, errorMessage];
};

【问题讨论】:

    标签: javascript reactjs api react-native react-native-flatlist


    【解决方案1】:

    顾名思义,FlatList 旨在呈现一个列表。您的 API 端点返回一个 JSON 对象,而不是一个数组,因此 FlatList 没有什么可以迭代的。如果要显示列表中的所有停靠点,请尝试直接传入停靠点列表。

    <FlatList
        data={results.stops}
        renderItem={({ item }) => (<Text>{item.nearByCities[0].city}</Text>)}
    />
    

    一些旁注: (1) extraData 参数用于指示当data 以外的变量发生变化时列表是否应重新呈现。我认为你根本不需要它,但即使你这样做了,传入true 也不会产生任何影响,你需要将变量的名称传递给它。 (2) keyExtractor 参数用于从它们内部的字段中键入呈现的项目。 API 中的停止对象没有名为 distance 的成员,因此您在那里拥有的内容将不起作用。通过快速查看 API 响应,我没有看到任何唯一的停靠点 ID,因此您最好让 React 自动从索引中键入它们。

    【讨论】:

    • 感谢您的澄清,但当我尝试您的方法时,我仍然得到 undefined is not an object (evalating 'item.nearByCities[0]') 我不知道它可能需要转换吗?
    • FlatList get 'undefined' 可能是因为开始的结果在下载数据之前是未定义的?但是改变结果后它应该重新渲染并且不会发生任何错误,对吗?即使在开始时存在未定义?
    • 理论上是的,但是当您的程序遇到该错误并且代码停止运行时,它可能会崩溃。尝试将初始状态更改为const [results, setResults] = useState({ stops: [] });
    • 还是同样的错误。我不明白console.log(results.distance) 是如何工作的,但console.log(results.stops[0].city) 却不行。根据文档dystans.org/api.xhtml.
    • 您需要等到 从 API 加载数据后才能尝试访问任何内容。如果再看一遍,您可能会看到 console.log(results.distance) 实际上运行了两次,一次是在第一次渲染时,另一次是在效果完成时。第一次它应该记录undefined,然后下次工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 2021-09-26
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    相关资源
    最近更新 更多