108
Why React matters

Why react matters

Embed Size (px)

Citation preview

Page 1: Why react matters

Why React matters

Page 2: Why react matters

Credits: lifehack.org

Page 3: Why react matters
Page 4: Why react matters

ShihChi Huang

Page 5: Why react matters
Page 6: Why react matters
Page 7: Why react matters

learn oncewrite anywhere

Page 8: Why react matters
Page 9: Why react matters

web developer

Page 10: Why react matters

web developermobile developer

Page 11: Why react matters
Page 12: Why react matters
Page 13: Why react matters

What’s React

Page 14: Why react matters

A javascript library for building UI

Page 15: Why react matters

A javascript library for building UI

javascript

Page 16: Why react matters

A javascript library for building UI

javascript

UI

Page 17: Why react matters

var Greeting = React.createClass({ render() { return ( <p>{"HELLO " + this.props.name}</p> ); }});

<Greeting name="techplanet" />// HELLO techplanet

Page 18: Why react matters
Page 19: Why react matters

against best practices

worst technology ever*

ridicolousback

to 90sWTF

Page 20: Why react matters

against best practices

worst technology ever*

ridicolousback

to 90sWTF

Page 21: Why react matters

Credits: vjeux@

min(Time to Find Root Cause)

Page 22: Why react matters

M CV

Page 23: Why react matters

UNIX Philosophy

Page 24: Why react matters

do one thing and do it well

UNIX Philosophy

Page 25: Why react matters

do one thing and do it well

UNIX Philosophy

write programs to work together

Page 26: Why react matters

do one thing and do it well

UNIX Philosophy

write programs to work together

handle text streams

Page 27: Why react matters
Page 28: Why react matters

Separationof

Concerns

Page 29: Why react matters
Page 30: Why react matters
Page 31: Why react matters
Page 32: Why react matters

shouldComponentUpdate

Page 33: Why react matters

shouldComponentUpdate

render

true

Page 34: Why react matters

ES2015warm-up

Page 35: Why react matters

function hello() { return 'world';}

// arrow function var hello = () => { return 'world';}

var hello = () => ‘world';

Page 36: Why react matters

function hello() { return 'world';}

// arrow function var hello = () => { return 'world';}

var hello = () => ‘world';

function hello() { return 'world';}

// arrow function var hello = () => { return 'world';}

Page 37: Why react matters

function hello() { return 'world';}

// arrow function var hello = () => { return 'world';}

var hello = () => ‘world';

function hello() { return 'world';}

// arrow function var hello = () => { return 'world';}

// arrow function var hello = () => { return 'world';}

var hello = () => ‘world';

Page 38: Why react matters

var state = { foo: foo, bar: bar,}

Page 39: Why react matters

var state = { foo: foo, bar: bar,}

var state = { foo: foo, bar: bar,}

// enhanced object literalsvar state = {

};

Page 40: Why react matters

var state = { foo: foo, bar: bar,}

var state = { foo: foo, bar: bar,}

// enhanced object literalsvar state = {

};

var state = { foo: foo, bar: bar,}

// enhanced object literalsvar state = { foo,

};

Page 41: Why react matters

var state = { foo: foo, bar: bar,}

var state = { foo: foo, bar: bar,}

// enhanced object literalsvar state = {

};

var state = { foo: foo, bar: bar,}

// enhanced object literalsvar state = { foo,

};

var state = { foo: foo, bar: bar,}

// enhanced object literalsvar state = { foo, bar,};

Page 42: Why react matters

var Greet = React.createClass({ render() { return <div />; }});

// classclass Greet extends React.Component { render() { return <div />; }}

Page 43: Why react matters

var PropTypes = React.PropTypes;var Components = React.Components;

// destructuringvar { PropTypes, Component } = React;

Page 44: Why react matters

var PropTypes = React.PropTypes;var Components = React.Components;

// destructuringvar { PropTypes, Component } = React;

var PropTypes = React.PropTypes;var Components = React.Components;

// destructuringvar { PropTypes, Component } = React;

Page 45: Why react matters

var PropTypes = React.PropTypes;var Components = React.Components;

// destructuringvar { PropTypes, Component } = React;

var PropTypes = React.PropTypes;var Components = React.Components;

// destructuringvar { PropTypes, Component } = React;

var PropTypes = React.PropTypes;var Components = React.Components;

// destructuringvar { PropTypes, Component } = React;

Page 46: Why react matters

var todos = this.props.todos.map(todo => <TodoItem

/>});

Page 47: Why react matters

var todos = this.props.todos.map(todo => <TodoItem

/>});

