2017-09-11 22 views
0

私はこのReact親コンポーネントをここに持っています。この時点で子コンポーネントはドロップダウンメニューを返すだけです。私は、componentWillReceivePropsがここで状態を更新することを期待していました。これは、順番に、StopListに渡されるべきです。しかし、state.selectedSubがhandleSubSelectによって変更された場合、何も起こらず、StopListはどのプロップも受け取りません。React componentWillReceivePropsが状態を更新していません

私はcomponentWillReceivePropsの非同期性に間違いがありますか?それは私のコードの間違った場所にありますか?ライフサイクルの方法が間違っていますか?

// We're controlling all of our state here and using children 
// components only to return lists and handle AJAX calls. 

import React, { Component } from 'react'; 
import SubList from './SubList'; 
import StopList from './StopList'; 

class SubCheck extends Component { 

    constructor (props) { 
    super(props); 
    this.state = { 
     selectedSub: '--', 
     selectedStop: null, 
     stops: ['--'], 
    }; 
    this.handleSubSelect.bind(this); 
    this.handleStopSelect.bind(this); 
    } 

    // We want the user to be able to select their specific subway 
    // stop, so obviously a different array of stops needs to be 
    // loaded for each subway. We're getting those from utils/stops.json. 
    componentWillReceiveProps(nextProps) { 
     var stopData = require('../utils/stops'); 
     var stopsArray = []; 
     var newSub = nextProps.selectedSub 
     for(var i = 0; i < stopData.length; i++) { 
      var stop = stopData[i]; 

      if (stop.stop_id.charAt(0) === this.state.selectedSub) { 
       stopsArray.push(stop.stop_name); 
      } 
     } 
     if (stopsArray.length !== 0 && newSub !== this.state.selectedSub) { 
      this.setState({stops: stopsArray}); 
     } 
    } 

    handleSubSelect(event) { 
     this.setState({selectedSub:event.target.selectedSub}); 
    } 

    handleStopSelect(event) { 
     this.setState({selectedStop:event.target.selectedStop}) 
    } 

    render() { 
     return (
      <div> 
       <SubList onSubSelect={this.handleSubSelect.bind(this)}/> 
       <StopList stops={this.state.stops} onStopSelect={this.handleStopSelect.bind(this)}/> 
      </div> 
     ); 
    } 
} 

export default SubCheck; 
+0

親から渡されたpropsが変更されたときに 'componentWillReceiveProps'が呼び出されます。あなたが 'handleSubSelect'でdoiingしているように' setState'を呼び出すと呼び出されることはありません –

+0

@Prakashsharma私はそれを私の子コンポーネントで使うことはできず、その子もステートレスな機能コンポーネントにしていますか? – bkula

+0

'handleSubSelect'が呼び出されたときに' componentWillReceiveProps'コードを実行します。 –

答えて

2

あなたはデータを複製しており、不要な頭痛を引き起こしています。

selectedSubselectedStopの両方が、propsstate属性として格納されています。このデータがどこにあるかを決める必要があります。

あなたが遭遇している問題は、state属性を変更し、これがあなたの小道具への変更を引き起こすことを期待しているという事実の周りを回っています。彼らが名前を共有しているからといって、彼らが同じ価値を持っているわけではありません。

+0

これは非常に有益な答えのようですが、詳しく説明できますか?私は100%独学で、このような間違いをして学ぶので、私と一緒にいてくれてありがとう。これらの識別子を小道具と国家の両方に格納することについてあなたが言っていることを理解していますが、私は州を設定してから子コンポーネントに小道具として渡すべきではないでしょうか? – bkula

+0

はい、状態として保存してから、小道具として渡すことは100%正しいです。問題は、同じコンポーネント内で、 'this.setState({selectedSub:...})'と 'nextProps.selectedSub'です。これは、この値を状態内に設定することを期待していることを意味しますが、同じコンポーネントの小道***からも取得できます。***を暗示しているため、子に渡されません。 'componentWillReceiveProps'のすべてのコードを' handleSubSelect'メソッドに移動し、 'props.selectedSub'ではなく' state.selectedSub'だけを参照したいと思うかもしれません。 – gravityplanx

+0

オハイオ州ええ、それは理にかなっています。私は実際にnextProps.selectedSubが動作し、そこにプレースホルダとしてそれを持っていたという仮定の下にいませんでした(私はここに投稿したコードでコメントするのを忘れていました)。 – bkula

関連する問題