React Native评估' dataSource.rowIdentities

时间:2016-02-18 03:34:23

标签: react-native

我正在使用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,有什么想法吗?

2 个答案:

答案 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} /> ) } 进行虚假检查。