State management in React-Native
Redux vs Mobx
Me?
Paolo Mosca
tw: @paolomoscaBCN
Startup Advisor
Business & Tech
Passionate in Mobile
Inline Skater
bla bla bla
YOU?
Some questions
- Who's using react-native? Professionally?
- Who knows what state management is?
- Who knows something about redux / mobx?
The Problem
Applications aggregate Components
Components have internal state accessible with this.state and setState(...)
Inside a component everything works fine
Connection between components can be complex
Sharing or mutating state between components
Uneeded re-render
Let's start the war
Make Love NOT War
Redux
- single-store
- immutable state
- funcional programming
- normalized state
- very strict architecture
- passive (event oriented)
MobX
- multi-store
- mutable state
- object oriented
- object state
- do what you want
- reactive (observable)
Redux
- more boilerplate
- exponencial learning curve
- follow the rules
- easily testable
- strong community
- tools
MobX
- linear learning curve
- lazy rules
- reactive (observable)
- magic
- community & tools
Comparison (pros and cons are relatives)
Best choice?
Redux over Mobx
- complex projects
- big teams
- very structured architectures
Mobx over Redux
- fast prototyping
- small teams
- good internal organization
You can always refactor from MobX to redux if needed
My personal advice
(why MobX?)
Start with Mobx
- object programming
- reactive
- less boilerplate
Go strict
- when your project / team is growing, force strict using @action @computed instead of direct mutation
React-Native
An app is a small project for definition.
If is not, maybe you're over-engineering.
Code Example - Redux way
const initialState = {
users: [
{
name: 'Paolo'
},
{
name: 'Dan'
}
]
};
// reducer
function users(state = initialState, action) {
switch (action.type) {
case 'USER_ADD':
return { ...state, users: [ ...state.users, action.user ] };
default:
return state;
}
}
// action
{ type: 'USER_ADD', user: user };
// somewhere in the app ...
dispatch({ type: 'USER_ADD', user: user });
Code Example - MobX way
class UserStore {
@observable users = [
{
name: 'Paolo'
},
{
name: 'Dan'
}
];
// if you want to go strict using @action
@action addUser = (user) => {
this.users.push(user);
}
}
//somewhere in the app
userStore.users.push(user);
// strict case
userStore.addUser(user);
Let's make our hands dirty
- Connecting to a "real" rest API
- Listing CoffeeShops
- Adding Likes
Thanks
resources related:
Redux or MobX: An attempt to dissolve the Confusion
http://bit.ly/2q88UkR
contact me: info@paomosca.com
MobX - Redux
By Paolo Mosca
MobX - Redux
Short comparative for state management in React-Native
- 401