# ReactJS REDUX Summary

### Using stores and reducers

#### A simple example

```
import {createStore} from 'redux'<br></br><br></br>var reducer_1 = (state, action) => {<br></br>  console.log('reducer_0 was called with state', state, 'and action', action);<br></br>};<br></br>var store_1 = createStore(reducer_1); 
```

#### Real world example

```
import {createStore} from 'redux'<br></br><br></br>var reducer_1 = (state = {}, action) => {<br></br>  switch(action.type) {<br></br>  case '':<br></br>  return {<br></br>    ...state,<br></br>    message: action.value<br></br>  };<br></br>  default:<br></br>    return state;<br></br>  }<br></br>};<br></br>var store_1 = createStore(reducer_1); 
```

#### Combining reducers

```
import {combineReducers, createStore} from 'react';<br></br><br></br>var userReducer = (state = {}, action) => {<br></br>  switch(action) {<br></br>    case 'ADD_USER':<br></br>    return {<br></br>      //Return modified state<br></br>  };<br></br>  default:<br></br>    return state;<br></br>  }<br></br>};<br></br><br></br>var itemReducer = (state = [], action) => {<br></br>  switch(action) {<br></br>    case 'ADD_ITEM':<br></br>      return {<br></br>        //Return modified state<br></br>      };<br></br>    default:<br></br>      return state;<br></br>  }<br></br>};<br></br><br></br>var reducers = combineReducers(user: userReducer, item: itemReducer);<br></br>var store = createStore(reducers);<br></br>console.log(store.getState());<br></br>// {<br></br>// user: {}, // {} is the slice returned by our userReducer<br></br>// items: [] // [] is the slice returned by our itemsReducer<br></br>// } 
```

### Dispatching an action

Flow of application: ActionCreator -&gt; Action -&gt; dispatcher -&gt; reducer

#### Without action creator

```
import {combineReducers, createStore} from 'react';<br></br><br></br>var userReducer = (state = {}, action) => {<br></br>  switch(action) {<br></br>  case 'ADD_USER':<br></br>    return {<br></br>      //Return modified state<br></br>    };<br></br>    default:<br></br>      return state;<br></br>  }<br></br>};<br></br><br></br>var itemReducer = (state = [], action) => {<br></br>  switch(action) {<br></br>    case 'ADD_ITEM':<br></br>      return {<br></br>        //Return modified state<br></br>      };<br></br>      default:<br></br>        return state;<br></br>    }<br></br>};<br></br><br></br>var reducers = combineReducers(user: userReducer, item: itemReducer);<br></br>var store = createStore(reducers);<br></br>store.dispatch({type: 'ACTION'}); 
```

#### With Action Creator (Adopted from Flux)

```
import {combineReducers, createStore} from 'react';<br></br><br></br>var userReducer = (state = {}, action) => {<br></br>  switch(action) {<br></br>    case 'ADD_USER':<br></br>      return {<br></br>        //Return modified state<br></br>      };<br></br>    default:<br></br>      return state;<br></br>  }<br></br>};<br></br><br></br>var itemReducer = (state = [], action) => {<br></br>  switch(action) {<br></br>    case 'ADD_ITEM':<br></br>      return {<br></br>        //Return modified state<br></br>      };<br></br>    default:<br></br>      return state;<br></br>  }<br></br>};<br></br><br></br>var reducers = combineReducers(user: userReducer, item: itemReducer);<br></br>var store = createStore(reducers);<br></br>var addItemActionCreator = (name) => {<br></br>  return {<br></br>    item: name,<br></br>    type: 'ADD_ITEM'<br></br>  };<br></br>};<br></br>store.dispatch(addItemActionCreator); 
```

#### Async Action with Middleware

```
import {combineReducers, createStore, applyMiddleware} from 'react';<br></br><br></br>var userReducer = (state = {}, action) => {<br></br>  switch(action) {<br></br>    case 'ADD_USER':<br></br>      return {<br></br>        //Return modified state<br></br>      };<br></br>    default:<br></br>      return state;<br></br>  }<br></br>};<br></br><br></br>var itemReducer = (state = [], action) => {<br></br>  switch(action) {<br></br>    case 'ADD_ITEM':<br></br>      return {<br></br>        //Return modified state<br></br>      };<br></br>    default:<br></br>      return state;<br></br>    }<br></br>};<br></br><br></br>//Set the state after 2s<br></br>var addItemActionCreator = (name) => {<br></br>  return (dispatch) => {<br></br>    setTimeout(() => {<br></br>      dispatch({<br></br>        item: name,<br></br>        type: 'ADD_ITEM'<br></br>      });<br></br>    }, 2000);<br></br>  };<br></br>};<br></br><br></br>// 1) The first level provide the dispatch function and a getState function (if your<br></br>// middleware or your action creator needs to read data from state) to the 2 other levels<br></br>// 2) The second level provide the next function that will allow you to explicitly hand over<br></br>// your transformed input to the next middleware or to Redux (so that Redux can finally call all reducers).<br></br>// 3) the third level provides the action received from the previous middleware or from your dispatch<br></br>// and can either trigger the next middleware (to let the action continue to flow) or process<br></br>// the action in any appropriate way.<br></br>var thunkMiddleware = ({dispatch, getState}) => {<br></br>  return (next) => {<br></br>    return (action) => {<br></br>      return typeof action === 'function' ? action(dispatch, getState) : next(action);<br></br>    }<br></br>  };<br></br>};<br></br><br></br>var reducers = combineReducers(user: userReducer, item: itemReducer);<br></br>var finalCreateStore = applyMiddleware(thunkMiddleware)(createStore);<br></br>var store = finalCreateStore(reducers);<br></br>store.dispatch(addItemActionCreator); 
```

### Subscribing to a Store

```
import {createStore} from 'redux'<br></br><br></br>var reducer_1 = (state = {}, action) => {<br></br>  switch(action.type) {<br></br>    case '':<br></br>      return {<br></br>        ...state,<br></br>        message: action.value<br></br>      };<br></br>    default:<br></br>      return state;<br></br>  }<br></br>};<br></br>var store_1 = createStore(reducer_1);<br></br>store_1.subscribe(() => {<br></br>  //Update react views<br></br>});
```