Redux vs MobX
Component in plain React
class Movie extends Component {
constructor(props) {
super(props)
this.state = { favorite: false }
}
like() {
this.setState({favorite: true})
}
render() {
return (
<div className='movie'>
<h3>{this.props.movie.title}</h3>
{this.state.favorite ?
<p>It is your favorite movie!</p>
:
<button onClick={this.like.bind(this)}>Favorite this movie</button>
}
</div>
)
}
}
export default MovieComponent with Redux
class Movie extends Component {
render() {
return (
<div className='movie'>
<h3>{this.props.movie.title}</h3>
{this.props.favorite ?
<p>It is your favorite movie!</p>
:
<button onClick={MovieActions.like}>
Favorite this movie
</button>
}
</div>
)
}
}
function mapStateToProps(state) {
return { movie: state.movie, favorite: state.favorite };
}
function mapDispatchToProps(dispatch) {
return bindActionCreators(MovieActions, dispatch);
}
export default connect(mapStateToProps, mapDispatchToProps)(Movie);Store
function (initialState) {
return createStore(
combineReducers({ movie: movieReducer }),
initialState,
window.devToolsExtension && window.devToolsExtension()
);
}Reducer
const update = (state, mutations) =>
Object.assign({}, state, mutations);
function (state = {}, action) {
switch (action.type) {
case 'movie/like':
return update(state, { favorite: true });
default:
return state;
}
}
Action
function play(video) {
return { type: 'movie/like' };
}Component with Mobx
@inject('store')
@observer
class Movie extends Component {
render() {
const store = this.props.store
return (
<div className='movie'>
<h3>{store.movie.title}</h3>
{store.favorite ?
<p>It is your favorite movie!</p>
:
<button onClick={store.like}>Favorite this movie</button>
}
</div>
)
}
}
export default MovieStore
class MovieStore {
movie = {}
@observable favorite = false
@action like() {
this.favorite = favorite
}
}
const movieStore = new MovieStore()
export default movieStoreRedux
- single store
- FP paradigm
- immutable
- pure
- explicit update logic
- plain JavaScript
- more boilerplate
- normalized state
- flat state
MobX
- multiple stores
- OOP&RP paradigms
- mutable
- impure
- implicit update logic
- “magic” JavaScript
- less boilerplate
- denormalized state
- nested state
from: https://www.robinwieruch.de/redux-mobx-confusion/
Redux vs Mobx
By Maciek Walusiak
Redux vs Mobx
- 98