undefined не является объектом (оценка ' allRowsIDs.длина') (реагировать родной)

Я очень новичок в React-Native. Следуя основному учебнику React-Native, я пытаюсь получить данные JSON из "https://facebook.github.io/react-native/movies.json". Я могу отобразить title и description свойства, но когда я пытаюсь отобразить свойство "фильмы" с помощью ListView Я получаю следующую ошибку:

undefined не является объектом (оценка ' 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>
      );
  }
}

2 ответов


ваша первоначальная проблема заключается в том, что вы установили this.state.dataSource в строку 'init'. Вы хотите, чтобы это указывало на источник данных, который вы объявили ранее.

вы можете решить вашу первую проблему, если вы измените:

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

для этого:

this.state = {
   dataSource: ds
};

тем не менее, это просто приведет вас к новому сообщению об ошибке. Что-то вроде Objects are not valid as a React child.... Вы можете исправить это, изменив функцию рендеринга, чтобы вернуть простую строку, а не весь объект. Я предлагаю вам начать с названия и двигаться дальше. Попробуйте это, и вы должны быть на своем пути:

 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.