JKになりたい

何か書きたいことを書きます。主にWeb方面の技術系記事が多いかも。

React-Reduxメモ

アクションの追加

定数でActionの種類を定義する。
ReducerはActionの種類を見てどのような状態を返すのかを決定する

ActionはActionCreater経由で発行する。
connectを用いると自動的に適切なReducerにActionが渡される。

//sample_action.js
//Actionの定義
export const ACTION_TYPE_A = ‘ACTION_TYPE_A’
export const ACTION_TYPE_B = ‘ACTION_TYPE_B’
//ActionCreater
export function aAction() {
    return {
        type: ACTION_TYPE_A,
    //その他渡すデータなど
    };
}
export function bAction() {
    return {
        type: ACTION_TYPE_B,
    //その他渡すデータなど
    };
}

Reducer

発行されたActionを受け取り状態を返す。
新しい状態を返さないと再レンダリングされないので注意。

//sample_reducer.js
import { combineReducers } from ‘redux’;
import { ACTION_TYPE_A,ACTION_TYPE_B } from ‘./sample_action’;
function sampleReducer(state, action) {
    if (typeof state === ‘undefined’) {
        return Object.assign({}, state, {
            myState:NULL
        });
    }
    switch (action.type) {
        case ACTION_TYPE_A :
        return Object.assign({}, state, {
            myState:"ActionA"
        });
        case ACTION_TYPE_B :
        return Object.assign({}, state, {
            myState:"ActionB"
        });
        default:
        return state;
    }
}
export default sampleReducer;

複数のReducerをまとめる(今は1個)

//reducers.js
import {combineReducers} from ‘redux’;
import sampleReducer from ‘./sample_reducer’
const rootReducer = combineReducers({sampleReducer});
export default rootReducer;

最上位のコンポーネントを作る

Reducxにおいてストアはただ1つだけ。

//index.ios.js
import rootReducer from ‘./reducers’
const store = createStore(
    rootReducer,
    applyMiddleware(thunk)
    );
class INDEX extends Component {
    constructor(props){
        super(props);
    }
    render() {
        return (
            <Provider store={store}>
            <App/>
            </Provider>
            );
        }
    }

作成したActionをマッピング

これでActionを発行したら自動的にReducerへ渡されるようになる

//app.js
import * as SampleAction from ‘./sample_action’;
function mapDispatchToProps(dispatch) {
    return {
        …bindActionCreators(SampleAction, dispatch),
        pushState
    };
}

Reducerから受け取るStateをPropsにマッピング

新しいStateを受け取ると該当のPropsを用いているコンポーネントを再レンダリングしてくれる。

//app.js
function mapStateToProps(state) {
    return {
        sample: state.sampleReducer,
    };
}
//ReduxのstoreにReactのコンポーネントをバインドする
//https://github.com/reactjs/react-redux/blob/master/docs/api.md#connectmapstatetoprops-mapdispatchtoprops-mergeprops-options
export default connect(mapStateToProps,mapDispatchToProps)(App)