making react part of something greater

63
Making React part of something greater DARKO KUKOVEC JS TEAM LEAD @ INFINUM @DarkoKukovec

Upload: darko-kukovec

Post on 21-Jan-2017

206 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Making react part of something greater

Making React part of something greater

DARKO KUKOVECJS TEAM LEAD @ INFINUM@DarkoKukovec

Page 2: Making react part of something greater

WHAT AM I TALKING ABOUT?

• React

Page 3: Making react part of something greater

WHAT AM I TALKING ABOUT?

• React• React state management libs• Comparison of two libs

Page 4: Making react part of something greater

WHAT AM I TALKING ABOUT?

• React• React state management libs• Comparison of two libs

• Biased?

Page 5: Making react part of something greater

01REACT

Page 6: Making react part of something greater

REACT

• Facebook• Not a framework

Page 7: Making react part of something greater

REACT - THE WEIRD PARTS

• JSX?!?• Different way of thinking• Component state

Page 8: Making react part of something greater

REACT - THE GOOD PARTS

• Virtual DOM• Think about the end goal, not about the journey• You render the final state• React takes care of the actual changes• Efficient

Page 9: Making react part of something greater

REACT

• Component = View + UI State + Event handling

Source: https://medium.freecodecamp.com/is-mvc-dead-for-the-frontend-35b4d1fe39ec

Page 10: Making react part of something greater

02STATE MANAGEMENT

Page 11: Making react part of something greater

STATE MANAGEMENT

• React - Encapsulated UI Components• Application State & Business logic?

STATE MANAGEMENT

Source: https://medium.freecodecamp.com/is-mvc-dead-for-the-frontend-35b4d1fe39ec

Page 12: Making react part of something greater

DIY STATE MANAGEMENT

• OK for basic use cases?

• Model objects• Services

Page 13: Making react part of something greater

DIY STATE MANAGEMENT

• How to (efficiently) rerender component on data change?

• setState is tricky

Page 14: Making react part of something greater

DIY STATE MANAGEMENT

• How to (efficiently) rerender component on data change?

• setState is tricky

• Standards…

Source: https://xkcd.com/927/

Page 15: Making react part of something greater

MRC - MODEL-REACT-CONTROLLER

• e.g. Replace Backbone views with components• http://todomvc.com/examples/react-backbone/

• Backbone mutable by nature -> Bad for React perf• Legacy codebase?

Page 16: Making react part of something greater

FLUX

Page 17: Making react part of something greater

FLUX

• Facebook, 2014• Unidirectional architecture

• Data down, actions up

Page 18: Making react part of something greater

FLUX

• Data down, actions up

Source: http://fluxxor.com/what-is-flux.html

Page 19: Making react part of something greater

FLUX

• Data down, actions up

Source: http://fluxxor.com/what-is-flux.html

Page 20: Making react part of something greater

FLUX

• Store• Business logic + Application state• Only one allowed to change application state

• All actions synchronous• Async operations trigger actions on state change

Page 21: Making react part of something greater

REDUX

Page 22: Making react part of something greater

REDUX

• Single store (with nesting)• Application state• UI State

• Reducers• Business logic• Responsible for one part of the store

• Immutable state

Page 23: Making react part of something greater

REDUX

Source: https://www.theodo.fr/blog/2016/03/getting-started-with-react-redux-and-immutable-a-test-driven-tutorial-part-2/

Page 24: Making react part of something greater

REDUX

• Time travel

Page 25: Making react part of something greater

REDUX

• Time travel

Page 26: Making react part of something greater

REDUX

• Time travel• Redux Dev Tools

Source: https://github.com/gaearon/redux-devtools-dock-monitor

Page 27: Making react part of something greater

REDUX

• A lot of boilerplate code• Async actions very verbose

Page 28: Making react part of something greater

MOBX

Page 29: Making react part of something greater

MOBX

Actions

Observable

Observers

Computedvalues

Our state

Our components

Page 30: Making react part of something greater

MOBX - UPDATES

• Observers & computed values notified only on relevant changes• Topic for another talk

Page 31: Making react part of something greater

MOBX

• Faster than Redux• Redux - component render on (sub)store update• MobX - component render on specific property update

Page 32: Making react part of something greater

MOBX VS. REDUX PERFORMANCE

Source: https://twitter.com/mweststrate/status/718444275239882753

Page 33: Making react part of something greater

MOBX VS. REDUX PERFORMANCE

Source: https://twitter.com/mweststrate/status/718444275239882753

Time in ms

Page 34: Making react part of something greater

MOBX

• Decorators• @observable• @calculated• @action• etc.

• TypeScript or Babel• Not a requirement!

Page 35: Making react part of something greater

MORE ALTERNATIVES

Page 36: Making react part of something greater

RELAY

• Facebook• GraphQL - API query language

Page 37: Making react part of something greater

RXJS

• not intended for this• can mimic Redux

• “Observable states”

Page 38: Making react part of something greater

