1、安裝
1 $ yarn add mobx mobx-react
2、新建store/index.js,存放數據(以下思路僅限於父子組件的簡單應用)
注意:這里暫時沒使用裝飾器@observable,裝飾器和全局數據見下一節
1 import { observable, action } from 'mobx' 2
// 觀察器(狀態) 3 const appState = observable({ 4 timer: 100 5 })
// 方法 6 appState.resetTimer = action(() => { 7 appState.timer = 0 8 }) 9 // 方法 10 appState.increase = action(() => { 11 console.log('increase') 12 appState.timer += 1; 13 }) 14 15 export default appState;
3、回到根組件(父組件)App,引入appState並傳入屬性
1 import React from 'react'; 2 import appState from './store'; // 添加 3 import TodoList from "./components/TodoList"; 4 5 export default class App extends React.Component { 6 render() { 7 return ( 8 <div className='app'> 9 <Child appState={appState}/> // 添加 10 </div> 11 ) 12 } 13 }
4、切換到子組件
1 import React, {Component} from 'react'; 2 import { observer } from 'mobx-react'; 3 4 class Child extends Component { 5 6 constructor(props) { 7 super(props); 8 } 9 // 該綁定方式屬於ES7,需要安裝babel-preset-stage-2, 並添加到.babelrc中 10 _resetTimer = ()=> { 11 this.props.appState.resetTimer() // 對應appState中action的resetTimer方法 12 } 13 _increase = () => { 14 this.props.appState.increase() // 對應appState中action的increase方法 15 } 16 render() { 17 return ( 18 <div> 19 <h2>Child Component</h2> 20 <p>{this.props.appState.timer}</p> 21 <button onClick={this._resetTimer}>復位</button> 22 <button onClick={this._increase}>增加</button> 23 </div> 24 ); 25 } 26 } 27 28 export default observer(Child); // 非裝飾器的普通方式, 將組件傳入observer觀察器中,否則store接受不到組件的事件
以上是Mobx最簡單的使用方法,官方推薦使用裝飾器模式。Mobx就類似Vuex, 需要state和action即可完成一個簡單的狀態管理
大概思路:
1 . 在store中聲明狀態(state)和方法(action) 分別使用Mobx的observer和action封裝
2. 在父組件中導入state並屬性傳給子組件
3 .子組件通過props接收state, 在自定義的方法中調用store的方法,使store內的方法去改變state的值