react-native-mobx
Version:
Make your react native app reactive with MobX
101 lines (80 loc) • 2.33 kB
Markdown
# react-native-mobx
React Native Reactive programming using [RNRF](https://github.com/aksonov/react-native-router-flux) and [MobX](https://mobxjs.github.io/mobx/)
## What is it?
Thin wrapper around Mobx allows to use all power of reactive programming but leave your React Native Components 'framework free' i.e doesn't depend from MobX, Redux, etc.
## How to use it?
This component is just thin wrapper around [RNRF](https://github.com/aksonov/react-native-router-flux), so check its docs, install it and then install this module and import it instead of RNRF.
Example of reactive model counter:

Example.js:
```jsx
import React from 'react';
import {Router, Scene} from 'react-native-mobx';
// view and model for Counter scene
import Counter from './components/Counter';
import store from './model/counter';
export default () =>
<Router store={store}>
<Scene key="launch" component={Counter} hideNavBar/>
</Router>
```
counter.js (model)
```jsx
import {reaction, observable, observe, computed, autorun} from 'mobx';
import autobind from 'autobind-decorator'
@autobind
class CounterStore {
@observable counter = 0;
total = 0;
constructor(){
reaction(()=>this.counter, ()=>this.total++);
}
increase(){
this.counter++;
}
decrease(){
this.counter--;
}
}
export default new CounterStore();
```
Counter.js (view)
```jsx
import React from 'react';
import {
View,
Text,
TouchableOpacity,
StyleSheet
} from 'react-native';
import Button from 'react-native-button';
const Counter = ({store}) =>
<View style={styles.container}>
<Text style={styles.welcome}>
Welcome to React Native Reactive!
</Text>
<Text>Counter: {store.counter}</Text>
<Text>Total clicks: {store.total}</Text>
<Button onPress={store.increase}>+</Button>
<Button onPress={store.decrease}>-</Button>
</View>
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#F5FCFF',
},
welcome: {
fontSize: 20,
textAlign: 'center',
margin: 10,
},
instructions: {
textAlign: 'center',
color: '#333333',
marginBottom: 5,
},
});
export default Counter;
```