react-mobx-fundamentals-beginner__increment-decrement
Mobx + React – Simple counter principle (class + decorator + stateless function)
File Structures
src/
├── index.js (Entry file, for client/browser)
├── App-simple.js (React component - Stateless)
└── App.js (React component)
Installation And Test
Step 1. First, using an absolute path into your app folder directory.
$ cd /{your_directory}/react-mobx-fundamentals-beginner__increment-decrement
Step 2. Before doing all dev stuff make sure you have Node 14+ installed. After that, run the following code in the main directory to install the node module dependencies.
$ sudo npm install
Step 3. Run this project with create-react-app
$ npm run start
Step 4. When you done, this will spin up a server that can be accessed at
http://localhost:3000
index.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
//store
import { makeObservable, observable, computed, action } from 'mobx';
class oneStore {
  count = 0;
  constructor() {
    makeObservable(this, {
      count: observable,
      isNegative: computed,
      increase: action,
      decrease: action
    });
  }
  get isNegative() {
    return this.count < 0 ? 'Yes' : 'No';
  }
  increase() {
    this.count += 1;
  }
  decrease() {
    this.count -= 1;
  }
}
//
const store = new oneStore();
ReactDOM.render(
  <React.StrictMode>
      <App myCounter={store}/>
  </React.StrictMode>,
  document.getElementById('root')
)
The decorator syntax can be written as:
import {observable, computed} from "mobx";
class oneStore {
    @observable count = 0;
    constructor(count) {
        this.count = count;
    }
    @computed get isNegative() {
        return this.count < 0 ? 'Yes' : 'No';
    }
}
Use decorate to import:
import {decorate, observable, computed} from "mobx";
class oneStore {
    count = 0;
    constructor(count) {
        this.count = count;
    }
    get isNegative() {
        return this.count < 0 ? 'Yes' : 'No';
    }
}
decorate(oneStore, {
    count: observable,
    isNegative: computed
})
App.js
import React, { Component } from 'react';
import { observer } from 'mobx-react';
class App extends Component {
	render() {
		const myCounter = this.props.myCounter;
		return (
			<React.Fragment>
				Count: {myCounter.count}  <hr />
				Is negative? {myCounter.isNegative}
				<hr />
				<button onClick={myCounter.increase.bind(myCounter)}>Add</button>
				<button onClick={myCounter.decrease.bind(myCounter)}>Subtract</button>
			</React.Fragment>
		);
	}
}
observer(App);
export default observer(App);
The decorator syntax can be written as:
import React, { Component } from 'react';
import { observer } from 'mobx-react';
@observer
class App extends Component {
	render() {
		const myCounter = this.props.myCounter;
		return (
			<React.Fragment>
				Count: {myCounter.count}  <hr />
				Is negative? {myCounter.isNegative}
				<hr />
				<button onClick={myCounter.increase.bind(myCounter)}>Add</button>
				<button onClick={myCounter.decrease.bind(myCounter)}>Subtract</button>
			</React.Fragment>
		);
	}
}
export default App;
App-simple.js (Stateless)
import React from 'react';
import { observer } from 'mobx-react';
const App = observer( (props) => {
	const {myCounter} = props;
	return (
		<React.Fragment>
		  Count: {myCounter.count}  <hr />
	  
		  Is negative? {myCounter.isNegative}
	  
		  <hr />
	  
		  <button onClick={myCounter.increase.bind(myCounter)}>Add</button>
		  <button onClick={myCounter.decrease.bind(myCounter)}>Subtract</button>
		</React.Fragment>
	  )
});
export default App;
 
             
             
             
            