导致React Native componentDidMount无限地被称为不停止的原因是什么?

问题描述 投票:0回答:1

这里是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中的一个组件包含在内

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

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

react-native react-component
1个回答
0
投票

您正在将组件MovieList嵌入到组件本身的渲染方法中。这造成了无限循环。也许您只需要在FlatList似乎完整的位置将其删除即可。

© www.soinside.com 2019 - 2024. All rights reserved.