03REDUX VS. MOBX

Page 39: Making react part of something greater

REDUX VS. MOBX

Redux

Faster

Flexible

MobX

Bigger community

Better Dev Tools

Page 40: Making react part of something greater

REDUX VS. MOBX

Redux

Faster

Less boilerplate

Flexible

MobX

Bigger community

Better Dev Tools

Less magic

Source: https://twitter.com/phillip_webb/status/705909774001377280

Page 41: Making react part of something greater

EXAMPLE TIME!Conference app

Load & choose talks

Page 42: Making react part of something greater

Setup

Page 43: Making react part of something greater

// ApplicationStore.jsconst defaultState = {list: [], loading: false};

export default function(state = defaultState, action) {switch(action.type) {default:return state;

}}

ReduxInitial reducer setup

Page 44: Making react part of something greater

// TalkStore.jsimport {observable} from "mobx";

export const talks = observable({list: [],loading: false

});

MobXInitial observable setup

Page 45: Making react part of something greater

Load data

Page 46: Making react part of something greater

// MyComponent.jsdispatch(loadTalksAction());

// TalkActions.jsasync function loadTalksAction() {

dispatch({name: TALK_LIST_LOAD});const talks = await loadTalks();dispatch({name: TALK_LIST_LOADED, talks});

}

// TalkReducer.jscase TALK_LIST_LOAD:

return {...state, list: [], loading: true};case TALK_LIST_LOADED:

return {...state, list: action.talks, loading: true};

ReduxLoad a list of items (redux-thunk)

Page 47: Making react part of something greater

// MyComponent.jsloadTalksAction();

// TalkActions.jsasync function loadTalksAction() {

talks.loading = true;talks.list = await loadTalks();talks.loading = false;

}

MobXLoad a list of items

Page 48: Making react part of something greater

Modify data

Page 49: Making react part of something greater

// MyComponent.jsdispatch(selectTalkAction(this.props.talk));

// TalkActions.jsfunction selectTalkAction(talk) {

return {name: TALK_SELECT, talk.id};}

// TalkReducer.jscase TALK_SELECT:

return {...state,list: state.list.map((item) => {if (item.id === action.talk.id)return {...item, selected: true};

else return item;}),loading: false

};

ReduxChoose a talk

Page 50: Making react part of something greater

// MyComponent.jsselectTalkAction(this.props.talk);

// TalkActions.jsfunction selectTalkAction(talk) {

talk.selected = true;}

// TalkStore.jsimport {computed} from ’mobx’;

export const talks = observable({list: [],loading: false,@computed get selected() {return this.list.filter((item) => item.selected);

}});

MobXChoose a talk

Page 51: Making react part of something greater

MobX useStrict

Page 52: Making react part of something greater

import {useStrict} from "mobx";useStrict(true);

// In a random placefunction selectTalkAction(talk) {

talk.selected = true;}// [mobx] Invariant failed: It is not allowed to create or change state outside an `action` when MobX is in strict mode. Wrap the current method in `action` if this state change is intended

// TalkActions.js@action function selectTalkAction(talk) {

talk.selected = true;}

MobXuseStrict

Page 53: Making react part of something greater

04ENOUGH ABOUT MOBX,LET’S TALK ABOUT MOBX

Page 54: Making react part of something greater

MOBX DEVTOOLS

• 3 options• Redraws

Page 55: Making react part of something greater

MOBX DEVTOOLS

• 3 options• Redraws• Dependencies

Page 56: Making react part of something greater

MOBX DEVTOOLS

• 3 options• Redraws• Dependencies• Actions/reactions

Page 57: Making react part of something greater

RELATED PROJECTS

• React bindings• React Native bindings• Meteor bindings• Firebase• Routers, models, forms, loggers, etc.

Page 58: Making react part of something greater

<3 OPEN SOURCE

• https://github.com/infinum• react-mobx-translatable• mobx-keys-store• mobx-jsonapi-store

• mobx-form-store (soon)

Page 59: Making react part of something greater

RESOURCES

• http://mobxjs.github.io/mobx/• https://mobxjs.github.io/mobx/getting-started.html• https://medium.com/@mweststrate/object-observe-is-dead-long-

live-mobservable-observe-ad96930140c5• https://medium.com/@mweststrate/3-reasons-why-i-stopped-

using-react-setstate-ab73fc67a42e

Page 60: Making react part of something greater

SHOULD YOU USE MOBX?

Page 61: Making react part of something greater

IT DEPENDSTM

Page 62: Making react part of something greater

Thank [email protected]@DARKOKUKOVEC

Visit infinum.co or find us on social networks:

infinum.co infinumco infinumco infinum

JOIND.INjoind.in/talk/bdddfdarko.im

Page 63: Making react part of something greater

Any [email protected]@DARKOKUKOVEC

Visit infinum.co or find us on social networks:

infinum.co infinumco infinumco infinum

JOIND.INjoind.in/talk/bdddfdarko.im