精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

聊聊MobX 上手指南

開發(fā) 前端
之前用 Redux 比較多,一直聽說 Mobx 能讓你體驗到在 React 里面寫 Vue 的感覺,今天打算嘗試下 Mobx 是不是真的有寫 Vue 的感覺。

[[378343]]

之前用 Redux 比較多,一直聽說 Mobx 能讓你體驗到在 React 里面寫 Vue 的感覺,今天打算嘗試下 Mobx 是不是真的有寫 Vue 的感覺。

題外話

在介紹 MobX 的用法之前,先說點題外話,我們可以看一下 MobX 的中文簡介。在 MobX 的中文網(wǎng)站上寫著:

“MobX 是一個經(jīng)過戰(zhàn)火洗禮的庫,它通過透明的函數(shù)響應(yīng)式編程使得狀態(tài)管理變得簡單和可擴展。

數(shù)據(jù)流

“戰(zhàn)火洗禮的庫” 怎么看都感覺很奇怪,讀起來很拗口??,而且網(wǎng)上很多介紹 MobX 的文章都是這么寫的,在 github 翻閱其 README 發(fā)現(xiàn)寫的是:

“MobX is a battle tested library that makes state management simple and scalable by transparently applying functional reactive programming (TFRP).

可以看到作者原本要表達的意思是 MobX 是經(jīng)過了許多的測試,擁有比較強的健壯性。下面是通過谷歌翻譯的結(jié)果,看起來也比中文網(wǎng)的表達要準(zhǔn)確一些。

谷歌翻譯

雖然,我的英文水平也很菜,還是會盡量看官方的文檔,這樣可以避免一些不必要的誤解。

如何使用?

言歸正傳,MobX 現(xiàn)在的最新版是 6.0,這個版本的 API 相比于之前有了極大的簡化,可以說更加好用了。之前的版本是裝飾器風(fēng)格的語法糖,但是裝飾器在現(xiàn)在的 ES 規(guī)范中并不成熟,而且引入裝飾器語法也在增加打包后的代碼體積。綜合考慮后,MobX 6.0 取消了裝飾器語法的 API。

響應(yīng)式對象

