RN + MobX + react hook

  • 安裝 MobX
  • 單個(gè)頁(yè)面內(nèi)部使用mobx
  • 全局使用mobx(Provider) (沒(méi)有找到解決數(shù)據(jù)持久化的辦法,即類似redux-persist)
  • 網(wǎng)絡(luò)請(qǐng)求Promise返回?cái)?shù)據(jù)修改

更加詳細(xì)請(qǐng)查看官方文檔
https://mobx.js.org/README.html
https://github.com/mobxjs/mobx-react
https://mobx-react.js.org/observer-hoc
https://github.com/mobxjs/mobx-react-lite

安裝 MobX

npm install --save-dev @babel/plugin-proposal-decorators
npm install mobx-react --save
npm install mobx --save

當(dāng)前版本
"mobx": "^6.1.8",
"mobx-react": "^7.1.0",
設(shè)置 babel.config.js
plugins: [
    'react-native-reanimated/plugin',
    ["@babel/plugin-proposal-decorators", { "legacy": true }],  <-----add
  ],

單個(gè)頁(yè)面內(nèi)部使用mobx

第一種方式 observer

??推薦此種方式
方法組件使用observer包裹
observer<P>(baseComponent: FunctionComponent<P>): FunctionComponent<P>

import {observer, useLocalObservable, Observer, useObserver} from 'mobx-react'

export default Home = observer(({ route, navigation })=>{
  
  const homeStore = useLocalObservable(() => ({
    address: '北京',
    isFriend: false,
    toDoList: [],
    bannerList: [],
    changeFiend(isF) {
      this.isFriend = isF
    },
    get friendMsg(){
      return this.isFriend ? '好朋友' : '陌生人'
    }
  }))

  const onGoodFriend = React.useCallback(()=>{
    homeStore.changeFiend(true)
  })

  const onStranger = React.useCallback(()=>{
    homeStore.changeFiend(false)
  })
  
  return (
    <View style={styles.mainView}>
      <View style={{marginBottom:100}}>
        <Text>mobx數(shù)據(jù)測(cè)試:</Text>
        <Text>{homeStore.address}</Text>
        <Text>你們是:{homeStore.friendMsg}</Text>
        <View style={{flexDirection:'row',justifyContent:'center'}}>
          <TouchableOpacity style={styles.btn} onPress={onGoodFriend}>
            <Text>好朋友</Text>
          </TouchableOpacity>
          <TouchableOpacity style={styles.btn} onPress={onStranger}>
            <Text>陌生人</Text>
          </TouchableOpacity>
        </View>
      </View>
      <Text>Home</Text>
    </View>
  );
})

第二種方式 <Observer>

使用Observer包裹的會(huì)自動(dòng)改變唆樊,而外部的不會(huì)

<Observer>{renderFn}</Observer>
import {observer, useLocalObservable, Observer, useObserver} from 'mobx-react'

export default Chat=({ route, navigation })=>{

  const chatStore = useLocalObservable(() => ({
    chatName: '張三',
    changeChatName(name) {
      this.chatName = name
    },
  }))

  const onChangeChatName = React.useCallback(()=>{
    chatStore.changeChatName('李四')
  })

  return (
    <View style={styles.mainView}>
      <Text>外部數(shù)據(jù){chatStore.chatName}</Text>
      <Observer>
        {
          ()=>{
            return <View>
              <Text>內(nèi)部數(shù)據(jù):{chatStore.chatName}</Text>
              <TouchableOpacity style={{marginTop:15}} onPress={onChangeChatName}>
                <Text>點(diǎn)擊修改</Text>
              </TouchableOpacity>
            </View>
          }
        }
      </Observer>
      <Text>Chat</Text>
    </View>
  );
};

第三種方式 useObserver

return 的組件使用 useObserver包裹
????????[mobx-react-lite] 'useObserver(fn)' is deprecated. Use<Observer>{fn}</Observer>instead, or wrap the entire component inobserver.


import {observer, useLocalObservable, Observer, useObserver} from 'mobx-react'

export default Contact=({ route, navigation })=>{

  const contactStore = useLocalObservable(() => ({
    chatName: '張三',
    changeChatName(name) {
      this.chatName = name
    },
  }))

  const onChangeChatName = React.useCallback(()=>{
    contactStore.changeChatName('李四')
  })

  return useObserver(()=>{
    return <View style={styles.mainView}>
      <Text>{contactStore.chatName}</Text>
      <TouchableOpacity style={{marginTop:15}} onPress={onChangeChatName}>
        <Text>點(diǎn)擊修改</Text>
      </TouchableOpacity>
    <Text>Contact</Text>
  </View>
  })
};

全局使用mobx (沒(méi)有找到解決數(shù)據(jù)持久化的辦法芭梯,即類似redux-persist)
提前了解:http://react.caibaojian.com.cn/docs/context.html
??:可以打開(kāi)app就調(diào)用用戶信息接口杏慰,然后更新userInfo

