我正在使用React-Native中的dataSource创建一个基本的ListView,其中包含我获取的数据。
class Movies extends Component {
render() {
if (this.state.dataSource.getRowCount() === 0) {
return (
<View style={styles.container}>
<Text>
loading....
</Text>
</View>
);
}
else {
return (
<View style={styles.container}>
<ListView
dataSource={this.state.dataSource}
renderRow={this.renderRow.bind(this)}
/>
</View>
);
}
}
constructor(props){
super(props);
this.state = {
dataSource: new ListView.DataSource({
rowHasChanged: (row1, row2) => row1 !== row2,
}),
};
}
componentWillMount() {
this.fetchData();
}
fetchData(){
fetch(HOT_MOVIES_URL)
.then((response) => response.json())
.then((responseData) => {
if (responseData) {
this.setState({
dataSource: this.state.dataSource.cloneWithRows(responseData),
});
}
})
.done();
}
}
然而,我得到了
undefined不是对象(评估&#39; dataSource.rowIdentities&#39;)
错误,试过很多方法也不能包含这个question,有什么想法吗?
答案 0 :(得分:8)
尝试将ListView DataSource设置为可重用变量,然后在需要时重复使用它。此外,您可能需要将dataSource设置为空数组,直到您的数据进入。尝试这样的事情:
var ds = new ListView.DataSource({ rowHasChanged: (row1, row2) => row1 !== row2 })
class Movies extends Component {
render() {
if (this.state.dataSource.getRowCount() === 0) {
return (
<View style={styles.container}>
<Text>
loading....
</Text>
</View>
);
}
else {
return (
<View style={styles.container}>
<ListView
dataSource={this.state.dataSource}
renderRow={this.renderRow.bind(this)}
/>
</View>
);
}
}
constructor(props){
super(props);
this.state = {
dataSource: ds.cloneWithRows([]),
};
}
componentWillMount() {
this.fetchData();
}
fetchData(){
fetch(HOT_MOVIES_URL)
.then((response) => response.json())
.then((responseData) => {
if (responseData) {
this.setState({
dataSource: ds.cloneWithRows(responseData),
});
}
})
.done();
}
}
答案 1 :(得分:0)
此问题似乎是由于尝试使用虚假列表呈现ListView
而引起的。
我刚刚打开了一个我在6个月内没有使用过的应用程序,因为数据库被擦除而且ListView
正在尝试渲染并从Redux {{1}获取一个空列表}。
长调试故事简短,我在渲染方法中放入一个空列表检查:
mapStateToProps
如果你以某种方式继续得到它,请在render() {
if (!this.props.employees.length) {
return (
<View>
<Text>NO EMPLOYEES TO LIST</Text>
</View>
)
}
return (
<ListView
enableEmptySections
dataSource={this.dataSource}
renderRow={this.renderRow}
/>
)
}
进行虚假检查。