MobX 通過 makeObservable 方法來構(gòu)造響應(yīng)式對象,傳入的對象屬性會通過 Proxy 代理,與 Vue 類似,在 6.0 版本之前使用的是 Object.defineProperty API,當(dāng)然 6.0 也提供了降級方案。

  1. import { configure, makeObservable, observable, action, computed } from 'mobx' 
  2.  
  3. // 使用該配置,可以將 Proxy 降級為 Object.defineProperty 
  4. configure({ useProxies: "never" }); 
  5.  
  6. // 構(gòu)造響應(yīng)對象 
  7. const store = makeObservable( 
  8.   // 需要代理的響應(yīng)對象 
  9.   { 
  10.     count: 0, 
  11.     get double() { 
  12.       return this.count * 2 
  13.     }, 
  14.     increment() { 
  15.       this.count += 1 
  16.     }, 
  17.     decrement() { 
  18.       this.count -= 1 
  19.     } 
  20.   }, 
  21.   // 對各個屬性進行包裝,用于標(biāo)記該屬性的作用 
  22.   { 
  23.     count: observable, // 需要跟蹤的響應(yīng)屬性 
  24.     double: computed,  // 計算屬性 
  25.     increment: action, // action 調(diào)用后,會修改響應(yīng)對象 
  26.     decrement: action, // action 調(diào)用后,會修改響應(yīng)對象 
  27.   } 

我們在看看之前版本的 MobX,使用裝飾器的寫法:

  1. class Store { 
  2.   @observable count = 0 
  3.   constructor() { 
  4.     makeObservable(this) 
  5.   } 
  6.   @action increment() { 
  7.     this.count++; 
  8.   } 
  9.   @action decrement() { 
  10.     this.count--; 
  11.   } 
  12.   @computed get double() { 
  13.     return this.count * 2 
  14.   } 
  15.  
  16. const store = new Store() 

這么看起來,好像寫法并沒有得到什么簡化,好像比寫裝飾器還要復(fù)雜點。下面我們看看 6.0 版本一個更強大的 API:makeAutoObservable。

makeAutoObservable 是一個更強大的 makeObservable,可以自動為屬性加上對象的包裝函數(shù),上手成本直線下降。

  1. import { makeAutoObservable } from 'mobx' 
  2.  
  3. const store = makeAutoObservable({ 
  4.   count: 0, 
  5.   get double() { 
  6.     return this.count * 2 
  7.   }, 
  8.   increment() { 
  9.     this.count += 1 
  10.   }, 
  11.   decrement() { 
  12.     this.count -= 1 
  13.   } 
  14. }) 

計算屬性

MobX 的屬性與 Vue 的 computed 一樣,在 makeAutoObservable 中就是一個 getter,getter 依賴的值一旦發(fā)生變化,getter 本身的返回值也會跟隨變化。

  1. import { makeAutoObservable } from 'mobx' 
  2.  
  3. const store = makeAutoObservable({ 
  4.   count: 0, 
  5.   get double() { 
  6.     return this.count * 2 
  7.   } 
  8. }) 

當(dāng) store.count 為 1 時,調(diào)用 store.double 會返回 2。

修改行為

當(dāng)我們需要修改 store 上的響應(yīng)屬性時,我們可以通過直接重新賦值的方式修改,但是這樣會得到 MobX 的警告??。

  1. const store = makeAutoObservable({ 
  2.   count: 0 
  3. }); 
  4.  
  5. document.getElementById("increment").onclick = function () { 
  6.   store.count += 1 

warn

MobX 會提示,在修改響應(yīng)式對象的屬性時,需要通過 action 的方式修改。雖然直接修改也能生效,但是這樣會讓 MobX 狀態(tài)的管理比較混亂,而且將狀態(tài)修改放到 action 中,能夠讓 MobX 在內(nèi)部的事務(wù)流程中進行修改,以免拿到的某個屬性還處于中間態(tài),最后計算的結(jié)果不夠準(zhǔn)確。

makeAutoObservable 中的所有方法都會被處理成 action。

  1. import { makeAutoObservable } from 'mobx' 
  2.  
  3. const store = makeAutoObservable({ 
  4.   count: 0, 
  5.   get double() { 
  6.     return this.count * 2 
  7.   }, 
  8.   increment() { // action 
  9.     this.count += 1 
  10.   }, 
  11.   decrement() { // action 
  12.     this.count -= 1 
  13.   } 
  14. }) 

不同于 Vuex,將狀態(tài)的修改劃分為 mutation 和 action,同步修改放到 mutation 中,異步的操作放到 action 中。在 MobX 中,不管是同步還是異步操作,都可以放到 action 中,只是異步操作在修改屬性時,需要將賦值操作放到 runInAction 中。

  1. import { runInAction, makeAutoObservable } from 'mobx' 
  2.  
  3. const store = makeAutoObservable({ 
  4.   count: 0, 
  5.   async initCount() { 
  6.     // 模擬獲取遠程的數(shù)據(jù) 
  7.     const count = await new Promise((resolve) => { 
  8.       setTimeout(() => { 
  9.         resolve(10) 
  10.       }, 500) 
  11.     }) 
  12.     // 獲取數(shù)據(jù)后,將賦值操作放到 runInAction 中 
  13.     runInAction(() => { 
  14.       this.count = count 
  15.     }) 
  16.   } 
  17. }) 
  18.  
  19. store.initCount() 

如果不調(diào)用 runInAction ,則可以直接調(diào)用本身已經(jīng)存在的 action。

  1. import { runInAction, makeAutoObservable } from 'mobx' 
  2.  
  3. const store = makeAutoObservable({ 
  4.   count: 0, 
  5.   setCount(count) { 
  6.     this.count = count 
  7.   }, 
  8.   async initCount() { 
  9.     // 模擬獲取遠程的數(shù)據(jù) 
  10.     const count = await new Promise((resolve) => { 
  11.       setTimeout(() => { 
  12.         resolve(10) 
  13.       }, 500) 
  14.     }) 
  15.     // 獲取數(shù)據(jù)后,調(diào)用已有的 action 
  16.     this.setCount(count
  17.   } 
  18. }) 
  19.  
  20. store.initCount() 

監(jiān)聽對象變更

無論是在 React 還是在小程序中想要引入 MobX,都需要在對象變更的時候,通知調(diào)用原生的 setState/setData 方法,將狀態(tài)同步到視圖上。

通過 autorun 方法可以實現(xiàn)這個能力,我們可以把 autorun 理解為 React Hooks 中的 useEffect。每當(dāng) store 的響應(yīng)屬性發(fā)生修改時,傳入 autorun 的方法(effect)就會被調(diào)用一次。

  1. import { autorun, makeAutoObservable } from 'mobx' 
  2.  
  3. const store = makeAutoObservable({ 
  4.   count: 0, 
  5.   setCount(count) { 
  6.     this.count = count 
  7.   }, 
  8.   increment() { 
  9.     this.count++ 
  10.   }, 
  11.   decrement() { 
  12.     this.count-- 
  13.   } 
  14. }) 
  15.  
  16. document.getElementById("increment").onclick = function () { 
  17.   store.count++ 
  18.  
  19. const $count = document.getElementById("count"
  20. $count.innerText = `${store.count}` 
  21. autorun(() => { 
  22.   $count.innerText = `${store.count}` 
  23. }) 

每當(dāng) button#increment 按鈕被點擊的時候,span#count 內(nèi)的值就會自動進行同步。??查看完整代碼。

效果演示

除了 autorun ,MobX 還提供了更精細化的監(jiān)聽方法:reaction、 when。

  1. const store = makeAutoObservable({ 
  2.   count: 0, 
  3.   setCount(count) { 
  4.     this.count = count 
  5.   }, 
  6.   increment() { 
  7.     this.count++ 
  8.   }, 
  9.   decrement() { 
  10.     this.count-- 
  11.   } 
  12. }) 
  13.  
  14. // store 發(fā)生修改立即調(diào)用 effect 
  15. autorun(() => { 
  16.   $count.innerText = `${store.count}` 
  17. }); 
  18.  
  19. // 第一個方法的返回值修改后才會調(diào)用后面的 effect 
  20. reaction( 
  21.   // 表示 store.count 修改后才會調(diào)用 
  22.   () => store.count
  23.   // 第一個參數(shù)為當(dāng)前值,第二個參數(shù)為修改前的值 
  24.   // 有點類似與 Vue 中的 watch 
  25.   (value, prevValue) => { 
  26.     console.log('diff', value - prevValue) 
  27.   } 
  28. ); 
  29.  
  30. // 第一個方法的返回值為真,立即調(diào)用后面的 effect 
  31. when(() => store.count > 10, () => { 
  32.   console.log(store.count
  33. }) 
  34. // when 方法還能返回一個 promise 
  35. (async function() { 
  36.   await when(() => store.count > 10) 
  37.   console.log('store.count > 10'
  38. })() 

總結(jié)

MobX 的介紹到這里就結(jié)束了,本文只是大致的列舉了一下 MobX 的 API,希望大家能有所收獲。后續(xù)打算再深入研究下 MobX 的實現(xiàn),等我研究好了,再寫篇文章來分享。

 

責(zé)任編輯:武曉燕 來源: 更了不起的前端
相關(guān)推薦

2014-06-24 09:41:56

Android Stu教程

2024-01-29 00:36:50

Backstage設(shè)施工具

2025-05-28 15:46:13

2013-12-04 14:44:41

Android SDK用戶交互

2013-12-26 15:40:33

Android SDK項目

2013-12-04 13:27:56

Android SDK項目

2014-01-22 10:00:10

Android SDKAndroid開發(fā)

2021-11-26 09:40:37

EclipseIDEA開發(fā)

2016-06-20 10:20:22

Docker云計算

2012-08-01 17:39:17

2014-06-06 14:25:03

iOS 8SwiftWWDC2014

2013-12-26 15:14:38

Android SDK運行調(diào)試

2013-12-04 14:29:18

Android SDK應(yīng)用程序

2013-12-26 15:47:59

Android SDK應(yīng)用程序

2013-11-27 10:12:11

2013-12-26 14:52:52

Android SDK物理設(shè)備

2021-01-19 06:16:05

前端Babel 技術(shù)熱點

2022-09-05 14:45:56

前端K8S

2017-05-17 14:46:22

容器DockerLinux

2020-04-23 09:33:32

Android 協(xié)程開發(fā)
點贊
收藏

51CTO技術(shù)棧公眾號

国产一级一级片| 美女网站视频黄色| 日韩欧美电影在线观看| 日韩成人av影视| 神马久久桃色视频| 欧美日韩一区二区区| 福利在线免费视频| 久久女同精品一区二区| 国产精品福利在线观看网址| 伊人在线视频观看| 欧美大胆视频| 欧美日韩国产美女| 国产日韩亚洲欧美在线| 97在线视频精品| 精品亚洲一区二区三区四区| 久久一卡二卡| 国产女人aaa级久久久级| 成人欧美一区二区三区视频| 69亚洲精品久久久蜜桃小说| 午夜久久久久| 国产一区二区动漫| 亚洲色图欧美日韩| 国产精品色婷婷在线观看| 日韩欧美精品在线观看| 日韩亚洲欧美一区二区| 成人在线免费电影| 不卡视频免费播放| 91精品在线影院| 成人一级免费视频| 在线日本高清免费不卡| 久久视频在线观看免费| 色哟哟精品观看| 精品一区二区男人吃奶| 337p亚洲精品色噜噜噜| 国产精品入口免费软件| 中文一区一区三区高中清不卡免费 | 日韩中文字幕av| av网站有哪些| 欧美a一欧美| 精品999在线播放| 国产一级二级av| 欧美美女被草| 欧美日韩精品一区二区三区蜜桃| 亚洲熟妇av一区二区三区| 女人高潮被爽到呻吟在线观看 | 亚洲一区二区三区精品视频| 亚洲日本中文字幕在线| 成人午夜视频免费看| 亚洲另类在线一区| 日韩在线不卡视频| 微拍福利一区二区| 国产91精品对白在线播放| 欧美α欧美αv大片| 激情在线观看视频| 国产剧情一区二区在线观看| 欧美日本高清视频在线观看| 97超碰成人在线| 青草综合视频| 51精品秘密在线观看| 911av视频| 亚洲电影一区| 亚洲第一精品电影| 日韩无码精品一区二区| 欧美亚洲色图校园春色| 亚洲美女视频网| 免费福利视频网站| 忘忧草精品久久久久久久高清| www.日本久久久久com.| 国产av 一区二区三区| 欧美日韩一视频区二区| 欧美极品在线播放| 国产成人一区二区三区影院在线| 亚洲女同同性videoxma| 日本不卡高字幕在线2019| 亚洲中文无码av在线| 美女网站视频久久| 99九九视频| 性猛交xxxx| 国产欧美精品在线观看| 一区二区三区在线观看www| 91香蕉在线观看| 精品美女久久久久久免费| 日韩人妻精品无码一区二区三区| 中文字幕亚洲欧美日韩| 亚洲怡红院在线观看| 中文字幕第50页| 最近中文字幕av| 国产在线视频一区二区三区| 亚洲综合社区网| 日本免费网站在线观看| 久久精品人人做人人爽97| 亚洲激情一区二区三区| 成人在线视频亚洲| 激情av一区二区| 2025韩国理伦片在线观看| 麻豆国产一区| 亚洲欧洲午夜一线一品| 好吊日在线视频| 一本久道综合久久精品| 国产日韩中文字幕在线| 天天操天天干天天舔| 欧美激情一区在线| 美女黄色免费看| a∨色狠狠一区二区三区| 欧美不卡123| 韩国三级hd中文字幕| 欧美视频导航| 国产精品无av码在线观看| 特黄aaaaaaaaa真人毛片| 国产精品美女久久久久aⅴ| 欧美精品久久久久久久自慰| 国产精品原创视频| 亚洲黄在线观看| 欧美激情一区二区视频| 老牛嫩草一区二区三区日本 | 激情久久一区二区| 亚洲国产欧美一区二区丝袜黑人| 亚洲 欧美 国产 另类| 嫩草成人www欧美| 国产成人精品一区二区三区福利| 国产免费av高清在线| 午夜精品久久一牛影视| 五月天国产视频| 久久福利影院| 国产精品第一区| 视频在线不卡| 午夜精品久久一牛影视| 99免费观看视频| 香蕉久久网站| 国产欧美一区二区三区久久人妖 | 中文字幕の友人北条麻妃| 厕沟全景美女厕沟精品| 亚洲国产成人在线播放| 国产一级特黄视频| 国产精品亚洲综合一区在线观看| 一区二区冒白浆视频| 日韩欧美2区| 亚洲欧洲在线视频| 青青青国产在线| www.色精品| 黄色一级片在线看| 高清一区二区三区| 色综合天天综合网国产成人网| 国产精品嫩草影院精东| 国产精品久久毛片a| 777视频在线| 欧美激情国产在线| 国产美女搞久久| 免费日本一区二区三区视频| 欧美人动与zoxxxx乱| 韩国一级黄色录像| 国产中文字幕精品| 亚洲五码在线观看视频| 久久视频社区| 久久久久久久一区二区| 免费国产精品视频| 大伊人狠狠躁夜夜躁av一区| 蜜桃传媒一区二区亚洲av| 午夜在线视频观看日韩17c| 麻豆精品蜜桃一区二区三区| 婷婷激情一区| 色偷偷偷综合中文字幕;dd| 在线免费看av的网站| √…a在线天堂一区| 99视频在线观看视频| 午夜日韩视频| 久久大片网站| 香蕉久久免费电影| 精品国偷自产在线视频99| 亚洲第一成年人网站| 午夜精品久久久久久久蜜桃app | 九热爱视频精品视频| 欧美一级淫片videoshd| 久久经典视频| 欧美揉bbbbb揉bbbbb| 日本在线一级片| 成人性生交大片免费| 18禁免费无码无遮挡不卡网站| 自拍偷拍精品| 国产精品久久久久久av福利| 国产在线观看a视频| 精品国产污污免费网站入口 | 在线精品亚洲| 欧美二区在线| 伊人久久精品| 欧美—级a级欧美特级ar全黄| 水莓100在线视频| 欧美在线不卡一区| 日本天堂中文字幕| 久久久亚洲精品石原莉奈| 日本中文字幕精品—区二区| 黄色综合网站| 日韩伦理一区二区三区av在线| 精品成人18| 热re91久久精品国99热蜜臀| 免费黄色电影在线观看| 欧美精品一区二区三区在线 | 青青青草视频在线| 亚洲欧美三级伦理| 99在线无码精品入口| 黑人狂躁日本妞一区二区三区| 成人免费视频入口| 99久久久国产精品| 手机av在线免费| 国产精品亚洲综合久久| 国产树林野战在线播放| 国产精品探花在线观看| 成人自拍网站| 精品176极品一区| 欧美在线观看视频| a级影片在线| 在线日韩日本国产亚洲| 手机在线观看免费av| 欧美日韩大陆一区二区| wwwwww国产| 一区二区三区国产精品| 9.1片黄在线观看| 97精品超碰一区二区三区| 午夜免费福利网站| 免费观看在线综合色| 黄在线观看网站| 欧美日韩国产亚洲一区| 一本久久a久久精品vr综合 | 亚洲精品v欧美精品v日韩精品| 国产一区二区女内射| 色综合 综合色| 日本熟妇毛茸茸丰满| 亚洲精品视频一区| 日本成人免费在线观看| 国产农村妇女毛片精品久久麻豆| 国产 xxxx| 国产精品一区二区免费不卡 | 国产成人福利片| 天天操狠狠操夜夜操| 日韩电影在线观看一区| 欧美日韩精品在线一区二区| 欧美日韩mv| 成年在线观看视频| 亚洲一区 二区 三区| 在线观看一区二区三区三州| 成人在线免费观看91| 蜜桃传媒视频麻豆第一区免费观看 | 三级小视频在线观看| 欧美电影精品一区二区| 精品人妻无码一区二区| 日韩欧美中文字幕一区| 国产熟女精品视频| 91精品国产乱| 国产xxxxxx| 91精品国产综合久久福利软件| 国产免费av观看| 91精品国模一区二区三区| 国产精品久久久久久久免费看| 欧美高清hd18日本| av在线免费在线观看| 欧美一区二区性放荡片| www夜片内射视频日韩精品成人| 日韩一区二区三区观看| a天堂在线观看视频| 日韩手机在线导航| 六月婷婷综合网| 日韩av在线一区二区| 免费a在线观看| 在线成人激情黄色| 麻豆传媒视频在线观看免费| 久久午夜a级毛片| 伊人精品影院| 性色av一区二区三区红粉影视| 色在线免费观看| 国产精品高潮在线| 欧美经典影片视频网站| 国产精品久久久久久久小唯西川| 噜噜噜天天躁狠狠躁夜夜精品| 久久久久久久久久码影片| 成人在线亚洲| 黄色一级视频播放| 中文在线不卡| 国产精品视频分类| 高清在线观看日韩| 受虐m奴xxx在线观看| 久久综合久久久久88| 成人免费视频入口| 亚洲国产精品一区二区www在线| www.伊人久久| 欧美精品久久天天躁| 人妻精品一区二区三区| 一区二区三区黄色| 在线h片观看| 国产999在线观看| 精品视频一区二区三区| 蜜桃日韩视频| 91精品国产91久久久久久密臀| 免费毛片网站在线观看| 日产国产高清一区二区三区| 9191在线视频| 国产清纯白嫩初高生在线观看91 | 一二三av在线| 99国产欧美另类久久久精品| 国产一二三四视频| 亚洲18色成人| 97超视频在线观看| 日韩精品在线播放| 四虎亚洲精品| 国产精品视频yy9099| 国产成人夜色高潮福利影视| 日韩亚洲视频在线| 亚洲欧洲另类| 操人视频免费看| 国产日产欧美精品一区二区三区| 久久久久99精品成人片毛片| 欧美亚州韩日在线看免费版国语版| www.国产麻豆| 深夜福利日韩在线看| 在线观看网站免费入口在线观看国内| 91网站在线免费观看| 国产毛片一区二区三区| 久久黄色片视频| 国产精品538一区二区在线| 五月婷婷欧美激情| 狠狠爱在线视频一区| 国产高潮在线观看| 精品国产一区二区三区在线观看| jk漫画禁漫成人入口| 国产精品亚洲不卡a| 欧美一区影院| 日韩一级免费片| 久久精品日韩一区二区三区| 羞羞影院体验区| 亚洲第一区中文字幕| 亚洲综合图区| 92国产精品视频| 国产精品久久占久久| 波多结衣在线观看| 国产欧美一区二区在线| 影音先锋在线国产| 亚洲精品99久久久久| 日本高清成人vr专区| 亚洲free性xxxx护士hd| 久久影视一区| 日本在线播放一区二区| 国产精品国产三级国产三级人妇| 免费av中文字幕| 亚洲免费av网址| 欧美成人影院| 欧美日韩精品久久| 久久一区二区三区超碰国产精品| 波多野结衣影院| 激情成人中文字幕| 欧美女优在线| 日韩女优在线播放| jiujiure精品视频播放| 色婷婷狠狠18| 国产精品久久久久aaaa| 97免费观看视频| 久久亚洲精品一区| 欧美影院精品| 91免费黄视频| 久久午夜羞羞影院免费观看| 四虎成人在线观看| 有码中文亚洲精品| 亚洲资源在线| 波多野结衣与黑人| av男人天堂一区| 欧美黑人一区二区| 深夜福利91大全| 久久一级大片| 国产极品尤物在线| 久久精品亚洲国产奇米99| 中文区中文字幕免费看| 久久人人爽人人爽人人片亚洲| 9999精品视频| 少妇人妻大乳在线视频| 久久久国产精品不卡| 一级黄色片网站| 欧美黄色片在线观看| 日韩高清成人在线| 色综合色综合色综合色综合| 亚洲久草在线视频| 四虎在线视频免费观看| 国产精品国模在线| 中出一区二区| 亚洲av无码一区二区三区网址| 91成人在线观看喷潮| 国产午夜精品久久久久免费视| 动漫3d精品一区二区三区| 久久精品官网| 亚洲不卡在线播放| 日韩av一区二区在线观看| 成人免费毛片嘿嘿连载视频…| 91看片淫黄大片91| 久久亚洲一级片| 精品二区在线观看| 日本视频久久久| 欧美激情aⅴ一区二区三区| 国产伦精品一区二区三区妓女| 欧美日韩黄色影视| 欧美男男激情videos| 黄色网址在线免费看| 91香蕉视频污| 国产视频在线免费观看|