自 1.2.0-beta.1 開(kāi)始支持
MobX 為復(fù)雜項(xiàng)目中狀態(tài)管理提供了一種簡(jiǎn)單高效的機(jī)制;Taro 提供了 @tarojs/mobx 來(lái)讓開(kāi)發(fā)人員在使用 MobX 的過(guò)程中獲得更加良好的開(kāi)發(fā)體驗(yàn)。
$ yarn add mobx@4.8.0 @tarojs/mobx @tarojs/mobx-h5 @tarojs/mobx-rn
# 或者使用 npm
$ npm install --save mobx@4.8.0 @tarojs/mobx @tarojs/mobx-h5 @tarojs/mobx-rn
Mobx 異常監(jiān)聽(tīng)。
import { onError } from '@tarojs/mobx'
onError(error => {
console.log('mobx global error listener:', error)
})
自 1.3.6 開(kāi)始支持
判斷是否開(kāi)啟了服務(wù)端渲染(該狀態(tài)為全局狀態(tài))。
import { isUsingStaticRendering } from '@tarojs/mobx'
if (isUsingStaticRendering()) {
//...
}
自 1.3.6 開(kāi)始支持
服務(wù)端渲染狀態(tài)設(shè)置(該狀態(tài)為全局狀態(tài))。
import { useStaticRendering } from '@tarojs/mobx'
useStaticRendering(false)
自 1.3.6 開(kāi)始支持
將對(duì)象轉(zhuǎn)換為 observable 對(duì)象,其中 getter 會(huì)被轉(zhuǎn)換為 computed 屬性,方法會(huì)與 store 進(jìn)行綁定并自動(dòng)執(zhí)行 mobx transactions,比如:
import Taro from '@tarojs/taro'
import { View, Text, Button } from '@tarojs/components'
import { useLocalStore, observer } from '@tarojs/mobx'
import './index.scss'
function Index() {
const store = useLocalStore(() => ({
counter: 0,
increment() {
store.counter++
},
decrement() {
store.counter--
},
incrementAsync() {
setTimeout(() => store.counter++, 1000)
}
}))
const { counter, increment, decrement, incrementAsync } = store;
return (
<View>
<Button onClick={increment}>+</Button>
<Button onClick={decrement}>-</Button>
<Button onClick={incrementAsync}>Add Async</Button>
<Text>{counter}</Text>
</View>
)
}
export default observer(Index)
自 1.3.6 開(kāi)始支持
與 useLocalStore 的區(qū)別是,它將純(不包含 getter 或方法)對(duì)象轉(zhuǎn)換為 observable,主要使用場(chǎng)景為:
將組件設(shè)置為監(jiān)聽(tīng)者,以便在可觀察對(duì)象的值改變后觸發(fā)頁(yè)面的重新渲染。
注:
全局 store 設(shè)置,比如:
import Taro, { Component } from '@tarojs/taro'
import { Provider } from '@tarojs/mobx'
import Index from './pages/index'
import counterStore from './store/counter'
const store = {
counterStore
}
class App extends Component {
config = {
pages: [
'pages/index/index'
],
window: {
backgroundTextStyle: 'light',
navigationBarBackgroundColor: '#fff',
navigationBarTitleText: 'WeChat',
navigationBarTextStyle: 'black'
}
}
render () {
return (
<Provider store={store}>
<Index />
</Provider>
)
}
}
Taro.render(<App />, document.getElementById('app'))
注:
將 Provider 中設(shè)置的 store 提取到組件的 props 中,該 API 只適用于類組件,比如:
import Taro, { Component } from '@tarojs/taro'
import { observer, inject } from '@tarojs/mobx'
import './index.scss'
@inject('counterStore')
@observer
class Index extends Component {
//...
}
export default Index
或
import Taro, { Component } from '@tarojs/taro'
import { observer, inject } from '@tarojs/mobx'
import './index.scss'
@inject((stores, props) => ({
counterStore: stores.counterStore
}))
@observer
class Index extends Component {
//...
}
export default Index
注:
自 1.3.6 開(kāi)始支持
@tarojs/mobx 提供了以下 PropTypes 來(lái)驗(yàn)證 Mobx 的結(jié)構(gòu):
更多建議: