KEMBAR78
Mobx - performance and sanity | PDF
MobX -
Performance and Sanity
RECORD SCREEN
Adam Klein
CTO @ 500Tech
https://www.meetup.com/Angular-IL
Taking the state out of
components
Items Filter
Checkbox
List
Filter
Add New
Selected
Items
Remove
Item
Input
Selected
Item
App
State
Components
State
Easy as pie
import service from ‘myService’;
// call service.action()
// use service.state
Problem Solved!
toggle item
Selected Items Master Checkbox
toggle master
Filtered Items
add item change filter
Imperative
Declarative
Declarative
<div *ngFor="let item of state.filteredItems”>

{{ item.title }}

</div>
Declarative
<div *ngFor="let item of state.getFilteredItems()">

{{ item.title }}

</div>

getFilteredItems() {

const regexp = new RegExp(this.filter, 'i');



return this.items
.filter((item) => regexp.test(item.name));

}
Declarative
getFilteredItems() {

const regexp = new RegExp(this.filter, 'i');



return this.items
.filter((item) => regexp.test(item.name));

}
Declarative
The ideal state
Memoizes derived values
Selectively Update UI
React to changes
The ideal state
Memoizes derived values
Selectively Update UI
React to changes
The ideal state
Memoizes derived values
Selectively Update UI
React to changes
MobX
MobX
Michel Weststrate from Mendix
Michel Weststrate from Mendix
React + Angular connectors
MobX
Michel Weststrate from Mendix
React + Angular connectors
Automagically react to changes
MobX
Michel Weststrate from Mendix
React + Angular connectors
Automagically react to changes
Works with plain objects
MobX
Michel Weststrate from Mendix
React + Angular connectors
Automagically react to changes
Works with plain objects
MobX
List of
Frameworks
Selected
Items
Filter
Master
Checkbox
Filtered
Items
Selected Items Filter ComponentUI Components
Store
Observables Computed Values
Reactions
FriendsMessages
News FeedTopbar
UI Components
Stores
Sidebar
Feed
Posts Comments


class Store {

filter = '';

items = [];

}
Store - it’s just a class!


class Store {

filter = '';

items = [];

}
ES6 + Class properties
import { observable } from 'mobx';

class Store {

@observable filter = '';

@observable items = [];

}
Observable
…
getFilteredItems() {

const regexp = new RegExp(this.filter, 'i');



return this.items
.filter((item) => regexp.test(item.name));

}
…
Derived State
import { computed } from 'mobx';

@computed get filteredItems() {

const regexp = new RegExp(this.filter, 'i');



return this.items
.filter((item) => regexp.test(item.name));

}
…
Computed
…
@computed get filteredItems() {

const regexp = new RegExp(this.filter, 'i');



return this.items
.filter((item) => regexp.test(item.name));

}
…
Figures dependencies automatically
…
setFilter(value) {

this.filter = value;

}

…
Action - it’s just setting a property
…
setFilter(value) {

this.filter = value;

}

…
Action
…
@action setFilter(value) {

this.filter = value;

}

…
Action
…
@action addItem(item) {

this.items.push(item);

}

…
Works with array methods
class Store {

@observable filter = '';

@observable items = [];

@computed get filteredItems() {

const regexp = new RegExp(this.filter, 'i');



return this.items.filter((item) => regexp.test(item.name));

}
@action setFilter(value) {

this.filter = value;

}

@action addItem(item) {

this.items.push(item);

}

}
autorun(() => {

const items = store.filteredItems;



renderItemsOnDOM(items);

});
Automatic Reaction
Update UI automatically
autorun(() => {

const items = store.filteredItems;



renderItemsOnDOM(items);

});
Connectors
mobx-react, mobx-angular
Automatically re-renders on changes
class TodoView extends React.Component {

render() {

return <div>{ store.filteredItems }</div>

}

}
mobx-react
https://github.com/mobxjs/mobx-react
@observer class TodoView extends React.Component {

render() {

return <div>{ store.filteredItems }</div>

}

}
mobx-react
https://github.com/mobxjs/mobx-react
<div>

{{ store.filteredItems }}
</div>
mobx-angular
https://github.com/mobxjs/mobx-angular
<div *mobxAutorun>

{{ store.filteredItems }}

</div>
mobx-angular
https://github.com/mobxjs/mobx-angular
<div mobx-autorun>

{{ store.filteredItems }}

</div>
ng-mobx for Angular1
https://github.com/NgMobx/ng1-mobx
MobX Redux
Plain objects
OOD
Immutable data
FP
Automatic Explicit
Computed values Using reselect
Multiple Stores Single Store
Use Async regularly Async is trouble
Complex library, Simple code Simple library, Complex code
Debugging methods
Spy
Explicit reactions
Compare function
And more…
There’s more to it…
slidehare.net/500tech
@adamklein500
Thank You
mobxjs.github.io/mobx/

Mobx - performance and sanity