var todos = this.props.todos.map(todo =><TodoItem

id={todo.id}

/>});

Page 48: Why react matters

var todos = this.props.todos.map(todo => <TodoItem

/>});

var todos = this.props.todos.map(todo =><TodoItem

id={todo.id}

/>});

var todos = this.props.todos.map(todo =><TodoItem

id={todo.id}content={todo.content}

/>});

Page 49: Why react matters

var todos = this.props.todos.map(todo => <TodoItem

/>});

var todos = this.props.todos.map(todo =><TodoItem

id={todo.id}

/>});

var todos = this.props.todos.map(todo =><TodoItem

id={todo.id}content={todo.content}

/>});

var todos = this.props.todos.map(todo =><TodoItem

id={todo.id}content={todo.content}isCompleted={todo.isCompleted}

/>});

Page 50: Why react matters

var todos = this.props.todos.map(todo => <TodoItem

/>});

var todos = this.props.todos.map(todo =><TodoItem

id={todo.id}

/>});

var todos = this.props.todos.map(todo =><TodoItem

id={todo.id}content={todo.content}

/>});

var todos = this.props.todos.map(todo =><TodoItem

id={todo.id}content={todo.content}isCompleted={todo.isCompleted}

/>});

var todos = this.props.todos.map(todo => <TodoItem id={todo.id} content={todo.content} isCompleted={todo.isCompleted} />});

// spread operatorvar todos = this.props.todos.map(todo => <TodoItem {...todo} />});

Page 51: Why react matters
Page 52: Why react matters

var data = {foo: 'bar',hello: 'world',answer: 42,

};

Page 53: Why react matters

var data = {foo: 'bar',hello: 'world',answer: 42,

};

var { foo, ...rest } = data;

Page 54: Why react matters

var data = {foo: 'bar',hello: 'world',answer: 42,

};

var { foo, ...rest } = data;

// rest{ hello: 'world', answer: 42}

Page 55: Why react matters

// arrow function var hello = () => ‘world’;

// enhanced object literalvar state = { foo, bar };

// destructuringvar { PropTypes, Component } = React;

// classclass Greet extends React.Component {}

// spread operator<TodoItem {...todo} />

Page 56: Why react matters

Are you still watchingthere?

Continue

Back

Page 57: Why react matters

UI = f(state)

Page 58: Why react matters

pure functionis a function where the return value is only determined by its input values

Page 59: Why react matters

// f(x) = x + 1;var increment = (x) => { return x + 1;}

// f(x) = 2^x * x^3 - x - 1;var complex = (x) => { return Math.pow(2, x) * Math.pow(x, 3) - x - 1;}

Page 60: Why react matters

pure functionis a function where the return value is only determined by its input valuesat any given time

Page 61: Why react matters

var counter = 0;

setInterval(() => counter++, 1000);

var timeVariant = (x) => { return x + counter;}

> timeVariant(3)> 4// after few seconds> timeVariant(3)> 7

Page 62: Why react matters

Predictable

Page 63: Why react matters

class TodoApp extends React.Component { render() { var { isLoaded, todos } = this.props; if (!isLoaded) { return <Spinner />; } if (!todos.length) { return <EmptyResult />; } return ( <TodoList> {this.props.todos.map(todo => { return <TodoItem {...todo} />; })} </TodoList> ); } }

Page 64: Why react matters

class TodoApp extends React.Component { render() { var { isLoaded, todos } = this.props; if (!isLoaded) { return <Spinner />; } if (!todos.length) { return <EmptyResult />; } return ( <TodoList> {this.props.todos.map(todo => { return <TodoItem {...todo} />; })} </TodoList> ); } }

class TodoApp extends React.Component { render() { var { isLoaded, todos } = this.props; if (!isLoaded) { return <Spinner />; } if (!todos.length) { return <EmptyResult />; } return ( <TodoList> {this.props.todos.map(todo => { return <TodoItem {...todo} />; })} </TodoList> ); } }

Page 65: Why react matters

class TodoApp extends React.Component { render() { var { isLoaded, todos } = this.props; if (!isLoaded) { return <Spinner />; } if (!todos.length) { return <EmptyResult />; } return ( <TodoList> {this.props.todos.map(todo => { return <TodoItem {...todo} />; })} </TodoList> ); } }

class TodoApp extends React.Component { render() { var { isLoaded, todos } = this.props; if (!isLoaded) { return <Spinner />; } if (!todos.length) { return <EmptyResult />; } return ( <TodoList> {this.props.todos.map(todo => { return <TodoItem {...todo} />; })} </TodoList> ); } }

