最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在react中使用vuex的示例代碼

 更新時(shí)間:2018年07月30日 09:53:55   作者:何赫赫  
這篇文章主要介紹了在react中使用vuex的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

前言

筆者最近在學(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ō)明,鏈接。

上圖中的component是vue 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),正所謂前人種樹(shù),后人乘涼。

如何收集依賴

我們已經(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
};

這樣寫(xiě)的缺點(diǎn)顯而易見(jià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 <WrappedComponent {...props} />
   }
  }
  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)!

原文地址

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

相關(guān)文章

  • react獲取input輸入框的值的方法示例

    react獲取input輸入框的值的方法示例

    這篇文章主要介紹了react獲取input輸入框的值的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 淺談在react中如何實(shí)現(xiàn)掃碼槍輸入

    淺談在react中如何實(shí)現(xiàn)掃碼槍輸入

    這篇文章主要介紹了淺談在react中如何實(shí)現(xiàn)掃碼槍輸入,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • React項(xiàng)目經(jīng)驗(yàn)總結(jié)及遇到的坑

    React項(xiàng)目經(jīng)驗(yàn)總結(jié)及遇到的坑

    這篇文章主要介紹了React項(xiàng)目經(jīng)驗(yàn)總結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • react中context傳值和生命周期詳解

    react中context傳值和生命周期詳解

    這篇文章主要介紹了react中context傳值和生命周期,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • React+CSS 實(shí)現(xiàn)繪制橫向柱狀圖

    React+CSS 實(shí)現(xiàn)繪制橫向柱狀圖

    這篇文章主要介紹了React+CSS 實(shí)現(xiàn)繪制橫向柱狀圖,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • 詳解如何使用React構(gòu)建跑馬燈組件

    詳解如何使用React構(gòu)建跑馬燈組件

    當(dāng)你想到跑馬燈時(shí),往往會(huì)想到游樂(lè)園里那些充滿活力的燈光和旋轉(zhuǎn)的顯示,帶回童年的美好回憶,本文將和大家一起探索如何在 React 中構(gòu)建一個(gè)引人入勝的跑馬燈組件,需要的朋友可以參考下
    2024-04-04
  • React函數(shù)組件與類的區(qū)別有哪些

    React函數(shù)組件與類的區(qū)別有哪些

    函數(shù)式組件的基本意義就是,組件實(shí)際上是一個(gè)函數(shù),不是類,下面這篇文章主要給大家介紹了關(guān)于React中函數(shù)組件與類的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • React手寫(xiě)redux過(guò)程分步講解

    React手寫(xiě)redux過(guò)程分步講解

    這篇文章主要介紹了React手寫(xiě)redux過(guò)程,目前redux在react中使用是最多的,所以我們需要將之前編寫(xiě)的redux代碼,融入到react當(dāng)中去,本文給大家詳細(xì)講解,需要的朋友可以參考下
    2022-12-12
  • React安裝node-sass失敗解決方案分享

    React安裝node-sass失敗解決方案分享

    Node-sass是一個(gè)庫(kù),它將Node.js綁定到LibSass(流行樣式表預(yù)處理器Sass的C版本),它允許用戶以令人難以置信的速度將.scss文件本地編譯為css,并通過(guò)連接中間件自動(dòng)編譯,下面這篇文章主要給大家介紹了關(guān)于React安裝node-sass失敗解決的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • React Native 集成 ArcGIS 地圖的詳細(xì)過(guò)程

    React Native 集成 ArcGIS 地圖的詳細(xì)過(guò)程

    ArcGIS官方提供了 JavaScript SDK,也提供了 ArcGIS-Runtime-SDK-iOS,但是并沒(méi)有提供 React Native的版本,所以這里使用了 react-native-arcgis-mapview 庫(kù),本文給大家介紹React Native 集成 ArcGIS 地圖的詳細(xì)過(guò)程,感興趣的朋友跟隨小編一起看看吧
    2024-06-06

最新評(píng)論

宝山区| 汨罗市| 南漳县| 南和县| 六枝特区| 陵川县| 遂宁市| 龙里县| 冷水江市| 西乌珠穆沁旗| 航空| 临夏市| 含山县| 延吉市| 邹城市| 白城市| 正阳县| 甘南县| 上栗县| 丰镇市| 阿合奇县| 九龙城区| 香格里拉县| 彝良县| 保德县| 思茅市| 晋宁县| 三原县| 仙游县| 和平县| 柞水县| 长子县| 仪征市| 海淀区| 射阳县| 鄂尔多斯市| 丹凤县| 宣城市| 方正县| 文山县| 唐河县|