程序入口APP.js

import { observable } from 'mobx';

const userInfo = observable({
  name: "胡桃",
  jobTitle:'往生堂堂主',
  changeName(name){
    this.name = name
  },
  changeJobTitle(title){
    this.jobTitle = title
  },
})

const globalInfo = observable({
  udid: "1234567890",
  changeUDID(udid){
    this.udid = udid
  },
})

export default App=()=>{
  console.log('App');
    return (
      <Provider userInfo={userInfo} globalInfo={globalInfo}>
        <NavigationContainer>
          <DrawerNavigator/>
        </NavigationContainer>
      </Provider>
  );
};

其他頁(yè)面使用前的準(zhǔn)備
需要先獲取Provider傳遞的數(shù)據(jù)

import { MobXProviderContext} from 'mobx-react'
// 這里return的就是 {userInfo, globalInfo}
export const useStores=()=> {
  return React.useContext(MobXProviderContext)
}

然后其他頁(yè)面就可以通過(guò) 調(diào)用useStores來(lái)獲取相應(yīng)的數(shù)據(jù)
?? 使用observer包裹才會(huì)實(shí)時(shí)刷新留储,設(shè)置同樣的數(shù)據(jù)不會(huì)刷新

import {observer } from 'mobx-react'
import {action} from 'mobx'

export default Mine=observer(({ route, navigation })=>{
 console.log('Mine');
 const {userInfo,globalInfo} = useStores()

 const onChangeUserInfo=React.useCallback(()=>{
   userInfo.changeName('琴')
   userInfo.changeJobTitle('西風(fēng)騎士團(tuán)代理團(tuán)長(zhǎng)')
 })
 const onChangeUserName=React.useCallback(action(()=>{
   userInfo.sex = '女' // 增加新的字段
 }))

 const onChangeUDID=React.useCallback(()=>{
   globalInfo.changeUDID('qwer')
 })


 return (
   <View style={styles.mainView}>
     <View style={{marginBottom:200}}>
       <Text>用戶信息</Text>
       <Text>姓名:{userInfo.name}{userInfo.sex}</Text>
       <Text>職位:{userInfo.jobTitle}</Text>
       <Text>UDID:{globalInfo.udid}</Text>
       <TouchableOpacity style={styles.btn} onPress={onChangeUserInfo}>
         <Text>修改用戶</Text>
       </TouchableOpacity>
       <TouchableOpacity style={styles.btn} onPress={onChangeUserName}>
         <Text>修改用戶-增加新的屬性</Text>
       </TouchableOpacity>
       <TouchableOpacity style={styles.btn} onPress={onChangeUDID}>
         <Text>修改UIDI</Text>
       </TouchableOpacity>
     </View>
     <Text>Mine</Text>
   </View>
 );
})

網(wǎng)絡(luò)請(qǐng)求Promise返回?cái)?shù)據(jù)修改

const HttpFetch = ()=>{
  return new Promise((resolve,reject)=>{
    setTimeout(() => {
      resolve('從網(wǎng)絡(luò)返回的數(shù)據(jù)')
    }, 3000);
  })
}

const homeStore = useLocalObservable(() => ({
    httpResult:'',
    getFetchResult(){
      HttpFetch().then(action((result)=>{
        this.httpResult = result
      }))
    }
  }))
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末七嫌,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子店煞,更是在濱河造成了極大的恐慌蟹演,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件顷蟀,死亡現(xiàn)場(chǎng)離奇詭異酒请,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)鸣个,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)羞反,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人囤萤,你說(shuō)我怎么就攤上這事昼窗。” “怎么了涛舍?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵澄惊,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我富雅,道長(zhǎng)掸驱,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任没佑,我火速辦了婚禮毕贼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蛤奢。我一直安慰自己鬼癣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布远剩。 她就那樣靜靜地躺著扣溺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瓜晤。 梳的紋絲不亂的頭發(fā)上锥余,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音痢掠,去河邊找鬼驱犹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛足画,可吹牛的內(nèi)容都是我干的雄驹。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼淹辞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼医舆!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蔬将,失蹤者是張志新(化名)和其女友劉穎爷速,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體霞怀,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惫东,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了毙石。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片廉沮。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖徐矩,靈堂內(nèi)的尸體忽然破棺而出滞时,到底是詐尸還是另有隱情,我是刑警寧澤丧蘸,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布漂洋,位于F島的核電站,受9級(jí)特大地震影響力喷,放射性物質(zhì)發(fā)生泄漏刽漂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一弟孟、第九天 我趴在偏房一處隱蔽的房頂上張望贝咙。 院中可真熱鬧,春花似錦拂募、人聲如沸庭猩。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蔼水。三九已至,卻和暖如春录肯,著一層夾襖步出監(jiān)牢的瞬間趴腋,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工论咏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留优炬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓厅贪,卻偏偏與公主長(zhǎng)得像蠢护,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子养涮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容