個人的なメモも兼ねて。
src/index.js
でやること
1. createStore
のメソッドをRedux
からimportする。
STORE
を作成するためのメソッド。
引数にreducer
を指定する(後述)。
import { createStore } from 'redux';
2. Provider
コンポーネントをimport
ReduxをReactで使用するためのMWであるreact-redux
から、Reactプロジェクトで使用することのできるProvider
コンポーネントをimportし、設置する。
Provider
コンポーネントって何?
React Reduxの公式ドキュメントにもあるように、Provider
コンポーネントにネストされている範囲だけが、react-redux
の機能の一つであるconnect()
でconnectされたコンポーネントを扱えるようになるらしい。
Normally, you can’t use a connected component unless it is nested inside of a
<Provider>
.
Provider
コンポーネントはstore
と言うpropsのみ受け付けている。文字通りこのpropsにはcreateStore()
で作成したSTORE
を渡す。
import { Provider } from 'react-redux';
~~~~~中略~~~~~
ReactDOM.render(
<React.StrictMode>
<Provider store={store}>
<App />
</Provider>
</React.StrictMode>,
document.getElementById('root')
);
3. STORE
に渡すためのREDUCER
をimport
REDUCER
は他のファイルで定義しておく。
よく見かけるのはsrc/reducers
ディレクトリを切ってその中に目的別のreducerファイルを作成していく手法。
複数のファイルにまたがるREDUCER
を一つにまとめてsrc/index.js
でSTORE
に渡す方法は以下を参照。
Reactアプリ内でのReduxの複数のReducerを一つにまとめる方法 - Qiita
import rootReducers from "./reducers"; // 指定がない場合はwebpackがデフォルトでindex.jsというファイルを指定してくれる
Reduxを使用するときにやること
ReactとReduxの接続 connect()
登場人物たち
-
mapStateToProps :
STORE
が持っているstateをpropsに入れて子コンポーネントへ渡す。 -
mapDispatchToProps :
DISPATCH
を呼び出す関数をpropsに入れて子コンポーネントへ渡す。
const mapStateToProps = (state) => { // Issueコンポーネント内で使用するstateを限定する役目
return {
// stateオブジェクトから指定できるのは、src/reducers/index.js でrootReducerにまとめたときのオブジェクトのkey名
// key名がコンポーネントで受け取るpropsの名前になる
// なので、子コンポーネントでは「issue」という名前で参照可能。
issue: state.issue.data,
};
}
/*
子コンポーネントからdispatchするときに、わざわざ `dispatch(actionCreator(追加したい要素))`しなくても、
この場合だと `addContents(追加したい要素)` でstoreにdispatchできるようになる。
*/
const mapDispatchToProps = dispatch => {
return {
addIssue: (payload) => {
dispatch(actions.addIssue(payload));
},
}
}
connect()
の書き方
const ContainerInMiddle = connect(
mapStateToProps,
mapDispatchToProps
)(ChildComponent);
Container Components
(reduxと接続したreactのコンポーネント)のコード例
import * as actions from '../actions';
import { connect } from 'react-redux';
import IssueContents from '../components/organisms/IssueContents';
const mapStateToProps = (state) => { // Issueコンポーネント内で使用するstateを限定する役目
return {
// stateオブジェクトから指定できるのは、src/reducers/index.js でrootReducerにまとめたときのオブジェクトのkey名
// key名がコンポーネントで受け取るpropsの名前になる
// なので、子コンポーネントでは「issue」という名前で参照可能。
issue: state.issue.data,
};
}
/*
子コンポーネントからdispatchするときに、わざわざ `dispatch(actionCreator(追加したい要素))`しなくても、
この場合だと `addContents(追加したい要素)` でstoreにdispatchできるようになる。
*/
const mapDispatchToProps = dispatch => {
return {
addIssue: (payload) => {
dispatch(actions.addIssue(payload));
},
}
}
export default connect(
mapStateToProps,
mapDispatchToProps
)(IssueContents);
参考
▷Reduxのconnectについて
▷Basic Tutorial | React Redux
▷ReactとReduxで管理するstateの分け方|Playground発!アプリ開発会社の技術ブログ