## Video 1: Setting up Webpack
* React Dev Tools
* Redux Dev Tools
## Video 2: App Layout + Component Setup
## Video 3: Create Single and PhotoGrid components
## Video 4: Setting up React Router
```jsx
import { Router, Route, IndexRoute, browserHistory } from 'react-router'
const router = (
)
render(router, document.getElementById('root'))
```
* Use `Bla` to create push state links.
* browserHistory will be replaced later by `history` which first syncs the browser history with the react store (see next video).
## Video 5: Setting up React Store
* One giant state for all data
* it is called `store`
```jsx
import { createStore, compose } from 'redux'
import { syncHistoryWithStore } from 'react-router-redux'
import { browserHistory } from 'react-router'
import rootReducer from './reducers/index'
const store = createStore(rootReducer, defaultState)
export const history = syncHistoryWithStore(browserHistory, store)
export default store
```
## Video 6: Redux Actions
* actions invoke changes of the state (adding, updating, removing data)
* actions are objects with two elements: type and payload
* action creators are functions which return actions:
```jsx
function increment(index) {
return {
type: 'INCREMENT_LIKES',
index,
}
}
function addComment(postId, author, comment) {
return {
type: 'ADD_COMMENT',
postId,
author,
comment
}
}
```
## Video 7: Redux Reducers
* reducers handle the data when an action is received
* use one reducer per components
* reducers are functions which take
- the action
- a copy of the current state
* reducers return the updated state if there is a change, or the previous state
* always start like this and then add some conditional functionality:
```jsx
function posts(state = [], action) {
if (...) {
return nextState
}
return state
}
export default posts
```
* combine them in a root reducer
```jsx
import { combineReducers } from 'redux'
import { routerReducer } from 'react-router-redux'
import posts from './posts'
const rootReducer = combineReducers({ posts, ..., routing: routerReducer })
export default rootReducer
```
* always add `routing: routerReducer` at the end to integrate the route changes with other action changes.
* executes URL changes implicitely
*
## Video 8: Integrating our Store with React Router
* to make the store globally available, put it on top of the routing
* replace the browserHistory as mentioned before.
```diff
import { Router, Route, IndexRoute, browserHistory } from 'react-router'
+import { Provider } from 'react-redux'
+import store, { history } from './store'
const router = (
+
-
+
<\/Route>
<\/Router>
+
)
render(router, document.getElementById('root'))
```
* The state is now stored in the store. `$r.store.getState()`
## Video 9: Understanding the Reducer's Job and Dispatching Actions
* action creators return actions
* actions invoke state changes
* reducers change the state
* the store provides a dispatch function
```jsx
// on the console
$r.store.dispatch({type: 'INCREMENT', index: 1})
```
* The dispatcher sends the action to **every** reducer
* Therefore, the reducer needs to have some conditional logic.
## Video 10: Accessing dispatch and state with Redux
* in regular React, the state or parts of it are propagated via props
* in Redux, `connect` injects the data in the components that need it
* for that, we wrap the main component with one that has the state and dispatcher propagated
```jsx
import { bindActionCreators } from 'redux'
import { connect } from 'react-redux'
import * as actionCreators from './actions/actionCreators'
import Main from './Main'
function mapStateToProps(state) {
return {
posts: state.posts,
comments: state.comments,
}
}
function mapDispatchToProps(dispatch) {
return bindActionCreators(actionCreators, dispatch)
}
const App = connect(mapStateToProps, mapDispatchToProps)(Main)
export default App
```
* because Main ist just JSX, connect injects standardized props into it and makes the state and dispatcher available.
* You can still propagate data down with props
## Video 11: Displaying Redux State inside our Components
* Creating React components
## Video 12: Updating State with Reducers
* Once you propagate the reducer function to the component, this is how you pass arguments to the function call
- Remember that `