keeping front-end development simple with react · keeping front-end development simple with react...

66
Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

Upload: others

Post on 29-Jun-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

Keeping Front-end Development Simple with React

Tony Tsui

@tony_tsui

Page 2: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

React

Page 3: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

KEEP IT SIMPLE

https://flic.kr/p/uYhasX

simple /ˈsɪmp(ə)l/ easily understood or done

Page 4: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

KEEP IT SIMPLE

https://flic.kr/p/uYhasX

simple /ˈsɪmp(ə)l/ easily understood or done

1. Composable Components

Page 5: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

KEEP IT SIMPLE

https://flic.kr/p/uYhasX

simple /ˈsɪmp(ə)l/ easily understood or done

1. Composable Components

2. Predictable Data Flow

Page 6: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

KEEP IT SIMPLE

https://flic.kr/p/uYhasX

simple /ˈsɪmp(ə)l/ easily understood or done

1. Composable Components

2. Predictable Data Flow

3. Carefree Rendering

Page 7: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

KEEP IT SIMPLE:COMPOSABLE COMPONENTS

https://flic.kr/p/dmFK9Y

Page 8: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

ANATOMY OF A REACT COMPONENT

Page 9: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

ANATOMY OF A REACT COMPONENT

<div>

<h3>Delete The Account?</h3>

<DangerButton>Yep</DangerButton>

<button>Cancel</button>

</div>

Page 10: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

ANATOMY OF A REACT COMPONENT

const DeleteAccount = () => (

<div>

<h3>Delete The Account?</h3>

<DangerButton>Yep</DangerButton>

<button>Cancel</button>

</div>

);

Page 11: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

ANATOMY OF A REACT COMPONENT

const DeleteAccount = () => (

<div>

<h3>Delete The Account?</h3>

<DangerButton>Yep</DangerButton>

<button>Cancel</button>

</div>

);

Page 12: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

ANATOMY OF A REACT COMPONENT

const DeleteAccount = () => (

<div>

<h3>Delete The Account?</h3>

<DangerButton>Yep</DangerButton>

<button>Cancel</button>

</div>

);

Page 13: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

ANATOMY OF A REACT COMPONENT

const DeleteAccount = () => (

<div>

<h3>Delete The Account?</h3>

<DangerButton>Yep</DangerButton>

<button>Cancel</button>

</div>

);

ES2015 Arrow Function Syntax

Page 14: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

ANATOMY OF A REACT COMPONENT

const DeleteAccount = () => (

<div>

<h3>Delete The Account?</h3>

<DangerButton>Yep</DangerButton>

<button>Cancel</button>

</div>

);

JSX

Page 15: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

JSX: BEHIND THE CURTAINSconst DeleteAccount = () => ( <div> <h3>Delete The Account?</h3> <DangerButton>Yep</DangerButton> <button>Cancel</button> </div>);

Page 16: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

JSX: BEHIND THE CURTAINSconst DeleteAccount = () => ( <div> <h3>Delete The Account?</h3> <DangerButton>Yep</DangerButton> <button>Cancel</button> </div>);

const DeleteAccount = () => ( React.createElement('div', null, React.createElement('h3', null, 'Delete The Account?'), React.createElement(DangerButton, null, 'Yep' ), React.createElement('button', null, 'Cancel') ););

Page 17: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

