2016-10-24 22 views
0

私はMeteor/Reactを使用しています。私はTasksを購読しているTaskコンポーネントのメインコンテナを持っています。子コンポーネントでは、タスクを表示しますが、タスク(createdAt、Nameなど)をソートするためのドロップダウンリストを持っています。Meteor/React、CreateContainerと子コンポーネントを介して状態を渡すか?

私はこれをSessionとBlazeで使いましたが、私はReactを使っていて、同じことをしていないようです。ソート作業リストをどのように反応させるかわからない。今私がしようとしていることは(それが良い方法かどうかわからない)Appコンポーネントで状態を設定し、それをコンテナと子に送信することです。

AppClass命令

constructor(props){ 
    super(props); 
    this.state = this.getMeteorData(); 
    this.sortTasks = this.sortTasks.bind(this); 
} 

getMeteorData(){ 
    return { 
     sorting: { createdAt: -1 }, 
    }; 
} 

sortTasks(sorting) { 
    this.setState({ sorting: sorting }); 
} 


render(){ 
    const childrenWithProps = React.Children.map(this.props.children, (child) => 
     React.cloneElement(child, { 
      sorting: this.state.sorting, 
      sortTasks: this.sortTasks.bind(this), 
     }) 
    ); 
    return <div>{childrenWithProps}</div> 
} 

コンテナ

export default TodosContainer = createContainer(({props}) => { 

    Meteor.subscribe('tasks'); 

    return { 
    tasks: Tasks.find({}, { sort: props.sorting }).fetch(), 
    sorting: props.sorting, 
    sortTasks: props.sortTasks, 
    }; 

}, TodosPage); 

TodosPage

const propTypes = { 
    .... 
    sorting: PropTypes.string.isRequired, 
} 

render() { 
    return (
    ... 
    {(() => { 
     if (this.state.listSelected) { 
      return (
       <TaskPanel 
        tasks = {this.props.tasks} 
        sorting = {this.props.sorting} 
        sortTasks = {this.props.sortTasks} 
       /> 
      ); 
     } 
    })()} 

そして後に、Tここで

<Route path="/admin" component={AdminAppContainer}> 
     <IndexRoute component={AdminMainContainer}/> 
     <Route path="todos" component={TasksContainer}> 
      <Route path=":listId" component={TodosPage}/> 
     </Route> 
    </Route> 

はまた、私はちょうど状態 "仕分け" 必要があります... impricatedコンポーネントです:

const propTypes = { 
    .... 
    sorting: PropTypes.string.isRequired, 
} 

handleSelect(event, sorting) { 
    switch(event) { 
     case 1: return this.props.sortTasks({ createdAt: -1 }); 
     case 2: return this.props.sortTasks({ createdAt: 0 }); 
    }; 
} 

render() { 
    return (
    <DropdownButton 
     onSelect={(event, sorting) => this.handleSelect(event, this.props.sorting)} 
     <MenuItem eventKey="1">Created Date Asc</MenuItem> 
     <MenuItem eventKey="2">Created Date Desc</MenuItem> 
    </DropdownButton> 
    ... 
    {this.renderTasks()} 
    ... 

最後のポイント、路線:パネル、TodosPageの子を頼みますこのTasksContainerでは、AppClassの他の子ではありません...この状態だけをこの子に配布することはできますか?

ありがとうございます。

答えて

0

実際にはほとんどあります。基本的に、あなたが望むのは、子供と父親の間のコミュニケーションです。私はあなたが答えhereを見つけることができると思います。

親テンプレートに状態fooを定義し、fooの状態を更新する機能bar()を定義することです。それらを小道具としてコンテナに渡します。その後、this.props.bar()を呼び出すことによって、状態を子供から変更することができます。状態が変化するとレンダリングがトリガーされ、子を新しい値で更新します。

私は非常に明示したリンクの答えを見つけました、あなたが探しているものがいいと思います。

+0

ちょっと@Max G.それはまさに私が代わりにしようとしていたものですが、問題があります。方法で状態を更新できません...私の投稿を編集しています – guillaumek

+0

今。あなたが持っているエラーは何ですか?コンソールには何もありませんか?私が気づいたことの1つは、おそらく問題ではないが、TodosContainerにあり、あなたの関数は '{props}'をパラメータとして取る。私は* createContainerが最上位レベルの小道具、つまり* 'createContainer((props)=> {})'を与えると思う。あなたはワットを使って、実際には 'props.props'を探しています。これは未定義につながる可能性があります。しかし、この場合、コンソールに表示されるはずです。また、 'App'で' TodosContainer'を呼び出しているとしますか? –

+0

いいえ私は残念ながらコンソールに何も持っていません。 console.logが結果を表示するので、私は自分のstate.sortingを関係する子に渡すことができるようです。しかし、関数sortTasksは機能しません。エラーメッセージはありませんが、何もしません。また、私は小道具をパラメータから消去しようとしました:容器のthis.props.sorting、それは私が持っているコンソールで動作していない:ソートは未定義です。私は記事を編集してルートを表示します。それはコンテナが呼び出される場所です。どうもありがとうございました – guillaumek

関連する問題