reactjs - TypeError:请求的键值不是对象。React-native Listview
问题描述
当我使用 <Listview />
. Axios
用于api请求。有两个组件:
<JsonHome />
<ListItem />
ListItem
是 的子组件JsonHome
。
杰森家
constructor(props) {
super(props);
this.state = {
isLoading: true
}
this.goToDetail = this.goToDetail.bind(this);
this.dataSource = new ListView.DataSource({ rowHasChanged: (r1, r2) => r1 !== r2 });
}
componentDidMount() {
axios.get('https://jsonplaceholder.typicode.com/posts')
.then(res => {
this.setState({
isLoading: false,
data: res.data,
});
})
}
goToDetail(id) {
this.props.navigation.navigate('Detail', {
id: id
});
}
render() {
return (
<View style={styles.itemList}>
<ScrollView>
<ListView
dataSource={this.dataSource.cloneWithRows(this.state.data)}
renderRow={(item) => <ListItem item={item} onTouch={this.goToDetail} />}
/>
</ScrollView>
</View>
)
}
项目清单
const ListItem = (props) => {
const item = props.item;
return (
<View style={styles.item} >
<TouchableOpacity onPress={() => props.onTouch(item.id)}>
<Text style={styles.itemText}>{`${item.id} ${item.title}`}</Text>
</TouchableOpacity>
</View>
)
}
api响应:
[
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
},
{
"userId": 1,
"id": 2,
"title": "qui est esse",
"body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
}
]
解决方案
你使用的是什么版本的 react-native?根据文档 ListView
,不推荐使用 aFlatList
来提高性能。我怀疑 ListView 无法提取适合密钥使用的默认值。FlatList 具有大多数可用的相同道具,以及keyExtractor
道具功能,如果您的数据不适合默认键。
constructor(props) {
super(props);
this.state = {
isLoading: true
}
}
componentDidMount() {
axios.get('https://jsonplaceholder.typicode.com/posts')
.then(res => this.setState({
isLoading: false,
data: res.data,
});
}
goToDetail = (id) => {
this.props.navigation.navigate('Detail', { id: id });
}
ListItem = ({ item, onTouch }) => (
<View style={styles.item} >
<TouchableOpacity onPress={() => onTouch(item.id)}>
<Text style={styles.itemText}>{`${item.id} ${item.title}`}</Text>
</TouchableOpacity>
</View>
);
render() {
return (
<View style={styles.itemList}>
<ScrollView>
<FlatList
data={this.state.data}
renderRow={(item) => <ListItem item={item} onTouch={this.goToDetail} />}
/>
</ScrollView>
</View>
)
}
推荐阅读
- sql - 在查询中从 nvarchar 读取键值对 XML,返回列中的值
- c# - 仅在某些情况下 LINQ 语句的 OutOfMemory 异常
- ruby-on-rails - 如何在视图中覆盖策略类
- c# - C# wpf 当打开文件时检测应用程序实例是否打开
- amazon-web-services - 使用 Pulumi 将 IAM 托管策略附加到 IAM 用户不起作用
- sql - 如何处理具有 varchar 值以及显示为科学格式的大数字的列?
- c# - 我无法让声音在我的小行星游戏中正常工作?
- ios - 核心图像裁剪和缩放图像大小
- reactjs - 这个怎么用。在react的return函数之外?
- javascript - 模拟传入客户端的函数的 req 和 res 的最佳方法是什么,例如 redis get 函数 - 下面的示例