使用挂钩从 API 响应本机加载数据
React Native load data from API using hooks
我是 ReactNative 的新手,我正在尝试从这里获取一些数据 https://www.dystans.org/route.json?stops=Hamburg|Berlin
当我尝试 console.log 结果时 return 完全 API 响应。我不知道为什么在第一个 results.distance 工作和 return 距离,但是当我试图在 FlatList 中执行它时,return 什么也没有。有时当我只想 return 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];
};
顾名思义,FlatList
是用来渲染列表的。您的 API 端点 returns 是一个 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 自动从索引中键入它们。
我是 ReactNative 的新手,我正在尝试从这里获取一些数据 https://www.dystans.org/route.json?stops=Hamburg|Berlin
当我尝试 console.log 结果时 return 完全 API 响应。我不知道为什么在第一个 results.distance 工作和 return 距离,但是当我试图在 FlatList 中执行它时,return 什么也没有。有时当我只想 return 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];
};
顾名思义,FlatList
是用来渲染列表的。您的 API 端点 returns 是一个 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 自动从索引中键入它们。