2016-04-25 18 views
0

私は自動実行に問題があり、親の状態を設定しています。ReactJS + Tracker:親状態を更新する

  1. カテゴリ

    • サブ1
    • サブ2
  2. カテゴリーB

      :例えば、私はまた、SUBCAT項目を有するcateogryアイテムを抱えています
    • サブ3
    • サブ今4

私はサブ4を訪れた場合、カテゴリーBと小4の状態がアクティブに行くべきです。サブカテゴリー項目呼び出す

export class CategorySubItem extends Tracker.Component { 

constructor(props) { 
    super(props); 

    this.state = { 
     active: false 
    }; 

    this.autorun(() => { 
     if(LayoutGlobals.get().categoryId == this.props.doc.id) { 
      this.setState({active:true}); 
      this.props.parent.setState({active:true}); 
     } else { 
      this.setState({active:false}); 
      this.props.parent.setState({active:false}); 
     } 
    }); 




} 

<CategorySubItem doc={cat} key={cat.id} parent={this}/> 

LayoutGlobalsが反応変数である私のサブコンポーネントで

、私のコードは次のようになります。私は親の状態を設定すると、無限ループの再レンダリングで終わります。これを処理する正しい方法は何でしょうか?

+0

コンポーネントは、自分自身の責任を負い、自分の子にアクションを委任する必要があります。親にツリーを戻さないでください – Alex

答えて

1

親コンポーネントの状態を設定しないでください。すべてのコンポーネントは、代わりに独自の状態のみを設定する必要があります。あなたのCategoryコンポーネントがアクティブかどうかを判断する関数を記述してください。

私はautorunを避けようとします。 LayoutGlobals.get().categoryIdをコンポーネントツリーのプロップとして渡して、独自のcomponentWillReceiveProps関数を実装してください。そうすれば、Reactに再評価を最小限に抑えることができます。

+0

しかし、私はFlowRouterを使用していて、URLの変更を聞く必要がありますか?この場合、変更をリスンするための自動実行機能は必要ありませんか?私の考えは、カテゴリコンポーネント内でこの関数を実装し、次にpropとしてアクティブな値を渡すことです。 – user2891491

+1

'createComponent'を使って、リアクティブメトリー値をReact propsに変換します。たとえば、Menuコンポーネントの 'createComponent'でFlowRouterを呼び出して、その小道具をCategoriesやSubCategoriesに渡すだけです。 – aedm

関連する問題