成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

MobX學(xué)習(xí)之旅

劉福 / 1969人閱讀

摘要:一其實(shí)是一個(gè)比較輕便的可擴(kuò)展的狀態(tài)管理工具,是一個(gè)由以及一些其他團(tuán)隊(duì)的人共同維護(hù)的開源項(xiàng)目。當(dāng)應(yīng)用公共狀態(tài)的組件在狀態(tài)發(fā)生變化的時(shí)候,會(huì)自動(dòng)完成與狀態(tài)相關(guān)的所有事情,例如自動(dòng)更新自動(dòng)緩存數(shù)據(jù),自動(dòng)通知等。

一、MobX
MobX其實(shí)是一個(gè)比較輕便的可擴(kuò)展的狀態(tài)管理工具,是一個(gè)由Facebook以及一些其他團(tuán)隊(duì)的人共同維護(hù)的開源項(xiàng)目。

當(dāng)應(yīng)用公共狀態(tài)的組件在狀態(tài)發(fā)生變化的時(shí)候,會(huì)自動(dòng)完成與狀態(tài)相關(guān)的所有事情,例如自動(dòng)更新View,自動(dòng)緩存數(shù)據(jù),自動(dòng)通知server等。
例如React的體系,react + redux + react-redux + redux-saga, view層觸發(fā)一個(gè)action,中間件會(huì)將這個(gè)動(dòng)作進(jìn)行dispatch,然后reducer執(zhí)行相應(yīng)的更新狀態(tài)方法,使得store的狀態(tài)更新。

MobX官方推薦與React搭配使用,來存儲(chǔ)和更新應(yīng)用狀態(tài),所以最好搭配mobx-react中間件使用:
原理:
1、React的render是將存儲(chǔ)的狀態(tài)轉(zhuǎn)化為樹狀結(jié)構(gòu)來渲染組件的方法;
   Mobx是用來存儲(chǔ)和更新狀態(tài)的工具;
2、React使用的方法是采用虛擬Dom來進(jìn)行view視圖的緩存,來減少繁瑣的Dom更新
   而Mobx則通過一個(gè)虛擬的狀態(tài)依賴圖表來讓react組件和應(yīng)用狀態(tài)同步化來減少不必要的狀態(tài)來更新組件的
二、MobX與其他狀態(tài)管理工具的區(qū)別
1、對比Redux
  conponent-->dispatch(action)-->reducer-->subscribe-->getState-->component
  對比React-Redux
  component-->actionCreator(data)-->reducer-->component
這里的reducer在MobX里都給了action,直接通過action來更改狀態(tài),不需要reducer來操作state了,也不需關(guān)注reducer純不純了

2、對比Vuex
component-->dispatch(action)-->mutation--(mutate)-->state-->component
vuex中提出了同步mutation和異步action,現(xiàn)在mobx也無需mutaiton,但借鑒了computed這個(gè)純函數(shù)。

相比這兩個(gè)工具,MobX內(nèi)置了數(shù)據(jù)變化監(jiān)聽機(jī)制,使得在實(shí)際應(yīng)用的時(shí)候一切都是那么的順其自然。
三、MobX核心模塊
MobX的數(shù)據(jù)驅(qū)動(dòng)解構(gòu):
    action--(update)-->state--(update)-->computed--(trigger)-->reaction
    
MobX與decorater語法結(jié)合(注解形式@)結(jié)合起來用比較優(yōu)雅,也算是MobX的一大亮點(diǎn)吧!
Observable
是被觀察著和觀察者的概念,你也可以理解為生產(chǎn)者和消費(fèi)者的概念
@observable/Observable 方法將對象的所有屬性重新克隆成新對象,并將克隆對象轉(zhuǎn)變成可觀察的。
@observer就是在你訂閱觀察的對象的地方添加注釋來監(jiān)聽對象的更新

Observable 方法的值可以是如下類型:

1、object(原型是Object): Observable方法將該對象克隆成新對象并將屬性轉(zhuǎn)變成可觀察的;
但是后添加的屬性不會(huì)變?yōu)榭捎^察的,需要用到set或者extendObservable;

    eg: 
    @observable car = {color: red; name: "Infinity"}
    
    注:這也其實(shí)是extendObservable(this,{ car: {color: red; name: "Infinity"} })的語法糖
    向?qū)ο笾刑砑訉傩裕?    extendObservable(car, {price: "300w"})

2、Array:Observable會(huì)創(chuàng)建一個(gè)類數(shù)組對象來代替真正的數(shù)組,并且支持所有的原生方法,
但是sort和reverse有所不同,這里的被觀察的數(shù)組對象的這兩個(gè)方法,是不會(huì)改變數(shù)組本身,而是一個(gè)拷貝的數(shù)組;

