亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

騷操作!在react中使用vuex

OnlyLing / 3673人閱讀

摘要:原文地址前言筆者最近在學(xué)習(xí)使用,提到就繞不過(guò)去。同時(shí)應(yīng)當(dāng)注意,當(dāng)組件時(shí)應(yīng)當(dāng)重新收集依賴,因?yàn)橹笠蕾囮P(guān)系很可能已經(jīng)變化了清空依賴至此,我們的小目標(biāo)已經(jīng)完成了,在中使用不再是夢(mèng)

原文地址

前言

筆者最近在學(xué)習(xí)使用react,提到react就繞不過(guò)去redux。redux是一個(gè)狀態(tài)管理架構(gòu),被廣泛用于react項(xiàng)目中,但是redux并不是專為react而生,兩者還需要react-redux建立一座橋梁。同時(shí),redux架構(gòu)規(guī)定只能發(fā)送同步action,要想發(fā)送異步action就需要結(jié)合中間件如redux-thunk、redux-saga等,所以說(shuō)要想搞定redux還真是不容易啊,光名詞就這么多。筆者以前也接觸過(guò)一點(diǎn)vuex,vuex對(duì)筆者這樣的菜雞相對(duì)友好,但是vuex是和vue配套的,是不可能用在react中的,這輩子都別想用在react中。但是我不服,那么這篇文章就探索下如何制作一個(gè)可以在react中使用的類似vuex的狀態(tài)管理工具,我將它取名為reux。

vuex <=> redux  + react-redux + redux-saga
正文

響應(yīng)式數(shù)據(jù)觀測(cè)系統(tǒng)

vue的一大特色就是響應(yīng)式數(shù)據(jù)觀測(cè)系統(tǒng),它可以在get數(shù)據(jù)時(shí)收集依賴,在set數(shù)據(jù)時(shí)觸發(fā)更新。vuex借助于vue的數(shù)據(jù)觀測(cè)系統(tǒng),可以輕松的收集數(shù)據(jù)依賴,并且依賴可以精細(xì)到組件的粒度,也就是說(shuō)某一狀態(tài)改變時(shí),只有依賴到這一狀態(tài)的組件才會(huì)觸發(fā)rerender,這樣看來(lái)redux體系就比較傻,只要提交action,就會(huì)從根組件rerender(react-redux內(nèi)部自動(dòng)進(jìn)行shouldCompoentUpdate判斷)。

上圖來(lái)自于vue官網(wǎng)對(duì)vuex架構(gòu)的說(shuō)明,鏈接。
上圖中的componentvue component,只要vue component執(zhí)行render,那么vuex的數(shù)據(jù)響應(yīng)系統(tǒng)就可以自動(dòng)的收集依賴,當(dāng)狀態(tài)改變時(shí),依賴于此狀態(tài)的組件就會(huì)重新渲染。既然我們要實(shí)現(xiàn)的是一個(gè)類vuex的狀態(tài)管理工具,即支持以get的方式收集依賴,以set的方式觸發(fā)更新,所以reux利用了vue的響應(yīng)式數(shù)據(jù)觀測(cè)系統(tǒng),正所謂前人種樹,后人乘涼。

如何收集依賴

我們已經(jīng)有了響應(yīng)式數(shù)據(jù)系統(tǒng),接下來(lái)要解決的問(wèn)題就是如何收集依賴,收集依賴必須要觸發(fā)get,而觸發(fā)get的前提是組件可以拿到store,因此第一步是向組件注入store。類似react-redux,reux提供了Provider使子組件可以拿到store。

class Provider extends Component {
  getChildContext() {
    return {store: this.props.store};
  }

  render() {
    const { children } = this.props;
    return children;
  }
}
Provider.childContextTypes = {
  store: PropTypes.object
};

相應(yīng)的子組件可以context拿到store,如下

class Child extends Component {
  render() {
    // store => this.context.store
  }
}
Child.contextTypes = {
  store: PropTypes.object
};

這樣寫的缺點(diǎn)顯而易見,每個(gè)子組件都需要定義contextTypes,同樣的類似于react-redux,reux提供了connect函數(shù),用于映射state => props

const connect = (mapStateToProps = () => {}) => {
  return (WrappedComponent) => {
    const Wrapper = class extends Component {
      render() {
        const store = this.context.store;
        const props = Object.assign({}, this.props, mapStateToProps(store.state, this.props), {dispatch: store.dispatch, commit: store.commit});
        return 
      }
    }
    Wrapper.contextTypes = {
      store: PropTypes.object
    };
    reaturn Wrapper;
  }
}

這樣一來(lái),只要組件執(zhí)行render方法,便會(huì)觸發(fā)get鉤子,從而使得store自動(dòng)收集依賴,我們?cè)傧胂乱蕾囀鞘裁?,其?shí)依賴應(yīng)該是組件實(shí)例,那么當(dāng)set鉤子觸發(fā)時(shí),每個(gè)依賴(即組件實(shí)例)只要執(zhí)行forceUpdate方法就可以達(dá)到rerender的效果。

但是問(wèn)題是,get鉤子觸發(fā)時(shí),如何確定依賴到底是誰(shuí)呢?借鑒vue,我們定義一個(gè)stack,當(dāng)componentWillMount時(shí)進(jìn)棧,當(dāng)componentDidMount時(shí)出棧

