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

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

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

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

Q&A

解決済

2回答

625閲覧

React-reduxのmapDispatchtoProps内のアロー関数にはどのような引数を書けばよいのですか?

退会済みユーザー

退会済みユーザー

総合スコア0

React.js

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

0グッド

0クリップ

投稿2020/04/18 04:56

分からないこと

const mapDispatchToProps = (dispatch) => ( { onChange: (?) => dispatch(changeValue(?)) } );

?に何を書いたら良いのかが分かりません。

発生している問題

textフォームのvalueが変更されません。

const TextForm = ({ value, onChange }) => { return( <> <p>{value}</p> <input type="text" defaultValue={value} onChange={(e) => onChange(e.target.value)} /> {// onChangeの(e)の部分も間違っているような気がします} </> ); }
import { connect } from 'react-redux'; import { changeValue } from '../actions/actions'; import TextForm from '../components/TextForm'; const mapStateToProps = (state) => ( { value: state.textFormReducer.value } ); const mapDispatchToProps = (dispatch) => ( { onChange: (value) => dispatch(changeValue(value)) } ); const TextFormContainer = connect(mapStateToProps, mapDispatchToProps)(TextForm); export default TextFormContainer;
export default function textFormReducer(state = VALUE, action) { switch (action.type) { case CHANGE_VALUE: // return {value: state.value}; return ( Object.assign({}, state, {value: state.value}) ) default: return state; } }

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは。
では、回答として転記させて頂きますね。

もう少し細かく分解すると、以下のような感じになります。

(1) テキストインプット <input type="text"> に何か文字を打ち込むと、inputのonChangeが発火する。このときのイベントオブジェクトをeとする。

(2) TextForm の prop として渡されてきた onChange が、引数として e.target.value を渡されて呼ばれる。

(3) TextFormはreduxにconnectされており、TextForm の prop onChange には、

mapDispatchToProps で指定した、

(value) => dispatch(changeValue(value))

という関数が渡されてきているので、 (2)の引き続きとして、まず、

dispatch(changeValue(e.target.value))

が呼ばれる。

(4) アクションクリエータ が changeValue(e.target.value) と呼ばれると、これは

  • type が CHANGE_VALUE で、
  • valueプロパティ が e.target.value

のアクションを返す。

(5) dispatch(changeValue(e.target.value)) によって、上記 (4)で作成されたアクションがstoreに送出(dispatch)される。

(6) アクションがstoreにdispatchされると、redux の機構によってtextFormReducer が呼ばれ、この第1引数に現在のstate、第2引数に (5)でstore に送出されたアクションが入ってくる。

(7) textFormReducerは、渡されたアクションのtypeごとの処理を行い、actionの内容を使用して更新後のstateを作って返す。この例の場合は、action.valuestate.value の新しい値として上書きするように更新する。

(8) redux の機構によって (7)で textFormReducer が返した値で、 store 内のstateが更新される。

(9) redux (およびreact-redux) の機構によって、上記 (8) の state の更新を TextFormContainer は知らされ、 mapStateToProps によって更新されたstate の value プロパティを、TextForm の prop value に渡す。

(10) 更新されたprop valueを受け取ったTextFormは、新たな prop value の値で再度renderされる。これによって、 <p>{value}</p> の部分に、新しい値が反映される。

補足

もう一点、

return Object.assign({}, state, { value: action.value });

でもよいのですが、スプレッド構文( ... ) を使った、

javascript

1return { ...state, value: action.value };

という書き方もよく使います。

補足2

もうひとついいでしょうか。

jsx

1<input type="text" defaultValue={value} onChange={(e) => onChange(e.target.value)} />

と書いている部分ですが、より丁寧に書けば、

jsx

1const TextForm = ({ value, onChange }) => { 2 3 const handleChange = (e) => { 4 onChange(e.target.value); 5 } 6 7 return( ・・・

という感じで、 handleChange という、 handle が接頭辞の関数(の入る変数)を作っておいて、

jsx

1<input type="text" defaultValue={value} onChange={handleChange} />

と書くやり方(流儀、ですかね)もあります。
つまり

  • handle・・・ という名前でコールバックを入れる変数を作って、

  • そこでpropから渡されたコールバックを使う関数を書き、

  • render に現れる子コンポーネントの on何とか prop に渡す

というパターンです。

投稿2020/04/18 11:18

jun68ykt

総合スコア9058

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

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

jun68ykt

2020/04/18 11:26

(1)から(10)の流れで、特に押さえておくべきステップは、説明の中に redux の機構によって と書いてあるところです。そこを押さえて、「何をreduxはやってくれるのか?」「 reduxがやってくれていることを自分のコードで自作しようとしたら、どのようなコードを用意しなければならないのか?」 みたいなことを考えると redux の御利益が分かってきます。
退会済みユーザー

退会済みユーザー

2020/04/18 11:32

たくさんあるので勉強のし甲斐がありますね。ありがとうございます!
jun68ykt

2020/04/18 11:42

どういたしまして。 > 勉強のし甲斐がありますね。 とのことで、よかったです????
guest

0

onChange: (value) => dispatch(changeValue(value))
return Object.assign({}, state, { value: action.value });

にしたら変更できました。
これは、
0. テキストフォームの変更でonChangeが発火して、valueを引数にchangeValueアクションが呼ばれる
0. dispatch(changevalueアクション)でreducerが呼ばれる
0. action.〇〇でオブジェクトの値にアクセスできる
から?(自信なし)

投稿2020/04/18 06:51

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

jun68ykt

2020/04/18 11:19 編集

回答に転記させて頂きました。
jun68ykt

2020/04/18 11:19 編集

回答に転記させて頂きました。
jun68ykt

2020/04/18 11:19 編集

回答に転記させて頂きました。
退会済みユーザー

退会済みユーザー

2020/04/18 11:06

こんなにも詳しく……ありがとうございます!!これを私の回答のコメントではなく、新たに回答してくれませんか?ベストアンサーにさせてください。
jun68ykt

2020/04/18 11:21

殊勝なご配慮、ありがとうございます。回答のほうに転記させて頂きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問