2017-11-08 9 views
1

私のアプリが起動すると、ListComponentというコンポーネントがロードされ、サーバーからすべてのアイテムリストが取得され、listViewとして表示されます。私は別のカテゴリのsideMenuを持っています。ユーザが1つのカテゴリを選択すると、ListNavigatorを介して別のUR1を使用してListComponentが再度呼び出されます。 ListComponentでは私のコードはReact native:コンポーネントがコード化された後にコードを実行する

class ListComponent extends Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     isLoading: true 
    } 
    } 

componentDidMount() { 
this.requestUrl(allItemsUrl) 
} 

componentWillUpdate(){ 
    const params = this.props.navigation.state.params; 
if(params.id == '1'){ 
    this.requestUrl(urlCategory1); 
    }else if (params.id == '2'){ 
    //..... 
    } 
} 

render() { 

    if (this.state.isLoading) { 
     return (
     <View style={{flex: 1}}> 
      <ActivityIndicator style={styles.activity}/> 
     </View> 
    ); 
    } 

// show the list with the selected category data 

componentWillUpdate()のように見える新しいカテゴリがメニュー項目から選択されるたびに呼び出されます。問題は、componentWillUpdateが呼び出されたときにデータが要求された後、レンダリングが再度呼び出されて新しいデータがレンダリングされた場合、componentWillUpdateが再度呼び出され、無限ループが作成されるということです。しかしcomponentWillUpdateの代わりに何を使うべきかを理解しておらず、カテゴリがstackNavigatorから選択されたときに1回だけ呼び出されるようにしました。

編集:

私はコメントで提案された解決策を適用すると、古いとnextPropsを比較することにより、無限ループを停止しました。また、componentWillUpdateをcomponentDidUpdateに変更しましたが、警告が表示されるようになりました。

警告:次のリリースでは、空のセクションヘッダーがレンダリングされます。あなたは空の セクションヘッダ

をレンダリングするために「enableEmptySections」フラグを使用することができます。このリリース であなたは問題が何であるかを知っていますか?

+0

全体のライフサイクルがあります: https://reactjs.org/docs/react-component.html たぶんチェックhttps://reactjs.org/docs/react-component.html#componentdidupdate どうやらこれがありますネットワーク通話のための良い場所 –

答えて

0

componentDidUpdateの小道具を比較できます。古いカテゴリに等しいカテゴリが何もしない場合。ディミトリBosteelsの答え

componentWillUpdate(prevProps, prevState){ 
    const params = this.props.navigation.state.params; 
    if(prevProps.navigation.state.params.id === params.id) { 
     return; //do nothing 
    } 
    if(params.id == '1'){ 
    this.requestUrl(urlCategory1); 
    }else if (params.id == '2'){ 
    //..... 
    } 
} 
+0

私はエラーがありませんundefinedはオブジェクトではありません( 'nextProps.navigation.state.params.id'を評価する) – user567

+0

私はちょうどDimitri Bosteelsの答えを読んでいます。あなたは 'ComponentWillUpdate'の代わりに' ComponentDidUpdate'を試すことができますか?私は答えを編集する –

0

あなたはComponentWillUpdate()戻り 前に、コンポーネントを更新することはできませんから編集
参照:ComponentWillUpdate
しかし、あなたは多分ComponentDidUpdateでそれを行うことができますか?
コンポーネントのライフサイクルを説明する2つのリンクを確認してください。
明らかに、ComponentDidUpdate()はネットワーク通話を行うのに適しています。 私はあなたの問題を正しく理解していることを願っています。

+0

私はそれをComponentDidUpdate()で行ったことはありませんが、問題が発生したらComponentWilUpdate()を試しました。問題は、ComponentDidUpdate()でRESTリクエストを作成するとrenderが呼び出されてからComponentDidUpdate()が無限に呼び出されるということです – user567

+0

次にGiang Leが言ったように、prevProps、prevStateのcomponentDidUpdateのバージョンを使用し、のparamsが変更されました。そうでない場合は、何もしないで次の更新をトリガーしません –

関連する問題