Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

53
REDUX & ANGULAR UP & RUNNING NIR KAUFMAN

Transcript of Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

Page 1: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

REDUX & ANGULAR UP & RUNNING

NIR KAUFMAN

Page 2: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

AGENDAwhat is redux? how to use redux? where Angular fits in? where to go from here?

Page 3: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

WHAT IS REDUX? HOW TO USE IT? HOW ANGULAR FITS IN? NEXT STEPS

Page 4: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

WHAT IS REDUX

Page 5: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

REDUX IS A DESIGN PATTERNfor managing a complex, ever changing state in a challenging modern single page applications

Page 6: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

SINGLE SOURCE OF TRUTHthe state of your whole application is stored within a single store

Page 7: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

THE STATE IS READ ONLYthe only way to mutate the state is to emit an action describing what happened

Page 8: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

PURE FUNCTIONSto specify how the state is transformed by actions, you write a pure function.

Page 9: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

PURE* FUNCTION

ACTION NEXT STATE

* No side-effects

reducer

Page 10: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

const currentState = 0; const action = {type: 'INCREASE'}; function reducer(action, currentState){ if(action.type === 'INCREASE') { return currentState + 1; } return currentState; }

Page 11: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

const currentState = 0; const action = {type: 'INCREASE'}; function reducer(action, currentState){ if(action.type === 'INCREASE') { return currentState + 1; } return currentState; }

Page 12: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

const currentState = 0; const action = {type: 'INCREASE'}; function reducer(action, currentState){ if(action.type === 'INCREASE') { return currentState + 1; } return currentState; }

Page 13: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

const currentState = 0; const action = {type: 'INCREASE'}; function reducer(action, currentState){ if(action.type === 'INCREASE') { return currentState + 1; } return currentState; }

Page 14: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

const currentState = 0; const action = {type: 'INCREASE'}; function reducer(action, currentState){ if(action.type === 'INCREASE') { return currentState + 1; } return currentState; }

Page 15: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

HOW TO USE REDUX

Page 16: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

REDUX IS A TINY LIBRARYwhich contains a function for creating a store, and 4 other helpers functions that we can use.

Page 17: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

import { createStore } from 'redux'; const store = createStore(reducer);

Page 18: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

import { createStore } from 'redux';const store = createStore(reducer);

Page 19: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

STORE APIgetState() dispatch(action)subscribe(listener)replaceReducer(reducer)

Page 20: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

THE STORE IS SIMPLE TO UNDERSTANDwe can implement a working store in less then 30 lines of code.

Page 21: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

function createStore(reducer) { let state = null; const listeners = []; function getState() { return state; } function dispatch(action) { state = reducer(state, action); listeners.forEach(listener => listener()) } function subscribe(listener) { listeners.push(listener); return function () { let index = listeners.indexOf(listener); listeners.splice(index, 1) } } dispatch({ type:’@@INIT' }); return { getState, dispatch, subscribe } }

Page 22: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

CONNECTING THE DOTSnow we can dispatch actions and be notified when the state has changed.

Page 23: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

dispatch

getStateSTATE

ACTION

STOREUI

Page 24: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

UI IS RENDERED

Page 25: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

UI IS RENDEREDSOMETHING HAPPENED

Page 26: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

UI IS RENDEREDSOMETHING HAPPENEDACTION DISPATCHED

Page 27: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

UI IS RENDEREDSOMETHING HAPPENEDACTION DISPATCHEDSTATE CHANGED

Page 28: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

UI IS RENDEREDSOMETHING HAPPENEDACTION DISPATCHEDSTATE CHANGEDUI IS RENDERED

Page 29: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

UI IS RENDEREDSOMETHING HAPPENEDACTION DISPATCHEDSTATE CHANGEDUI IS RENDEREDSOMETHING HAPPENED

Page 30: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

UI IS RENDEREDSOMETHING HAPPENEDACTION DISPATCHEDSTATE CHANGEDUI IS RENDEREDSOMETHING HAPPENEDACTION DISPATCHED

Page 31: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

UI IS RENDEREDSOMETHING HAPPENEDACTION DISPATCHEDSTATE CHANGEDUI IS RENDEREDSOMETHING HAPPENEDACTION DISPATCHEDSTATE CHANGED

Page 32: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

UI IS RENDEREDSOMETHING HAPPENEDACTION DISPATCHEDSTATE CHANGEDUI IS RENDEREDSOMETHING HAPPENEDACTION DISPATCHEDSTATE CHANGEDSOMETHING HAPPENED

Page 33: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

UI IS RENDEREDSOMETHING HAPPENEDACTION DISPATCHEDSTATE CHANGEDUI IS RENDEREDSOMETHING HAPPENEDACTION DISPATCHEDSTATE CHANGED

UI IS RENDEREDSOMETHING HAPPENED

Page 34: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

UNI-DIRECTIONAL DATA FLOW

sync flow

Page 35: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

{ LIVE CODING }let’s build a traffic light and see redux in action!

Page 36: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

INTERCEPTING THE ACTION FLOWthis is done using middleware which can catch the action before they hit the store.

async flow

Page 37: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

STATE

ACTION

STOREUI

Middlewae

Page 38: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

{ LIVE CODING }implementing a simple logger as a middleware.

Page 39: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

ANGULAR & REDUX

Page 40: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

JUST THE VIEWapi as actions logic in middlewares & reducers state inside a store

Page 41: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

ANGULAR APP IS A TREE OF COMPONENTSeach component is responsible for rendering a a pert of the state, or dispatching actions.

Page 42: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

CONTAINER

COMPONENT COMPONENT

STORE

[properties] (events)

actions

state

Page 43: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

BINDING COMPONENTS TO THE STOREit’s straightforward but requires a lot of boilerplate inside the component class.

Page 44: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

NPM TO THE RESCUE! FIND AN ADAPTORI will use the ‘angular2-redux-bindings’ for this example

Page 45: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

class TodoListComponent { constructor(){ this.unsubscribe = store.subscribe( () => this.renderList ) } ngOnInit(){ this.renderList() } ngOnDestroy(){ this.unsubscribe() } addItem(item){ store.dispatch({ type: 'ADD_ITEM', payload: item }) } renderList(){ this.list = store.getState().list; } }

Page 46: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

class TodoListComponent { @MapState('list') private list; @BindActions(addItem) private addItem; }

Page 47: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

{ LIVE CODING }let’s build the view layer using Angular2 components

Page 48: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

NEXT STEPS

Page 49: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

PLAY WITH THE DEMO

https://github.com/nirkaufman/angular-redux-demo

Page 50: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

Angular & Redux Workshop

https://leanpub.com/redux-book

REDUX BOOK

Page 51: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

Angular & Redux Workshop

FURTHER READINGREDUX http://redux.js.org/

https://egghead.io/series/getting-started-with-redux

CQRS & EVENT SOURCING https://msdn.microsoft.com/en-us/library/dn568103.aspx

https://msdn.microsoft.com/en-us/library/dn589792.aspx

ANGULAR 2 angular-2-change-detection-explained.html

Page 52: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

THANK YOU!

Page 53: Angular2 and Redux - up & running - Nir Kaufman - Codemotion Amsterdam 2016

Read our blog:http://blog.500tech.com

NIR [email protected]

Head of Angular Development @ 500Tech