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

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

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

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

React.js

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

Q&A

解決済

1回答

3518閲覧

react-reduxのconnect関数に渡す引数に、奇妙な構文が使われていて解読できません。

uuushiro

総合スコア41

Redux

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

React.js

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

0グッド

1クリップ

投稿2017/05/05 10:32

編集2017/05/05 10:34

###前提・実現したいこと
下記のURLのconnect関数の構文を理解したいです。
該当箇所

###発生している問題

reduxの公式tutorialなどに書いてある記法は、

javascript

1export default connect( 2 mapStateToProps, 3 mapDispatchToProps 4)(Root);

なのですが、
上記のURLのconnectの構文は少し違って見えます。

javascript

1export default connect(() => ({}), { 2 move 3})(Notes);

これを上の記法と揃えて書くと、下記のようになりますよね。

javascript

1export default connect( 2() => ({}), 3 {move} 4)(Notes);

おそらく、分割代入のテクニックが使われているような気がするのですが、結局解読できませんでした。

これは一体どこでdispatchしているのでしょうか。

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問のコードは下記のように書かれているのと同じです。

JavaScript

1const mapStateToProps = () => ({}); 2const mapDispatchToProps = { 3 move: move 4}; 5 6export default connect( 7 mapStateToProps, 8 mapDispatchToProps 9)(Notes);

moveは別ファイルからimportしているAction Creatorです。

mapStateToPropsmapDispatchToPropsはそういう名前の関数やObjectがあるわけではなく、そういう機能に該当した関数やObjectを指定すると言うことです。直接書いても良いですし、変数に入れてから使用しても問題ありません。

mapStateToPropsで指定するのは関数です。これは、引数としてstateと(親コンポーネントから送られてきた)自身宛のprops(省略可)を受け取り、指定の子コンポーネント(質問のコードではNotesコンポーネント)へ渡すpropsを返す関数になります。() => ({})はどんなstateやpropsを受け取ったとしても、引数は無視して、常に{}という空のObjectを返します。つまり、この部分では子コンポーネントにはpropsは何も渡さないとなります。
※ 自身宛のpropsは省略する場合が多いです。
※ ここで関数を指定するとstoreが購読され、storeの変更の度に呼び出されます。購読させたくなければ、nullまたはundfeinedを使う必要があります。該当のコードがなぜnullまたはundefinedを使っていないのかはわかりません。

mapDispatchToPropsで指定するのは関数またはObjectです。関数の場合は、引数としてdispatch関数と(親コンポーネントから送られてきた)自身宛のprops(省略可)を受け取り、指定の子コンポーネント(質問のコードではNotesコンポーネント)へ渡すpropsを返す関数になります。dispatch関数が引数と渡されますので、dispatch関数を実行する関数が値となるpropsを作成できるのが特徴です。ここで作ったpropsを、子コンポーネントのイベントに結びつけると、イベント発生時にdispatchが実行され、Reduxの仕組みによりstoreの更新、購読しているコンポーネントの再レンダリングが行われます。また、Objectを指定することもできます。この場合は、同名のAction Creatorをdispatchする関数を値としたpropsを作成します。

Objectを渡す部分は少しわかりにくかったと思います。質問のコードの{move}部分は

JavaScript

1(dispatch) => ({ 2 move: (...args) => {dispatch(move(...args))} 3})

というような感じになっているということです。

そして最後に、connectは、自身宛のprops、mapStateToPropsで作成したprops、mapDispatchToPropsで作成したprops、この三つのpropsをマージして子コンポーネントに渡します。(マージの仕方は第三のオプションとして変更可能です)

その他、詳しいことは下記参考にあるAPIドキュメントを確認してみてください。

参考: connect() - react-redux API

投稿2017/05/05 22:15

編集2017/05/06 07:04
raccy

総合スコア21735

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

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

uuushiro

2017/05/06 06:06

回答ありがとうございます。 とてもわかりやすく詳しい説明ありがとうございます。 なるほど。mapDispatchToPropsは関数だけだと勘違いしておりました。ドキュメントを読まないから混乱してしまうのですね。反省します。 Objectを渡す部分をコードで説明してくださって、とても理解の助けになりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問