Reduxについて勉強しているます。
モジュールの使い方を調べていて、分からない記述があり教えていただきたいです。
connectのexportを指定するときに次のような書き方をします。
javascript
1// TodoはReact.Component 2export default connect()(TodoApp)
connect()の後に、(コンポーネント)
としています。
javascriptではこのような書き方をした場合、どのような挙動をするのしょうか?
MDNのexportを確認してみましたが、同じような形式の処理はわかりませんでした。
export - JavaScript | MDN
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
こんにちは
ご質問にある疑問を解消して、理解を深めるには、React用語の「高階コンポーネント」を知っておくとよいかと思います。以下は、connect()
が返す値についての react-redux 公式ドキュメントからの引用です。
--- 引用:ここから ---
connect() Returns
The return of connect() is a wrapper function that takes your component and returns a wrapper component with the additional props it injects.
javascript
1import { login, logout } from './actionCreators' 2 3const mapState = state => state.user 4const mapDispatch = { login, logout } 5 6// first call: returns a hoc that you can use to wrap any component 7const connectUser = connect( 8 mapState, 9 mapDispatch 10) 11 12// second call: returns the wrapper component with mergedProps 13// you may use the hoc to enable different components to get the same behavior 14const ConnectedUserLogin = connectUser(Login) 15const ConnectedUserProfile = connectUser(Profile)
In most cases, the wrapper function will be called right away, without being saved in a temporary variable:
javascript
1import { login, logout } from './actionCreators' 2 3const mapState = state => state.user 4const mapDispatch = { login, logout } 5 6// call connect to generate the wrapper function, and immediately call 7// the wrapper function to generate the final wrapper component. 8 9export default connect( 10 mapState, 11 mapDispatch 12)(Login)
--- 引用:ここまで ---
上記では、通常
javascript
1export default connect( 2 mapState, 3 mapDispatch 4)(Login)
と書くところを、connect
が返す値をいったんconnectUser
という変数に入れることで、
javascript
1// first call: returns a hoc that you can use to wrap any component 2const connectUser = connect( 3 mapState, 4 mapDispatch 5) 6 7// second call: returns the wrapper component with mergedProps 8// you may use the hoc to enable different components to get the same behavior 9const ConnectedUserLogin = connectUser(Login)
という二段階にして説明しています。上記の connectUser
に connect
の返す値を代入する行の上に、以下のコメントがあります。
// first call: returns a hoc that you can use to wrap any component
上記を訳すと、connect
の返す値の説明として、
// 1番目の呼び出し: 任意のコンポーネントをラップするために使用できる hoc を返します。
という感じですが、これに出てくる、hoc
とは、**高階コンポーネント(HOC: Higher-Order Component)**のことです。以下は、React公式ドキュメントの高階 (Higher-Order) コンポーネント からの引用です。
具体的には、高階コンポーネントとは、あるコンポーネントを受け取って新規のコンポーネントを返すような関数です。
先の react-redux のサンプルコードでいうと
javascript
1const connectUser = connect( 2 mapState, 3 mapDispatch 4)
によって、connectUser
には HOC が入ってきます。どのようなHOCかというと、
- 引数として与えられたコンポーネントのいくつかのpropsに、
mapState
とmapDispatch
で指定されたマッピングによって、redux の store の内容の一部と、dispatchを使った関数とが注入されてくるコンポーネントを返す
という、そういう働きをするHOCです。先のサンプルでは、connectUser
にLogin
コンポーネントを引数として渡して、connect
の返すコンポーネントを、(先頭が大文字の)変数ConnectedUserLogin
で受けることによって、新たに ConnectedUserLogin
コンポーネントを作っています。
javascript
1// second call: returns the wrapper component with mergedProps 2// you may use the hoc to enable different components to get the same behavior 3const ConnectedUserLogin = connectUser(Login)
よく使われるHOCの他の例として、react-router の withRouter や、react-redux の connect と同様に HOCを返す関数として、Material UI の withStyles などがあります。また、自作するアプリケーションのあるコンポーネント群に共通するpropを注入するためのHOCや、HOCを返す関数を自作することもできます。connect()
の働きを理解するために、簡単なHOCや、HOCを返す関数を自作してみるのもよいかもしれません。
以上、参考になれば幸いです。
投稿2020/08/29 02:05
総合スコア9058
0
内部的な実装を確認したわけではないのですがfunc()()
の記法そのものはjavascript
では稀に(?)見かけます。
例えば下記のように関数を返却する関数を実行した場合などです。
javascript
1function generateFunc(){ 2 return function(){ 3 console.log("hogehoge"); 4 } 5} 6 7generateFunc()(); // -> hogehoge
したがってconnect()(TodoApp)
は
connect()
でコンポーネントを引数に取る関数を返し(TodoApp)
で返ってきた関数にTodoApp
を渡す
という処理になります。
投稿2020/08/28 07:37
総合スコア2411
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/29 06:10
2020/08/29 23:44
2020/09/03 14:55