質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Redux

Reduxは、JavaScriptアプリケーションの状態を管理するためのオープンソースライブラリです。ReactやAngularで一般的にユーザーインターフェイスの構築に利用されます。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

1回答

997閲覧

ボタンがクリックされることにより複数のactionが発行される場合(例)

atemu

総合スコア94

Redux

Reduxは、JavaScriptアプリケーションの状態を管理するためのオープンソースライブラリです。ReactやAngularで一般的にユーザーインターフェイスの構築に利用されます。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2018/12/02 01:40

react + reduxを使用しています。

たとえばなのですが、ボタンがクリックされることにより、複数のactionを発行したいとします。
このとき、コンポーネントのonClickに以下のように書く方法があると思います。

js

1const TestComp = props => { 2 const handleClick = () => { 3 props.actionA(); 4 props.actionB(); 5 props.actionC(); 6 }; 7 return <button onClick={handleClick}>test button</button>; 8}; 9 10const mapDispatchToProps = dispatch => ({ 11 actionA() { 12 dispatch(actionA()); 13 } 14 actionB() { 15 dispatch(actionB()); 16 } 17 actionC() { 18 dispatch(actionC()); 19 } 20}); 21 22export default connect( 23 null, 24 mapDispatchToProps 25)(TestComp);

これではコンポーネントが長くなってしまうので、container側でまとめる方法もあると思います。

const TestComp = ({ handleClick }) => { return <button onClick={handleClick}>test button</button>; }; const mapDispatchToProps = dispatch => ({ handleClick() { dispatch(actionA()); dispatch(actionB()); dispatch(actionC()); } }); export default connect( null, mapDispatchToProps )(TestComp);

または、action typeに'ONCLICK'みたいなもの作成し、その一つのaction typeに対して複数のreducerが処理する、みたいな方法もあると思っています。

他にも方法はあるのかもしれませんが(あったらぜひ教えてください!)、どの実装パターンがもっとも良いと考えられるでしょうか?

状況によって最前の実装パターンが変わる場合には、どういう状況でどの実装がよいのか、など教えていただけると幸いです。

よろしくお願いします!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

こんにちは

こういうモジュールがありますという参考情報を回答します。

以下は、 redux の issue Batching actions #911 での、Reduxの作者のお一人である、Dan Abramovさんのコメントからの引用です。

Instead, the “Redux approach” to this would be to create a batching action creator:

javascript

1function batchActions(...actions) { 2 return { 3 type: 'BATCH_ACTIONS', 4 actions: actions 5 }; 6} 7 8// usage 9store.dispatch( 10 batchActions( 11 doSomething(), 12 doSomethingElse() 13 ) 14);

and a higher order reducer:

javascript

1function enableBatching(reducer) { 2 return function batchingReducer(state, action) { 3 switch (action.type) { 4 case 'BATCH_ACTIONS': 5 return action.actions.reduce(batchingReducer, state); 6 default: 7 return reducer(state, action); 8 } 9 } 10} 11 12// usage 13let store = createStore(enableBatching(reducer)); 14

上記のコメントを受けて、issueを起票した方の作成したモジュールが以下です。

上記を使うと、

const handleClick = () => { props.actionA(); props.actionB(); props.actionC(); };

と書いていたのが、「アクションA、アクションB、アクションCを順次行う」ということを一つのアクションで書けて、この、まとめたアクションをdispatchするということができるようになるようです。

Dan Abramovさんのコメントの中では、このようなやり方が

“Redux approach”

だと言っていますね。
申し訳ないですが、このモジュールを私自身は使ったことがありません。

参考になれば幸いです。

投稿2018/12/02 10:35

jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問