class TodoApp extends React.Component { render() { var { isLoaded, todos } = this.props; if (!isLoaded) { return <Spinner />; } if (!todos.length) { return <EmptyResult />; } return ( <TodoList> {this.props.todos.map(todo => { return <TodoItem {...todo} />; })} </TodoList> ); } }

Page 66: Why react matters

class TodoApp extends React.Component { render() { var { isLoaded, todos } = this.props; if (!isLoaded) { return <Spinner />; } if (!todos.length) { return <EmptyResult />; } return ( <TodoList> {this.props.todos.map(todo => { return <TodoItem {...todo} />; })} </TodoList> ); } }

class TodoApp extends React.Component { render() { var { isLoaded, todos } = this.props; if (!isLoaded) { return <Spinner />; } if (!todos.length) { return <EmptyResult />; } return ( <TodoList> {this.props.todos.map(todo => { return <TodoItem {...todo} />; })} </TodoList> ); } }

class TodoApp extends React.Component { render() { var { isLoaded, todos } = this.props; if (!isLoaded) { return <Spinner />; } if (!todos.length) { return <EmptyResult />; } return ( <TodoList> {this.props.todos.map(todo => { return <TodoItem {...todo} />; })} </TodoList> ); } }

class TodoApp extends React.Component { render() { var { isLoaded, todos } = this.props; if (!isLoaded) { return <Spinner />; } if (!todos.length) { return <EmptyResult />; } return ( <TodoList> {this.props.todos.map(todo => { return <TodoItem {...todo} />; })} </TodoList> ); } }

Page 67: Why react matters

class TodoApp extends React.Component { render() { var { isLoaded, todos } = this.props; if (!isLoaded) { return <Spinner />; } if (!todos.length) { return <EmptyResult />; } return ( <TodoList> {this.props.todos.map(todo => { return <TodoItem {...todo} />; })} </TodoList> ); } }

class TodoApp extends React.Component { render() { var { isLoaded, todos } = this.props; if (!isLoaded) { return <Spinner />; } if (!todos.length) { return <EmptyResult />; } return ( <TodoList> {this.props.todos.map(todo => { return <TodoItem {...todo} />; })} </TodoList> ); } }

class TodoApp extends React.Component { render() { var { isLoaded, todos } = this.props; if (!isLoaded) { return <Spinner />; } if (!todos.length) { return <EmptyResult />; } return ( <TodoList> {this.props.todos.map(todo => { return <TodoItem {...todo} />; })} </TodoList> ); } }

class TodoApp extends React.Component { render() { var { isLoaded, todos } = this.props; if (!isLoaded) { return <Spinner />; } if (!todos.length) { return <EmptyResult />; } return ( <TodoList> {this.props.todos.map(todo => { return <TodoItem {...todo} />; })} </TodoList> ); } }

class TodoApp extends React.Component { render() { var { isLoaded, todos } = this.props; if (!isLoaded) { return <Spinner />; } if (!todos.length) { return <EmptyResult />; } return ( <TodoList> {this.props.todos.map(todo => { return <TodoItem {...todo} />; })} </TodoList> ); } }

Page 68: Why react matters
Page 69: Why react matters

UX

Page 70: Why react matters
Page 71: Why react matters

simple ≠ familiar

Page 73: Why react matters

scalable?

Page 74: Why react matters

View

Store Dispatcher

Action

Page 75: Why react matters

View

Store Dispatcher

Action

Page 76: Why react matters

Unidirectional

Page 77: Why react matters
Page 78: Why react matters

re-render whenever

state changes

Page 79: Why react matters

re-render whenever

state changes

re-render whenever

state changes

Page 80: Why react matters

computationintensive?

Page 81: Why react matters

Immutable!

Page 82: Why react matters

get a new valuewhenever make a change

Page 83: Why react matters

credits: David Nolen

Page 84: Why react matters

linked list

Page 85: Why react matters

X

linked list

Page 86: Why react matters

XY

linked list

Page 87: Why react matters

XY

Z

linked list

Page 88: Why react matters

XY

Z

structure sharing

linked list

Page 89: Why react matters

structure sharing

Page 90: Why react matters

structure sharing

• space efficiency

Page 91: Why react matters

structure sharing

• computation efficiency

• space efficiency

Page 92: Why react matters

