2016-09-27 15 views
0

は、私は、次のコンポーネントのコードを持っている:私はcomponentWillMountに新しい状態を取得する方法なぜこの状況でcomponentWillReceivePropsが必要なのですか?

var Answer = React.createClass({ 

    getInitialState: function(){ 
     return { comments: []} 
    }, 

    componentWillMount: function(){ 
     $.ajax({ 
      context: this, 
      method: 'GET', 
      url: '/answers/' + this.props.answer.id + '/comments', 
      success: function(data){ 
       this.setState({comments: data}); 
      } 
     }); 
}, 

    render: function(){ 
     return ( 
      <div> 
       <Comments comments={this.state.comments} /> 
      </div> 
     ); 
}, 

お知らせし、その後、Commentsコンポーネントに小道具としてこの新しい状態を渡します。私は私のCommentsコンポーネントをリフレッシュするの世話をして、新しい小道具を通過するI componentWillMountsetStateが、しかし、それは私が私のCommentsコンポーネントでは、この方法が必要に判明したときにすることを期待していた:

componentWillReceiveProps: function(newProps){ 
     this.setState({comments: newProps.comments}) 
}, 

誰かが説明していただけます私の親コンポーネントが、私が父親の状態を設定した後、子に渡されている小道具を更新しないのはなぜですか?

+0

* "しかし、私のコメントモジュールではこのメソッドが必要です" *ここではそうであるような状態で小道具を保管する場合にのみこれを行う必要があります。あなたがしていると思われるhttps://facebook.github.io/react/tips/props-in-getInitialState-as-anti-pattern.htmlを参照してください。 –

+0

@FelixKlingはい、あなたは正しいです、私は状態で小道具を保管しています、私はしないようにしますか? –

+1

はい、する必要はありません。リンクを参照してください:) –

答えて

1

これは、渡された小道具からCommentsコンポーネントの状態を初期化するためです。親コンポーネントで変更された子コンポーネント内の状態を初期化しても、子コンポーネント内のinitilizaingコードは再実行されません。私はそれが新しいものにコメントを設定しないと、このメソッドは、あなたが新しい小道具を渡すときに初期化されるときにComments回呼び出され、この

getInitialState: function(){ 
    return { comments: this.props.comments} 
}, 

のようなものを見て、あなたのCommentsコンポーネントgetInitialState方法を期待していcomponentWillReceivePropsを使用していない限り、Commentsコンポーネントです。親が提供しているものと同じであれば、あなたの子供に新しい状態を作るべきではありません。

状態が[回答のみ]で管理されている場合は、Commentsコンポーネントのコメント状態を削除し、Commentsの小道具としてのみ使用してください。

関連する問題