dva工具庫(kù)---探索dva-loading

前言

在使用antd pro的時(shí)候發(fā)現(xiàn)此框架的loading是使用dva自帶的dva-loading嗜憔。之前分析源碼的時(shí)候有看見幾個(gè)附帶工具,但沒有去研究下氏仗。今天好奇下dva-loading的實(shí)現(xiàn)吉捶。

開始

先從用法了解
loading是針對(duì)effects的,所以我們所有需要顯示loading的異步操作都需要寫在effects中才可以體現(xiàn)dva-loading的方便性皆尔,下面例子中呐舔,loading是針對(duì)namespace為form的model的submitStepForm的effect,

import createLoading from 'dva-loading';
...
app.use(createLoading());


...

@connect(({ form, loading }) => ({
  submitting: loading.effects['form/submitStepForm'],
  data: form.step,
}))

app.use是什么慷蠕,從源碼里知道珊拼,就是plugin.use,注冊(cè)對(duì)應(yīng)的插件鉤子的。所以createLoading返回的是

return {
    extraReducers,
    onEffect,
  };

extraReducers:加一個(gè)state流炕,默認(rèn)名字是loading澎现,可以createLoading時(shí)傳入{namespace:xxx}去覆蓋。

onEffect:是為了包裝所有的effect每辟,在執(zhí)行前后發(fā)出供上面reducers接收的action昔头。

所以先看前置onEffect

  1. 前面的if的條件是外部傳入的,可用此進(jìn)行優(yōu)化影兽,不然所有的effect都被重包裝
  2. 目標(biāo)effect執(zhí)行前揭斧,發(fā)出SHOW類型的action,結(jié)束后發(fā)出HIDE
  3. payload是model的namespace及effect的名字(在之前收集的時(shí)候,已經(jīng)給所有的effect加上namespace前綴)讹开。上面的例子就是{namespace:'form',actionType :'form/submitStepForm'}
function onEffect(effect, { put }, model, actionType) {
    const { namespace } = model;
    if (
        (only.length === 0 && except.length === 0)
        || (only.length > 0 && only.indexOf(actionType) !== -1)
        || (except.length > 0 && except.indexOf(actionType) === -1)
    ) {
        return function*(...args) {
            yield put({ type: SHOW, payload: { namespace, actionType } });
            yield effect(...args);
            yield put({ type: HIDE, payload: { namespace, actionType } });
        };
    } else {
        return effect;
    }
  }

到 extraReducers

  1. state說(shuō)明盅视,從內(nèi)到外,effects:可知道有哪些effect在loading旦万,models:可知道有哪些model在loading闹击,gobal有沒有在的loading的effect〕伤遥可以知道后面兩個(gè)可以從第一個(gè)推理得出赏半,但dva幫我們算出來(lái),有這兩個(gè)確認(rèn)會(huì)方便淆两,比如一個(gè)功能的數(shù)據(jù)由一個(gè)model(kk)控制断箫,這就可以不管有多少effect,都可以從loading.models['kk']中獲得該功能的loading狀態(tài)秋冰。
  2. 當(dāng)接收到SHOW的action仲义,會(huì):保存payload里的namespace與actionType,并設(shè)為true,表示namespace的model和actionType的effect在加載剑勾,global一定為true,有在進(jìn)行effect
  3. 當(dāng)接收到HIDE的action埃撵,會(huì): 把這個(gè)payload的effect名稱actionType設(shè)為false,表示該effect加載完,如果effects中找到有namespace前綴的在loading的effect,則該model也在loading中,如果models中找到有model在loading,則該全局loading中

 const initialState = {
    gobal: false, // 有沒有在的loading的effect
    models: {}, // 可知道有哪些model在loading
    effects: {}, // 可知道有哪些effect在loading
  };

  const extraReducers = {
    [namespace](state = initialState, { type, payload }) {
      const { namespace, actionType } = payload || {};
      let ret;
      switch (type) {
        // 保存payload里的namespace與actionType,并設(shè)為true,表示namespace的model和actionType的effect在加載虽另,
        // global一定為true,有在進(jìn)行effect
        case SHOW:
          ret = {
            ...state,
            global: true,
            models: { ...state.models, [namespace]: true },
            effects: { ...state.effects, [actionType]: true },
          };
          break;
        case HIDE: // eslint-disable-line
        //  把這個(gè)payload的effect名稱actionType設(shè)為false,表示該effect加載完
          const effects = { ...state.effects, [actionType]: false };
          // 如果effects中找到有namespace前綴的在loading的effect,則該model也在loading中
          const models = {
            ...state.models,
            [namespace]: Object.keys(effects).some((actionType) => {
              const _namespace = actionType.split('/')[0];
              if (_namespace !== namespace) return false;
              return effects[actionType];
            }),
          };
          // 如果models中找到有model在loading,則該全局loading中
          const global = Object.keys(models).some((namespace) => {
            return models[namespace];
          });
          ret = {
            ...state,
            global,
            models,
            effects,
          };
          break;
        default:
          ret = state;
          break;
      }
      return ret;
    },
  };

