是什么导致React Native componentDidMount无限地被称为none stop?

时间:2019-12-12 08:06:43

标签: react-native react-component

这是App.js

import React, { Component } from 'react';
import { Platform, StyleSheet, Text, View } from 'react-native';
import MovieList from './MovieList';

export default class App extends Component {
  render() {
    return (
      <View style={styles.container}>
        <MovieList />
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  }
});

这是MoveList.js

import React, { Component } from 'react';
import { Platform, StyleSheet, FlatList, ActivityIndicator, Text, View } from 'react-native';

export default class MovieList extends Component {

  constructor(props){
    super(props);
    this.state ={ isLoading: true}
  }

  componentDidMount() {
    console.log("componentDidMount")
    return fetch('https://facebook.github.io/react-native/movies.json')
      .then((response) => response.json())
      .then((responseJson) => {
        // console.log("responseJson: " + JSON.stringify(responseJson))
        this.setState({
          isLoading: false,
          dataSource: responseJson.movies,
        }, function(){

        });
      })
      .catch((error) =>{
        console.error(error);
      });
  }

  render(){

    if(this.state.isLoading){
      return(
        <View style={{flex: 1, padding: 20}}>
          <ActivityIndicator/>
        </View>
      )
    }

    return(
      <View style={styles.container}>
        <FlatList
          data={this.state.dataSource}
          renderItem={({item}) => <Text>{item.title}, {item.releaseYear}</Text>}
          keyExtractor={({id}, index) => id}
        />
        <MovieList name='Valeera' />
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  }
});

用于下载电影的代码来自官方入门指南networking,唯一的区别是我将代码放入了一个名为MovieList的新js文件中,并将其作为App.js中的一个组件包含了< / p>

使用上面的代码,componentDidMount被称为不停,并无限期地打印电影列表,最终应用程序将崩溃。

componentDidMount是否应该只被调用一次?是什么导致它被无限期调用?我在上面的代码中做错了什么?

1 个答案:

答案 0 :(得分:2)

您正在将组件octokit.repos.listTopics({owner: 'someUsername', repo: output[output.length-1].name}) .then((repository) => {console.log(repository.data.names)}) 嵌入到组件本身的渲染方法中。这造成了无限循环。也许您只需要在FlatList看起来完整的情况下将其删除即可。