class TodoItem extends React.Component { shouldComponentUpdate(nextProps, nextState) {

} render() { // ... }}

Page 93: Why react matters

class TodoItem extends React.Component { shouldComponentUpdate(nextProps, nextState) {

} render() { // ... }}

class TodoItem extends React.Component { shouldComponentUpdate(nextProps, nextState) { var { content, isCompleted } = this.props;

} render() { // ... }}

Page 94: Why react matters

class TodoItem extends React.Component { shouldComponentUpdate(nextProps, nextState) {

} render() { // ... }}

class TodoItem extends React.Component { shouldComponentUpdate(nextProps, nextState) { var { content, isCompleted } = this.props;

} render() { // ... }}

class TodoItem extends React.Component { shouldComponentUpdate(nextProps, nextState) { var { content, isCompleted } = this.props; return ( content !== nextProps.content && isCompleted !== nextProps.isCompleted ); } render() { // ... }}

Page 95: Why react matters

class TodoItem extends React.Component { shouldComponentUpdate(nextProps, nextState) {

} render() { // ... }}

class TodoItem extends React.Component { shouldComponentUpdate(nextProps, nextState) { var { content, isCompleted } = this.props;

} render() { // ... }}

class TodoItem extends React.Component { shouldComponentUpdate(nextProps, nextState) { var { content, isCompleted } = this.props; return ( content !== nextProps.content && isCompleted !== nextProps.isCompleted ); } render() { // ... }}

class TodoItem extends React.Component { shouldComponentUpdate(nextProps, nextState) { var { content, isCompleted } = this.props; return ( this.props === nextProps

); } render() { // ... }}

Page 96: Why react matters

class TodoItem extends React.Component { shouldComponentUpdate(nextProps, nextState) {

} render() { // ... }}

class TodoItem extends React.Component { shouldComponentUpdate(nextProps, nextState) { var { content, isCompleted } = this.props;

} render() { // ... }}

class TodoItem extends React.Component { shouldComponentUpdate(nextProps, nextState) { var { content, isCompleted } = this.props; return ( content !== nextProps.content && isCompleted !== nextProps.isCompleted ); } render() { // ... }}

class TodoItem extends React.Component { shouldComponentUpdate(nextProps, nextState) { var { content, isCompleted } = this.props; return ( this.props === nextProps

); } render() { // ... }}

Page 97: Why react matters

class TodoItem extends React.Component { shouldComponentUpdate(nextProps, nextState) {

} render() { // ... }}

class TodoItem extends React.Component { shouldComponentUpdate(nextProps, nextState) { var { content, isCompleted } = this.props;

} render() { // ... }}

class TodoItem extends React.Component { shouldComponentUpdate(nextProps, nextState) { var { content, isCompleted } = this.props; return ( content !== nextProps.content && isCompleted !== nextProps.isCompleted ); } render() { // ... }}

class TodoItem extends React.Component { shouldComponentUpdate(nextProps, nextState) { var { content, isCompleted } = this.props; return ( this.props === nextProps

); } render() { // ... }}

pros / nextProps are mutable and we can’t simply

compare it’s reference

Page 98: Why react matters

var Immutable = require('immutable');

Page 99: Why react matters

var Immutable = require('immutable');var Immutable = require('immutable');var todo = Immutable.Map({ content: 'say hello', isCompleted: false});

Page 100: Why react matters

var Immutable = require('immutable');var Immutable = require('immutable');var todo = Immutable.Map({ content: 'say hello', isCompleted: false});

var Immutable = require('immutable');var todo = Immutable.Map({ content: 'say hello', isCompleted: false});

var mutatedTodo = todo.set( “isCompleted”, true);

Page 101: Why react matters

var Immutable = require('immutable');var Immutable = require('immutable');var todo = Immutable.Map({ content: 'say hello', isCompleted: false});

var Immutable = require('immutable');var todo = Immutable.Map({ content: 'say hello', isCompleted: false});

var mutatedTodo = todo.set( “isCompleted”, true);

var Immutable = require('immutable');var todo = Immutable.Map({ content: 'say hello', isCompleted: false});

var mutatedTodo = todo.set( “isCompleted”, true);if (todo !== mutatedTodo) { console.log('changed!'); // > changed!}

Page 102: Why react matters

class TodoItem extends React.Component { shouldComponentUpdate(nextProps, nextState) {

return ( this.props === nextProps

); } render() { // ... }}

Page 103: Why react matters

class TodoItem extends React.Component { shouldComponentUpdate(nextProps, nextState) {

return ( this.props === nextProps

); } render() { // ... }}

Page 104: Why react matters

recap

Page 105: Why react matters

recap

• UI = f(state)

Page 106: Why react matters

recap

• Predictable

• UI = f(state)

Page 107: Why react matters

recap

• Predictable

• UI = f(state)

• Immutable

Page 108: Why react matters

<Questions />