undefined 不是一个对象(评估 'allRowsIDs.length')(React-Native)

undefined is not an object (evaluating 'allRowsIDs.length') (React-Native)

我是 React-Native 的新手。按照基本的 React-Native 教程,我正在尝试从“https://facebook.github.io/react-native/movies.json”中获取 JSON 数据。我可以显示 titledescription 属性,但是当我尝试使用 ListView 显示 "movies" 属性 时,出现以下错误:

undefined is not an object (evaluating 'allRowsIDs.length')

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

var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});

export default class AwesomeProject extends Component {
  constructor(props) {
    super(props);
    this.state = { 
        dataSource: 'init',
    };
  }

  componentWillMount() {
    fetch('https://facebook.github.io/react-native/movies.json')
      .then((response) => response.json())
      .then((responseJson) => {
        this.setState({ dataSource: ds.cloneWithRows(responseJson.movies) });
      })
      .catch((error) => {
        console.error(error);
      });
  }

  render() {
      return (
        <View style={styles.container}>
          <ListView
            dataSource={this.state.dataSource}
            renderRow={(rowData) => <Text>{rowData}</Text>}
          />
        </View>
      );
  }
}

您最初的问题是您将 this.state.dataSource 设置为字符串 'init'。您希望它指向您之前声明的数据源。

你可以解决你的第一个问题,如果你改变:

this.state = { 
   dataSource: 'init',
};

对此:

this.state = {
   dataSource: ds
};

但是,这只会让您看到一条新的错误消息。 Objects are not valid as a React child... 的效果。您可以通过将渲染函数更改为 return 一个简单的字符串而不是整个 object 来解决这个问题。我建议您从标题开始,然后从那里开始。试试这个,你应该在路上:

 render() {
      return (
        <View style={styles.container}>
          <ListView
            dataSource={this.state.dataSource}
            renderRow={(rowData) => <Text>{rowData.title}</Text>}
          />
        </View>
      );
  }

此问题可能是由于尝试使用虚假列表呈现 ListView 造成的。

我刚刚打开了一个我已经有 6 个月没用过的应用程序,它突然爆炸了,因为数据库被擦除了,这个 ListView 正在尝试渲染并从 Redux 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}
    />
  )
}

如果在那之后你以某种方式继续得到它,请在 renderRow 中进行虚假检查。

根据 React Native 文档 Listview 组件在 React Native 中已弃用请使用FlatListSectionList

如需更多优惠,请选择:- https://facebook.github.io/react-native/docs/listview.html