2017-07-14 16 views
0

オブジェクトの異なるデータ型を表す要素を持つ状態があるとします。 各要素は、この種のパターンを達成するための信頼性の高い方法である何ダイナミックコンポーネントのアクションをディスパッチする信頼性の高い方法は何ですか?

export default connect(
    (state) => { 
     return { 
      events: getRegisteredEventsList(state).map(item => { 
      return { 
       title: item.get('name'), 
       actionButton: <a onClick={dispatch(someActionForThisSpecifiedItem(item))}>Custom Action</a> 
      } 
      }) 
    }, 
    (dispatch) => { 
     return { 

     } 
    } 
)(Dashboard) 

を派遣するさまざまなアクションを持つことができますか? dispatchメソッドをコンテナの小道具に付ける必要がありますか?私はこの時点でそれを達成するにはどうすればよい

は次のとおりです。

export default connect(
    (state) => { 
     return { 
      events: getRegisteredEventsList(state).map(item => { 
      return { 
       title: item.get('name'), 
       actionButton: ({dispatch}) => <a 
        className={"btn btn-success"} 
        onClick={() => dispatch(someActionForThisSpecifiedItem(item))}>Go To</a> 
      } 
      }) 
    } 
)(Dashboard) 

追加する方法:

renderActionButtons() { 
    const { actionButtons, dispatch } = this.props 
    return actionButtons.map(button => renderComponent(button, { 
     dispatch 
    })); 
    } 

私のダミー部品に - 私のビューコンポーネントが今する必要があるため、関心事の分離の違反があります知っているとディスパッチプロパティを維持する

私はそれも同様に機能要求を減らすことができるように感じる。

+0

ない私はあなたが正確に何をしようとして理解していれば、あなたが項目のリストを持っていますし、それぞれのリンクを作成したいと考えてくださいを派遣する能力を持っていますそれぞれ異なるアクションを送りますか? – enzoborgfrantz

+0

はい。 MapStateToPropsにコンポーネントの定義を追加しないでください。しかし、私はそれが必要です特定のアイテムのメタデータが異なる場合、私は別のコンポーネントをレンダリングしたい。ダッシュボードコンポーネントのスイッチではなく、ここが良い場所だと考えてください。 –

+0

この場合もこれを行うことができます。私の更新された回答を参考にしてください。 – enzoborgfrantz

答えて

1

私はこのような何かのために行くだろう、あなたの状態は、このようなものである簡略化のために言うことができます:

const items = [{ 
    name: 'abc', 
}, { 
    name: 'def', 
}]; 

それは

const Link = ({name, onClick}) => <a onClick={() => onClick(name)}>{name}</a>; 

レンダリングをクリックしますとき、単純にアクションをディスパッチするリンクコンポーネント次の小道具を受け入れるリンクコンポーネント:アイテムのリストとアクションをディスパッチできるonClick関数

const RenderLinks = ({ items, onClick }) => (
    <div> 
    {items.map(a => 
     <Link 
     name={a.name} 
     onClick={onClick} 
     />)} 
    </div> 
); 

const mapStateToProps = (state) => ({ 
    items, 
}); 

のonClick関数は、アクション

const mapDispatchToProps = (dispatch) => ({ 
    onClick: (name) => dispatch({type: `${name.toUpperCase()}_CLICKED`}), 
}); 

export default connect(mapStateToProps, mapDispatchToProps)(RenderLinks); 
+0

意味があります! onActionButtonClickを公開することは、私の理解から派生するよりも優れています。 @enzoborgfrantzもう1つ考えてみましょう。 mapStateToPropsにReactコンポーネント定義を追加することについてどう思いますか?これは、各要素の異なるコンポーネントをレンダリングすることです。私はむしろDashboardコンポーネントの特定のタイプのスイッチよりもそうするでしょう –

+0

私の意見では、mapStateToProps関数は、状態データをコンポーネントの小道具にマッピングするために使用する必要があります。その方向に進めたいのであれば、基本的に高次のコンポーネントを調べます。これは基本的に他のコンポーネントをパラメータとして取り上げ、新しいコンポーネントを追加したものです。たとえば、上位コンポーネントを作成することができます:buttonWithClick which takesボタンコンポーネントをパラメータとして使用し、クリック機能を使用してラップし、クリック機能を備えた新しいボタンコンポーネントを返します。 – enzoborgfrantz

+0

詳しくは、こちらをご覧ください:https://facebook.github.io/react/docs/higher-order-components .html – enzoborgfrantz

関連する問題