47
React + Redux

React + Redux Introduction

Embed Size (px)

Citation preview

Page 1: React + Redux Introduction

React + Redux

Page 2: React + Redux Introduction

React + Redux @nikgraf

Nik Graf@nikgraf

[email protected]

Creator of Belle (UI Components)

Working with StarterSquad

Travelled around the World

Page 3: React + Redux Introduction

React + Redux @nikgraf

ECMAScript2015

const sum = (first, second) => { return first + second;}

Page 4: React + Redux Introduction

React + Redux @nikgraf

Created by Sebastian McKenzie

- ECMAScript 2015 Support, JSX Support- Widely adopted

Page 5: React + Redux Introduction

Let’s get started

Source: https://www.flickr.com/photos/mike52ad/

Page 6: React + Redux Introduction

React + Redux @nikgraf

React

React is a JavaScript Library for building user interfaces.• Focus on the UI, not a Framework

• One-way reactive data flow (no two-way data binding)

• Virtual DOM

Page 7: React + Redux Introduction

React + Redux @nikgraf

Virtual DOM

Keep track of state in DOM is hard.

The DOM API is slow.(Try to re-render the whole DOM on every change)

Page 8: React + Redux Introduction

React + Redux @nikgraf

Virtual DOM

Source: http://teropa.info/blog/2015/03/02/change-and-its-detection-in-javascript-frameworks.html

Page 9: React + Redux Introduction

React + Redux @nikgraf

Virtual DOM

Source: http://teropa.info/blog/2015/03/02/change-and-its-detection-in-javascript-frameworks.html

Page 10: React + Redux Introduction

React + Redux @nikgraf

Virtual DOM Benefits

Batched DOM read/write operations.

Efficient update of sub-tree only.

Page 11: React + Redux Introduction

React + Redux @nikgraf

Our first Experiment Part I

<!DOCTYPE html><html> <head> <meta charset="UTF-8" /> <script src="bundle.js"></script> </head> <body> <div id="example"></div> </body></html>

index.html

Page 12: React + Redux Introduction

React + Redux @nikgraf

Our first Experiment Part II

import React from 'react';import ReactDOM from 'react-dom';

const exampleElement = document.getElementById('example');ReactDOM.render(<h1>Hello, world!</h1>, exampleElement);

main.js -> bundle.js

Page 13: React + Redux Introduction

React + Redux @nikgraf

JSXJSX is a JavaScript syntax extension

that looks similar to XML.

// Input (JSX):var app = <Nav color="blue" />;// Output (JS):var app = React.createElement(Nav, {color:"blue"});

Page 14: React + Redux Introduction

React + Redux @nikgraf

Rendering a Component

import React from 'react';import ReactDOM from 'react-dom';

const App = () => { return (<p>Hello World!</p>);}

const exampleNode = document.getElementById('example');ReactDOM.render(<App />, exampleNode);

main.js -> bundle.js

Page 15: React + Redux Introduction

React + Redux @nikgraf

<body> <div id="example"> <p> <!-- App start --> Hello World! </p> <!-- App end --> </div></body>

index.html

Rendering a Component

Page 16: React + Redux Introduction

React + Redux @nikgraf

Nested Components Part I

import React from 'react';

const Profile = ({avatar, name}) => { return ( <div> <img src={avatar} /> <span>{name}</span> </div> );}

profile.js

Page 17: React + Redux Introduction

React + Redux @nikgraf

import React from 'react';import ReactDOM from 'react-dom';import Profile from ‘./profile';

const App = () => { return ( <div> <h1>Hello World!</h1> <Profile avatar="http://test.png" name="Nik" /> </div> );}

const exampleNode = document.getElementById('example');ReactDOM.render(<App />, exampleNode);

main.js -> bundle.js

Nested Components Part II

Page 18: React + Redux Introduction

React + Redux @nikgraf

<body> <div id="example"> <div> <!-- App start --> <h1>Hello World!</h1> <div> <!-- Profile start --> <img src="http://test.png" /> <span>Nik</span> </div> <!-- Profile end --> </div> <!-- App end --> </div></body>

index.html

Nested Components Part III

Page 19: React + Redux Introduction

React + Redux @nikgraf

Stateless Function Components

Functional Programming:- avoid changing-state- avoid mutable data- calling a function twice with the same values as arguments will produce the same result

Stateless Function Components:- avoid changing-state- avoid mutable data- calling a function twice with the same values as arguments will produce the same result

Page 20: React + Redux Introduction

React + Redux @nikgraf

Wait, but why?Predictable

easy to understand&

easy to test

Page 21: React + Redux Introduction

React + Redux @nikgraf

Page 22: React + Redux Introduction

React + Redux @nikgraf

If/Elseconst Profile = ({name, isOnline}) => { let onlineIndicator; if (isOnline) { onlineIndicator = (<span>green</span>); } else { onlineIndicator = (<span>red</span>); }

return ( <div> {name} {onlineIndicator} </div> );} profile.js

Page 23: React + Redux Introduction