EMBRACE JAVASCRIPTHandlebars<ul> {{#each accounts}} <li>{{this}}</li> {{/each}}</ul>

Page 18: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

EMBRACE JAVASCRIPTHandlebars<ul> {{#each accounts}} <li>{{this}}</li> {{/each}}</ul>

React<ul> { accounts.map(account => <li>{account}</li>) }</ul>

Page 19: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

COMPONENT INTERFACE

Page 20: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

COMPONENT INTERFACE

<DeleteAccount accountName=”Billy Bob (Google)” />

Page 21: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

COMPONENT INTERFACE

const DeleteAccount = (props) => ( <div> <h3>Delete The Account: {props.accountName}?</h3> <DangerButton>Yep</DangerButton> <button>Cancel</button> </div>);

<DeleteAccount accountName=”Billy Bob (Google)” />

Page 22: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

COMPONENT INTERFACE<DeleteAccount accountName=”Billy Bob (Google)” onConfirm={ _handleDeleteAccountConfirmation } onCancel={ _handleDeleteAccountCancellation }/>

Page 23: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

COMPONENT INTERFACE

const DeleteAccount = (props) => ( <div> <h3>Delete The Account: {props.accountName}?</h3> <DangerButton onClick={() => props.onConfirm(props.accountName)} >Yep</DangerButton> <button onClick={props.onCancel}>Cancel</button> </div>);

<DeleteAccount accountName=”Billy Bob (Google)” onConfirm={ _handleDeleteAccountConfirmation } onCancel={ _handleDeleteAccountCancellation }/>

Page 24: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

REACT COMPONENT

const DeleteAccount = (props) => ( <div> <h3>Delete The Account: {props.accountName}?</h3> <DangerButton onClick={() => props.onConfirm(props.accountName)} >Yep</DangerButton> <button onClick={props.onCancel}>Cancel</button> </div>);

Page 25: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

KEEP IT SIMPLE:PREDICTABLE DATA FLOW

Page 26: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

http://www.wikihow.com/Image:Make-Spaghetti-Step-1.jpg

KEEP IT SIMPLE:PREDICTABLE DATA FLOW

Page 27: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

https://flic.kr/p/7eRnDohttp://www.wikihow.com/Image:Make-Spaghetti-Step-1.jpg

KEEP IT SIMPLE:PREDICTABLE DATA FLOW

Page 28: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

PUB-SUB SPAGHETTI

Page 29: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

PUB-SUB SPAGHETTI

Page 30: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

PUB-SUB SPAGHETTI

Page 31: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

https://flic.kr/p/aUFGsT

UNIDIRECTIONAL DATA FLOW

Page 32: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

UNIDIRECTIONAL DATA FLOW

Component

Page 33: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

UNIDIRECTIONAL DATA FLOW

ComponentStore

Page 34: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

UNIDIRECTIONAL DATA FLOW

Action

Store Component

Page 35: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

UNIDIRECTIONAL DATA FLOW

Processor

Action

Store Component

Page 36: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

REDUX

Reducers

Action

State Tree Component

Page 37: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

REDUX

Reducers

Action

State Tree DeleteAccount

AccountList

Page 38: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

REDUX

Reducers

Action

State Tree

{ accounts: [“facebook”, “google”], session: { isSignedIn: true } }

DeleteAccount

AccountList

Page 39: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

REDUX

Reducers

Action

State Tree

{ accounts: [“facebook”, “google”], session: { isSignedIn: true } }

DeleteAccount

AccountList

{ type: “DELETE_ACCOUNT”, payload: “google”}

Page 40: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

REDUX

Reducers

Action

State Tree

{ accounts: [“facebook”, “google”], session: { isSignedIn: true } }

DeleteAccount

AccountList

{ type: “DELETE_ACCOUNT”, payload: “google”}

function accounts(state, action) {…}

Page 41: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

REDUX

Reducers

Action

State Tree

{ accounts: [“facebook”], session: { isSignedIn: true } }

DeleteAccount

AccountList

{ type: “DELETE_ACCOUNT”, payload: “google”}

function accounts(state, action) {…}

Page 42: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

REDUCERfunction accounts(state, action) {

switch (action.type) {

case DELETE_ACCOUNT:

const accountToDelete = action.payload;

const accounts

= state.accounts

.filter(account => account !== accountToDelete);

return Object.assign({}, state, { accounts });

default:

return state

}

}

Page 43: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

The Problem

KEEP IT SIMPLE:CAREFREE RENDERING

Page 44: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

KEEP IT SIMPLE:CAREFREE RENDERING

<ul>

<li>Billy Bob (Google)</li>

<li>Mary Sue (Facebook)</li>

</ul>

Page 45: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

KEEP IT SIMPLE:CAREFREE RENDERING

<ul>

<li>Billy Bob (Google)</li>

<li>Mary Sue (Facebook)</li>

</ul>

<li>Jon Smith (Twitter)</li>

Page 46: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

KEEP IT SIMPLE:CAREFREE RENDERINGconst jon = document.createElement("li");

jon.innerText = "Jon Smith (Twitter)";

Page 47: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

KEEP IT SIMPLE:CAREFREE RENDERINGconst jon = document.createElement("li");

jon.innerText = "Jon Smith (Twitter)";

const mary = document.getElementsByTagName("li")[1];

Page 48: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

KEEP IT SIMPLE:CAREFREE RENDERINGconst jon = document.createElement("li");

jon.innerText = "Jon Smith (Twitter)";

const mary = document.getElementsByTagName("li")[1];

const list = mary.parentNode;

list.insertBefore(jon, mary);

Page 49: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

KEEP IT SIMPLE:CAREFREE RENDERINGconst jon = document.createElement("li");

jon.innerText = "Jon Smith (Twitter)";

const mary = document.getElementsByTagName("li")[1];

const list = mary.parentNode;

list.insertBefore(jon, mary);

const billy = document.getElementsByTagName("li")[0];

billy.remove();

Page 50: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

The Ideal:Just Render Everything All The Time

KEEP IT SIMPLE:CAREFREE RENDERING

Page 51: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

KEEP IT SIMPLE:CAREFREE RENDERING

React’s Solution:Abstract Away The DOM

Page 52: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

KEEP IT SIMPLE:CAREFREE RENDERING

Browser (Real) DOM<ul>

<li>Billy Bob (Google)</li>

<li>Mary Sue (Facebook)</li>

</ul>

Virtual DOM<ul>

<li>John Smith (Twitter)</li>

<li>Mary Sue (Facebook)</li>

</ul>

Application State{

accounts: [

“John Smith (Twitter)”,

“Mary Sue (Facebook)”

]

}

Render Component

Page 53: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

KEEP IT SIMPLE:CAREFREE RENDERING

Browser (Real) DOM<ul>

<li>Billy Bob (Google)</li>

<li>Mary Sue (Facebook)</li>

</ul>

Virtual DOM<ul>

<li>John Smith (Twitter)</li>

<li>Mary Sue (Facebook)</li>

</ul>

Application State{

accounts: [

“John Smith (Twitter)”,

“Mary Sue (Facebook)”

]

}

Calculate Diff

Page 54: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

KEEP IT SIMPLE:CAREFREE RENDERING

Browser (Real) DOM<ul>

<li>Billy Bob (Google)</li>

<li>Mary Sue (Facebook)</li>

</ul>

Virtual DOM<ul>

<li>John Smith (Twitter)</li>

<li>Mary Sue (Facebook)</li>

</ul>

Application State{

accounts: [

“John Smith (Twitter)”,

“Mary Sue (Facebook)”

]

}

replaceAttribute textContent ‘Jon Smith (Twitter)’

Apply Patch

Page 55: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

KEEP IT SIMPLE:CAREFREE RENDERING

Browser (Real) DOM<ul>

<li>John Smith (Twitter)</li>

<li>Mary Sue (Facebook)</li>

</ul>

Virtual DOM<ul>

<li>John Smith (Twitter)</li>

<li>Mary Sue (Facebook)</li>

</ul>

Application State{

accounts: [

“John Smith (Twitter)”,

“Mary Sue (Facebook)”

]

}

Page 56: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

Developer Tools

https://flic.kr/p/bsY7V1

Page 57: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

HOT RELOADING

Page 58: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

HOT RELOADING

Page 59: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

HOT RELOADING

Page 60: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

REDUX LOGGER

Page 61: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

REDUX LOGGER

Page 62: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

REDUX DEBUGGER

Page 63: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

REDUX DEBUGGER

Page 64: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

REACT DEV TOOL

Page 65: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

Thank you!

Tony Tsui

@[email protected]

Page 66: Keeping Front-end Development Simple with React · Keeping Front-end Development Simple with React Tony Tsui @tony_tsui

Assembly Required