gpt4 book ai didi

android - 带有 Json Api 的 ReactNative ListView

转载 作者:搜寻专家 更新时间:2023-11-01 08:29:26 24 4
gpt4 key购买 nike

我无法在 ListView 中显示 json 数据。我在 console.log 中获取 json 数据,但在 ListView 中却没有 isLoading 始终为 false。我没有收到任何错误 .catch(error => console.warn("error"))。屏幕上的结果是第一个 View ,因为 this.state.isLoading 是 false。

代码如下:

import React, { Component } from 'react';
import { AppRegistry, StyleSheet, ListView, Text, View,Image,TouchableHighlight } from 'react-native';

var productArray = [];

class ListViewDemo extends Component {
constructor(props) {
console.warn("constructor");
super(props);
var dataSource = new ListView.DataSource({rowHasChanged:(r1,r2) => r1.guid != r2.guid});
this.state = {
dataSource: dataSource.cloneWithRows(productArray),
isLoading:true
}
}

componentDidMount() {
console.warn("componentDidMount");
this.getTheData(function(json){
productArray = json;
console.warn(productArray);
this.setState = ({
datasource:this.state.dataSource.cloneWithRows(productArray),
isLoading:false
})
}.bind(this));
console.warn("component -> " + this.state.isLoading);
}

getTheData(callback) {
console.warn("callback");
var url = "https://raw.githubusercontent.com/darkarmyIN/React-Native-DynamicListView/master/appledata.json";
fetch(url)
.then(response => response.json())
.then(json => callback(json))
.catch(error => console.warn("error"));
}

renderRow(rowData, sectionID, rowID) {
console.warn("renderRow");
return (
<TouchableHighlight underlayColor='#dddddd' style={{height:44}}>
<View>
<Text style={{fontSize: 20, color: '#000000'}} numberOfLines={1}>{rowData.display_string}</Text>
<Text style={{fontSize: 20, color: '#000000'}} numberOfLines={1}>test</Text>
<View style={{height: 1, backgroundColor: '#dddddd'}}/>
</View>
</TouchableHighlight>
);
}

render() {
console.warn("render" + this.state.isLoading);
var currentView = (this.state.isLoading) ? <View style={{height: 110, backgroundColor: '#dddddd'}} /> : <ListView dataSource={this.state.dataSource} renderRow={this.renderRow.bind(this)} enableEmptySections={true}/>
return(
<View>
{currentView}
</View>
);
}
}

// App registration and rendering
AppRegistry.registerComponent('AwesomeProject', () => ListViewDemo);

最佳答案

我看到这里有几个错误。

在您的 componentDidMount 中,您正在设置 datasource 而不是 dataSource:

  componentDidMount() {
console.warn("componentDidMount");
this.getTheData(function(json){
productArray = json;
console.warn(productArray);
this.setState = ({
//datasource:this.state.dataSource.cloneWithRows(productArray),
dataSource:this.state.dataSource.cloneWithRows(productArray),
isLoading:false
})
}.bind(this));
console.warn("component -> " + this.state.isLoading);
}

这就是您无法呈现的原因,因为 dataSource 从未被填充。这只是一个小拼写错误。

您可能没有在 getTheData 方法中进入第二个 then,因为您没有返回 Promise:

getTheData(callback) {
console.warn("callback");
var url = "https://raw.githubusercontent.com/darkarmyIN/React-Native-DynamicListView/master/appledata.json";
fetch(url)
//.then(response => response.json())
.then(response => return response.json())
.then(json => callback(json))
.catch(error => console.warn("error"));
}

您的 setState 有误,您分配它而不是调用它:

 //this.setState = ({
// datasource:this.state.dataSource.cloneWithRows(productArray),
// isLoading:false
//})

this.setState({
dataSource:this.state.dataSource.cloneWithRows(productArray),
isLoading:false
})

让我知道它是否有效。

关于android - 带有 Json Api 的 ReactNative ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41963524/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com