今回は React 入門をいったんお休みして、 Redux に入門する。最終的には React & Redux のアプリを作る必要が出てきそうだたので、ここらへんでいったんしっかり勉強したほうがいいかなと。
Getting Started with Redux · Redux
Redux のページを一通り読んで見たがいまいちわからず、Redux の公式 Example を眺めながら実際に動かしてみた。
最終的にはここの記事に書かれていることが行われているんだな。ということで納得いったんだけど、納得するまでに、Exampleのどのファイルがどの役割と結びついているのかがイメージできなくて困ってた。
タスクの追加に関して言うと、User Input
と View
に当たる部分は AddTodo.js
だろう。ボタンを押すと form
ノードの onSubmit
が発火する。すると、dispatch(addTodo(input.value))
がコールされる。addTodo()
でアクションが作成され、dispatch()
で storeにディスパッチされる。
addTodo()
というのが ActionCreator
のことで、実装はsrc/actions/index.js
にある。内容は単純にオブジェクトを生成してるだけ。生成されたオブジェクトは Action
にあたり、それが dispatch()
関数によって、store にディスパッチされる。
ディスパッチ先のstoreは src/index.js
で作成されている。crateStore()
関数に reducer を渡して store を作成している。作成された store は <Provider>
コンボーネントに渡されることで保持されている。
import React from 'react' import { render } from 'react-dom' import { createStore } from 'redux' import { Provider } from 'react-redux' import App from './components/App' import rootReducer from './reducers' // ここで store が作成される。 const store = createStore(rootReducer) render( // ここで store を保持 <Provider store={store}> <App /> </Provider>, document.getElementById('root') )
reducer は src/reducers
フォルダの下にある。reducer は新たなstate を作成し返すだけの関数で、sub-reducer を combineReducers()
関数を使うことでまとめて一つの reducer とすることができるようだ。
また、AddTodo.js や VisibleTodoList.js は connect() という関数でラップされているが、これは dispatch()
関数や state
をコンポーネントに渡すために必要なものらしい。
成果物
ここに、Todo に追加する部分だけを抽出したものを置いておく。できるだけ単純にしたので最低限のReduxのふるまいを知る分には有用だろう。
GitHub - bamchoh/redux-study at 3b75c828a886b19cdce2122bf1eacdc9f9010edf