3、Es6的Map:創(chuàng)建一個(gè)動(dòng)態(tài)建的observable映射,可以對特定項(xiàng)的更改做出反應(yīng)等;會(huì)返回一個(gè)新的Observable Map

4、object(有自身的原型對象):這種情況需要使用observable.box(value)來管理這樣的值
通過box這個(gè)箱子來存這些值,并使用.get()用來獲取當(dāng)前值,采用.set(newValue)來更新值。

    eg:
    const carName = observable.box("Infinity");
    console.log(carName.get());
    carName.set("ofo");
Computed
 是在定義相關(guān)的一些數(shù)據(jù)發(fā)生變化的時(shí)候自動(dòng)更新的值,通過@computed來修飾使用;
 注意:computed修飾的是一個(gè)狀態(tài),狀態(tài)不能重復(fù)聲明,只有參與計(jì)算的值發(fā)生改變才會(huì)觸發(fā)computed
 
 例如我需要對數(shù)組進(jìn)行篩選:
 @observable numbersArr = [99, 80, 79, 68, 2, 43, 1, 23];

一、getter
eg:
 // 篩選數(shù)組中乘2并大于50的數(shù)
  @computed get computedNumbers() {
    return this.numbersArr.filter((item) => {
      return item * 2 > 50;
    }).join(" ");
  }

然后在組件內(nèi)進(jìn)行調(diào)用:
{this.props.store.computedNumbers}
二、setter set computedBumbers(value) { this.numbersArr = [99, 80, 79, 68, 2, 43, 1, 23]; } // set方式可以使得數(shù)據(jù)進(jìn)行逆推導(dǎo) 將數(shù)據(jù)按照既定的方式進(jìn)行復(fù)原 eg: @observable length = 2; @computed get squared() { return this.length * this.length; } set squared(value) { this.length = Math.sqrt(value); } 注:這與autorun還有點(diǎn)區(qū)別,如果有一個(gè)函數(shù)應(yīng)該自動(dòng)運(yùn)行(例如只是為了達(dá)到某種效果/功能),但不會(huì)產(chǎn)生一個(gè)新的值,那就使用autorun,但是一般這種情況比較少
Action
比起官方說的“動(dòng)作”,我更愿意稱為是“行為”,mobx的action吸收了redux和vuex的數(shù)據(jù)處理的復(fù)雜邏輯
用來修改狀態(tài),不同于Computed

eg:
component:
sendInfo = () => {
    const username = this.name.value;
    const pwd = this.pwd.value;

    if (!username || !pwd) {
      return;
    }

    // 調(diào)接口
    this.props.testDecStore.handleGetUserInfo();
  };

store:
// 四、異步數(shù)據(jù)獲取
@action handleGetUserInfo() {
    this.sendCount++;
    testDecService.getUserInfo().then((data) => {
      this.userInfo = data;
   })
}
Autorun
這個(gè)函數(shù)類似computed,是通過對狀態(tài)的更新做出反應(yīng),但是不同于computed。

computed創(chuàng)建的函數(shù),是有自己的觀察者的,而autorun是只有它的依賴關(guān)系改變時(shí)才會(huì)重新計(jì)算,
否則它的值被認(rèn)為是不相干的。正如官方所說是比較適合log打印日志,持久化更新UI的代碼,而不是用來產(chǎn)生新的值

接收的參數(shù):
1,對象,
2、delay: 函數(shù)延遲執(zhí)行時(shí)間,例如節(jié)流去抖
3、name: 
4、onError: 用來處理reaction的錯(cuò)誤
5、scheduler: 設(shè)置自定義調(diào)度器以決定如何調(diào)度autorun函數(shù)的重新運(yùn)行

eg:
autorun(() => {
    // do something
}, {
    onError(e) {
        alert("error")
    }
})


實(shí)例:
autorun(() => {
  this.myname = `my name is ${this.firstName} ${this.lastName}`;
});

changeName = () => {
    this.firstName = `Alice${new Date().getTime()}`;
    this.lastName = `Thomas${new Date().getTime()}`;
 };

測試autorun 開始
{this.myname}
只要firstname和lastname發(fā)生變化都會(huì)更新dom

但是,如果僅僅想要在被觀察的變量有變化的時(shí)候觸發(fā),而不是立即執(zhí)行autorun,那么我們可以用到reaction了;

Reaction
Reaction是在初次數(shù)據(jù)變化后才會(huì)觸發(fā)
四、Mobx-react核心概念 Observer
是mobx-react包多帶帶提供的

Observer是用來將React組建轉(zhuǎn)變成響應(yīng)式的組件,內(nèi)部通過mobx.autorun包裝了組件的
render函數(shù),來確保store的數(shù)據(jù)更新時(shí)來刷新組件