componentWillMount() {
  pushTarget(this);
}

componentDidMount() {
  popTarget(this);
}

這樣當(dāng)get鉤子觸發(fā)時(shí),當(dāng)前target就是目標(biāo)依賴。同時(shí)應(yīng)當(dāng)注意,當(dāng)組件update時(shí)應(yīng)當(dāng)重新收集依賴,因?yàn)閡pdate之后依賴關(guān)系很可能已經(jīng)變化了

update() {
  // 清空依賴
  this.clear();
  pushTarget(this);
  this.forceUpdate(() => {
    popTarget(this);
  })
}

至此,我們的小目標(biāo)已經(jīng)完成了,在react中使用vuex不再是夢(mèng)!

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/96381.html

相關(guān)文章

  • vue2.0開發(fā)聊天程序(三)組件的通信

    摘要:我在中寫了這段代碼在組件被創(chuàng)建時(shí)候?qū)?huì)執(zhí)行此函數(shù)相當(dāng)于進(jìn)入頁(yè)面的自執(zhí)行使用方法監(jiān)聽屬性并執(zhí)行一個(gè)回調(diào)函數(shù)按道理在元素被創(chuàng)建的時(shí)候,會(huì)將監(jiān)聽到的值賦給并且打印。 天地不仁以萬(wàn)物為芻狗,宇宙無(wú)義視眾生如螻蟻                  ——蕭鼎和我 上一節(jié)列出了5個(gè)關(guān)鍵點(diǎn),第一個(gè)路由已經(jīng)解決了,接下來(lái)解決第二個(gè)問(wèn)題: 組件的通信問(wèn)題 一、組件的關(guān)系 組件之間的關(guān)系無(wú)非就是兩種父子關(guān)系...

    ddongjian0000 評(píng)論0 收藏0
  • Vuex、Flux、Redux、Redux-saga、Dva、MobX

    摘要:也就是說(shuō)不應(yīng)該有公開的,所有都應(yīng)該是私有的,只能有公開的。允許使用方法設(shè)置監(jiān)聽函數(shù),一旦發(fā)生變化,就自動(dòng)執(zhí)行這個(gè)函數(shù)。用一個(gè)叫做的純函數(shù)來(lái)處理事件??梢酝ㄟ^(guò)得到當(dāng)前狀態(tài)。在中,同步的表現(xiàn)就是發(fā)出以后,立即算出。 這篇文章試著聊明白這一堆看起來(lái)挺復(fù)雜的東西。在聊之前,大家要始終記得一句話:一切前端概念,都是紙老虎。 不管是Vue,還是 React,都需要管理狀態(tài)(state),比如組件之...

    hiYoHoo 評(píng)論0 收藏0
  • vuex入門案例

    摘要:說(shuō)到老四了,最苦逼的家伙了,活都讓他干了,活總得干完一個(gè)說(shuō)一個(gè)吧,所以他基本上同步進(jìn)行的。 前言 這次發(fā)表的項(xiàng)目,這對(duì)我來(lái)說(shuō)是一場(chǎng)革命。記錄著第一次GitHub發(fā)布項(xiàng)目,記錄著最初學(xué)習(xí)vuex的頭昏腦脹,也記錄著懷揣對(duì)react的一腔熱血后卻步履闌珊后,再次回看vue時(shí)那種感覺(jué)。所以說(shuō)這個(gè)項(xiàng)目對(duì)我很有意思,麻雀雖小,五臟俱全。 在寫這個(gè)項(xiàng)目之前,我正在試水react,那種函數(shù)式編程+j...

    roundstones 評(píng)論0 收藏0
  • 淺談MVC,MVP,MVVM漸進(jìn)變化及React與Vue比較

    摘要:將注意力集中保持在核心庫(kù),而將其他功能如路由和全局狀態(tài)管理交給相關(guān)的庫(kù)。此示例使用類似的語(yǔ)法,稱為。執(zhí)行更快,因?yàn)樗诰幾g為代碼后進(jìn)行了優(yōu)化。基于的模板使得將已有的應(yīng)用逐步遷移到更為容易。 前言 因?yàn)闆](méi)有明確的界定,這里不討論正確與否,只表達(dá)個(gè)人對(duì)前端MV*架構(gòu)模式理解看法,再比較React和Vue兩種框架不同.寫完之后我知道這文章好水,特別是框架對(duì)比部分都是別人說(shuō)爛的,而我也是打算把...

    DrizzleX 評(píng)論0 收藏0
  • 前端MVVM模式及其Vue和React的體現(xiàn)

    摘要:在模式中一般把層算在層中,只有在理想的雙向綁定模式下,才會(huì)完全的消失。層將通過(guò)特定的展示出來(lái),并在控件上綁定視圖交互事件,一般由框架自動(dòng)生成在瀏覽器中。三大框架的異同三大框架都是數(shù)據(jù)驅(qū)動(dòng)型的框架及是雙向數(shù)據(jù)綁定是單向數(shù)據(jù)綁定。 MVVM相關(guān)概念 1) MVVM典型特點(diǎn)是有四個(gè)概念:Model、View、ViewModel、綁定器。MVVM可以是單向綁定也可以是雙向綁定甚至是不綁...

    沈建明 評(píng)論0 收藏0

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

0條評(píng)論

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