done

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末暂刘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子捂刺,更是在濱河造成了極大的恐慌谣拣,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叠萍,死亡現(xiàn)場(chǎng)離奇詭異芝发,居然都是意外死亡绪商,警方通過(guò)查閱死者的電腦和手機(jī)苛谷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)格郁,“玉大人腹殿,你說(shuō)我怎么就攤上這事±椋” “怎么了锣尉?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)决采。 經(jīng)常有香客問我自沧,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任拇厢,我火速辦了婚禮爱谁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘孝偎。我一直安慰自己访敌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布衣盾。 她就那樣靜靜地躺著寺旺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪势决。 梳的紋絲不亂的頭發(fā)上阻塑,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音徽龟,去河邊找鬼叮姑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛据悔,可吹牛的內(nèi)容都是我干的传透。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼极颓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼朱盐!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起菠隆,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤兵琳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后骇径,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體躯肌,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年破衔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了清女。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡晰筛,死狀恐怖嫡丙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情读第,我是刑警寧澤曙博,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站怜瞒,受9級(jí)特大地震影響父泳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一惠窄、第九天 我趴在偏房一處隱蔽的房頂上張望逝她。 院中可真熱鬧,春花似錦睬捶、人聲如沸黔宛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)臀晃。三九已至,卻和暖如春介劫,著一層夾襖步出監(jiān)牢的瞬間徽惋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工座韵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留险绘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓誉碴,卻偏偏與公主長(zhǎng)得像宦棺,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子黔帕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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

  • 筆者升級(jí)了 dva 的版本代咸,同時(shí)新增了 umi 的使用,具體可以參考這篇文章 dva理論到實(shí)踐——幫你掃清dva的...
    darrell閱讀 39,787評(píng)論 8 86
  • dva框架的使用詳解及Demo教程 在前段時(shí)間成黄,我們也學(xué)習(xí)講解過(guò)Redux框架的基本使用呐芥,但是有很多同學(xué)在交流群里...
    光強(qiáng)_上海閱讀 61,141評(píng)論 5 55
  • 前言 在學(xué)習(xí)antd的UI框架時(shí),了解到了dva這個(gè)輕量級(jí)的應(yīng)用框架奋岁,集成了react思瘟,redux,redux-s...
    Gary嘉駿閱讀 3,357評(píng)論 1 2
  • 麥祺的禮物: 男人愛女人闻伶, 女人愛男人滨攻, 窮, 女人有非常漂亮的頭發(fā)虾攻, 沒有發(fā)卡铡买; 男人有一塊祖?zhèn)鞯谋恚?沒有表鏈...
    Sarah瀟瀟閱讀 419評(píng)論 0 0
  • 我的淚------眼角無(wú)聲的滑落 初秋的夜 心卻被冰封凍 句句帶刺的話語(yǔ) 針針扎入結(jié)痂的裂心 這夜色化不開郁結(jié)的悶...
    靜若青蓮閱讀 369評(píng)論 0 5