javascript - React Native 使用钩子从 API 加载数据
问题描述
我是 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>
在我的代码中的任何地方也无法在控制台中返回时,它会起作用。我收到错误:
未定义不是对象(评估'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];
};
解决方案
顾名思义,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 自动从索引中键入它们。
推荐阅读
- mysql - 求和时间值 MySQL
- android - EndlessRecyclerViewScrollListener 不显示 recyclerview 上的所有项目
- javascript - free-jqgrid 在子网格中填充下拉菜单
- javascript - 将google分析跟踪代码限制为一个js
- oauth - 应该如何为使用 OAuth 的 API 生态系统定义范围?
- javascript - 为什么在 foreach 函数中未定义变量?
- javascript - 添加自定义工具栏按钮后react-quill缺少样式
- parallel-processing - Kubernetes 根据任务的 Pod 数量
- javascript - 删除多余的 CSS 动画
- android - 在 Java 的 Android Studio 中使用“CardView”在“RecyclerView”中显示 Json 响应