@observer 是observer(class ***{})的注解形式,用來觀察組件,
高階組件 @observer class Test extends React.Component{}
無狀態(tài)組件 const Test = observer(() => 
test
) 使用inject組件連接提供的sotres,他會(huì)使得stores可以作為組件的props調(diào)用 eg: @inject("testStore") @observer class Test extends React.Component{}
Provider
Provider函數(shù)為connect函數(shù)提供store參數(shù),本身connect函數(shù)就是用來連接視圖和數(shù)據(jù)層的方法。

在跟組件外層包一層provider,使得所有的子組件默認(rèn)都可以拿到state

使用:

import { Provider } from "mobx-react";
import store from "../stores";


    ...
inject
引入數(shù)據(jù)的方式,@inject(stores); 使得數(shù)據(jù)被自動(dòng)保存在組件的this.props中
componentWillReact
mobx-react新增的生命周期鉤子,當(dāng)組件重新render的時(shí)候會(huì)被觸發(fā),但在初始渲染前是不會(huì)被觸發(fā)的
onError
mobx-react提供的錯(cuò)誤鉤子函數(shù)來收集錯(cuò)誤

用法: 

import { onError } from "mobx-react";
onError((error) => {
    consol.log(error);
})
五、MobX源碼解讀 六、MobX使用注意

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/95993.html

相關(guān)文章

  • 【譯】Redux 還是 Mobx,讓我來解決你的困惑!

    摘要:我現(xiàn)在寫的這些是為了解決和這兩個(gè)狀態(tài)管理庫之間的困惑。這甚至是危險(xiǎn)的,因?yàn)檫@部分人將無法體驗(yàn)和這些庫所要解決的問題。這肯定是要第一時(shí)間解決的問題。函數(shù)式編程是不斷上升的范式,但對于大部分開發(fā)者來說是新奇的。規(guī)模持續(xù)增長的應(yīng) 原文地址:Redux or MobX: An attempt to dissolve the Confusion 原文作者:rwieruch 我在去年大量的使用...

    txgcwm 評(píng)論0 收藏0
  • mobx學(xué)習(xí)總結(jié)

    摘要:原理分析的核心就是通過觀察某一個(gè)變量,當(dāng)該變量產(chǎn)生變化時(shí),對應(yīng)的內(nèi)的回調(diào)函數(shù)就會(huì)發(fā)生變化?;卣{(diào)函數(shù)若依賴外部環(huán)境,則無法進(jìn)行收集很好理解,的回調(diào)函數(shù)在預(yù)執(zhí)行的時(shí)候無法到達(dá)那一行代碼,所以收集不到。 Mobx解決的問題 傳統(tǒng)React使用的數(shù)據(jù)管理庫為Redux。Redux要解決的問題是統(tǒng)一數(shù)據(jù)流,數(shù)據(jù)流完全可控并可追蹤。要實(shí)現(xiàn)該目標(biāo),便需要進(jìn)行相關(guān)的約束。Redux由此引出了dispa...

    roundstones 評(píng)論0 收藏0
  • 前端修煉之路

    摘要:一步,兩步,三步四步五步,就這樣到達(dá)了人生的巔峰傳統(tǒng)前端生態(tài)初級(jí)不使用打包中間處理工具,手工處理圖片等資源掌握以下知識(shí)點(diǎn)基礎(chǔ)結(jié)構(gòu),基礎(chǔ)樣式,基礎(chǔ)語法框架,系列插件框架,等基礎(chǔ)插件,等其他移動(dòng)端適配,瀏覽器兼容,瀏覽器調(diào)試等恭喜完成新手村修 一步,兩步,三步四步五步,就這樣到達(dá)了人生的巔峰~ 傳統(tǒng)前端生態(tài)-初級(jí) 不使用打包、中間處理工具,手工處理js、css、圖片等資源 掌握以下知識(shí)點(diǎn):...

    Jason_Geng 評(píng)論0 收藏0
  • 前端修煉之路

    摘要:一步,兩步,三步四步五步,就這樣到達(dá)了人生的巔峰傳統(tǒng)前端生態(tài)初級(jí)不使用打包中間處理工具,手工處理圖片等資源掌握以下知識(shí)點(diǎn)基礎(chǔ)結(jié)構(gòu),基礎(chǔ)樣式,基礎(chǔ)語法框架,系列插件框架,等基礎(chǔ)插件,等其他移動(dòng)端適配,瀏覽器兼容,瀏覽器調(diào)試等恭喜完成新手村修 一步,兩步,三步四步五步,就這樣到達(dá)了人生的巔峰~ 傳統(tǒng)前端生態(tài)-初級(jí) 不使用打包、中間處理工具,手工處理js、css、圖片等資源 掌握以下知識(shí)點(diǎn):...

    macg0406 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<