本文详解如何在 react native 中安全访问远程 api(如 randomuser.me)返回的嵌套 json 数据,修正常见路径错误、空值崩溃问题,并提供健壮的数据绑定与列表渲染方案。
本文详解如何在 react native 中安全访问远程 api(如 randomuser.me)返回的嵌套 json 数据,修正常见路径错误、空值崩溃问题,并提供健壮的数据绑定与列表渲染方案。
在 React Native 中引用 API 数据时,关键在于准确理解响应结构与严格匹配数据访问路径。你遇到的问题主要源于两个核心错误:
以下是修正后的完整、健壮实现(含错误处理与 TypeScript 友好提示):
import { Text, View, Button, FlatList, ActivityIndicator } from 'react-native';import { useEffect, useState } from 'react';const API = 'https://randomuser.me/api/'; // ✅ 正确 API 地址const User = ({ fname, lname, country }) => ( <View style={{ padding: 16, borderBottomWidth: 1, borderBottomColor: '#eee' }}> <Text style={{ fontSize: 16, fontWeight: '600' }}>Name: {fname} {lname}</Text> <Text style={{ color: '#666', marginTop: 4 }}>Country: {country}</Text> </View>);const renderUser = ({ item }) => ( <User fname={item.name?.first || 'N/A'} // ✅ 使用可选链 + 默认值防崩溃 lname={item.name?.last || 'N/A'} country={item.location?.country || 'N/A'} />);export default function App() { const [users, setUsers] = useState({ results: [] }); const [loading, setLoading] = useState(false); const fetchUsers = () => { setLoading(true); fetch(API) .then((response) => { if (!response.ok) throw new Error(`HTTP ${response.status}`); return response.json(); }) .then((json) => { setUsers(json); // json 结构:{ results: [...users] } }) .catch((err) => { console.error('Failed to fetch users:', err); // 可在此添加 Toast 提示或状态反馈 }) .finally(() => setLoading(false)); }; // 首次加载 useEffect(() => { fetchUsers(); }, []); if (loading) { return ( <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}> <ActivityIndicator size="large" /> </View> ); } return ( <View style={{ flex: 1, padding: 16 }}> <Button title="Add a user" onPress={fetchUsers} /> {/* ✅ data 指向 users.results,确保 FlatList 渲染的是用户数组 */} <FlatList data={users.results} keyExtractor={(item) => item.login.uuid} // 推荐使用唯一 ID renderItem={renderUser} ListEmptyComponent={<Text>No users found.</Text>} /> </View> );}
关键注意事项总结:
遵循以上实践,即可安全、清晰地将 API 数据注入组件,实现稳定可靠的动态渲染。