React + Redux @nikgraf

If/Else<Profile name="Nik" isOnline={false}/>

<div> Nik <span>red</span></div>

Page 24: React + Redux Introduction

React + Redux @nikgraf

Loop

const FriendList = ({friends}) => { return ( <ul> {friends.map((friend) => { return <li>{friend.name}</li>; })} </ul> );}

friendlist.js

Page 25: React + Redux Introduction

React + Redux @nikgraf

Loopconst friends = [ { name: 'Max'}, { name: 'Tom'},];

<FriendList friends={friends} />

<ul> <li>Max</li> <li>Tom</li></ul>

Page 26: React + Redux Introduction

React + Redux @nikgraf

React Summary

- We can create out own components

- We can nest components as we like

- Stateless Function Components are pure

- We can control flow via JS (if, else, for, map …)

Page 27: React + Redux Introduction

React + Redux @nikgraf

Interactionconst Profile = ({name}) => { return ( <div> {name} <button onClick={ console.log('Clicked!'); }> Click me! </button> </div> );}

profile.js

Page 28: React + Redux Introduction

React + Redux @nikgraf

What to do with interactions like

onMouseOver,onSubmit &onClick?

Page 29: React + Redux Introduction

React + Redux @nikgraf

Redux to rescue!Redux allows you to manage the state with a minimal API but completely predictable behaviour.

Page 30: React + Redux Introduction

React + Redux @nikgraf

What about Flux?

Source: https://twitter.com/codecartoons/status/667348216669741056

Page 31: React + Redux Introduction

React + Redux @nikgraf

Basic Principle

(previousState, action) => newState

Page 32: React + Redux Introduction

React + Redux @nikgraf

Page 33: React + Redux Introduction

React + Redux @nikgraf

Redux Flow

StoreActionCreators

ReactComponent

s

Reducers

Interaction e.g onClick

dispatch(action)

(newState)

(state)

(previousState, action)

Page 34: React + Redux Introduction

React + Redux @nikgraf

Feels like Fear just turned into a Superpower

Page 35: React + Redux Introduction

React + Redux @nikgraf

Action

const action = { type: 'ADD_TODO', text: 'Call Mom',}

Page 36: React + Redux Introduction

React + Redux @nikgraf

Action Creatorfunction addTodo(text) { const trimmedText = text.trim(); return { type: 'ADD_TODO', text: trimmedText, }}

<button onClick={ dispatch(addTodo('Call Mom ') }> Add Todo</button>

actions.js

Page 37: React + Redux Introduction

React + Redux @nikgraf

Reducerconst todos = (state = [], action) => { switch (action.type) { case 'ADD_TODO': return [ ...state, { text: action.text, completed: false } ] default: return state }} reducers.js

Page 38: React + Redux Introduction

React + Redux @nikgraf

Storeimport { createStore } from 'redux'import todoReducer from '../reducers'let store = createStore(todoReducer);

store.subscribe(() => console.log(store.getState()))

store.dispatch(addTodo('Learn about reducers'));store.dispatch(addTodo(‘Call Mom'));

Page 39: React + Redux Introduction

React + Redux @nikgraf

Connect React with Redux

import React from 'react';import ReactDOM from 'react-dom';import { createStore } from 'redux';import { Provider } from 'react-redux';import todoApp from './reducers';import App from './containers/App';

let store = createStore(todoApp);

let exampleNode = document.getElementById('example');ReactDOM.render( <Provider store={store}><App /></Provider>, exampleNode);

Page 40: React + Redux Introduction

React + Redux @nikgraf

Connect React +Redux

import React from 'react';import { connect } from 'react-redux';import { addTodo } from '../actions.js';

const App = ({dispatch, state}) => { return ( <button onClick={ dispatch(addTodo('Call Mom') }> Add Todo </button> );};

export default connect(App);

Page 41: React + Redux Introduction

React + Redux @nikgraf

Redux Summary

- Redux allows you to manage the state with predictable behaviour.

- (previousState, action) => newState

Page 42: React + Redux Introduction

React + Redux @nikgraf

Page 43: React + Redux Introduction

React + Redux @nikgraf

Time-travel Demo

Page 44: React + Redux Introduction

React + Redux @nikgraf

Why this Stack?

- Reusable Components

- Predictable Code (functional)

- TimeTravel

- Performant & lightweight

Page 45: React + Redux Introduction

React + Redux @nikgraf

Is it production ready?

React

- used by Facebook, Firefox, Airbnb and many more

Redux

- used by Firefox, Docker, Technical University of Vienna, Mattermark and many more

- “Love what you’re doing with Redux” Jing Chen, creator of Flux

Page 46: React + Redux Introduction

Vienna React Meetup

Source: http://www.wolfography.at/

Page 47: React + Redux Introduction

React + Redux @nikgraf

The EndThanks for listening!

https://github.com/nikgrafhttps://twitter.com/nikgraf

Vienna React Meetup

http://www.meetup.com/Vienna-ReactJS-Meetup/