dva-loading 實踐用法

dva 中頁面過渡效果封裝的很好饺蚊,下面介紹常用的兩個 js 庫。

之前對 dva-loading 理解存在誤區(qū)亥宿,認為只要在 index.js 中配置一下就沒事了卸勺,事實上 dva-loading 只是提供當前異步加載方法的狀態(tài)(異步加載中狀態(tài)為 true,異步加載完成狀態(tài)為 false)烫扼,對應(yīng)加載樣式由各自組件自己控制曙求,如:Antd 中 Table 組件自身的 loading 屬性。并添加完整流程示例代碼映企。

一悟狱、過渡組件 dva-loading

傳統(tǒng)做法

比如請求一個用戶頁面,剛進去的時候由于要去服務(wù)器請求數(shù)據(jù)需要花費時間堰氓,這段時間頁面應(yīng)該是不能點擊的狀態(tài)挤渐。

如果不使用這個組件,傳統(tǒng)做法是寫個蒙版組件双絮,提供兩個方法 start() 和 end()浴麻,當進行 ajax 請求開始時調(diào)用 start() 方法給整個頁面加上一層蒙版,此時不能進行操作囤攀,在請求結(jié)束也就是 ajax 的 success 回調(diào)函數(shù)中調(diào)用 end() 方法關(guān)閉蒙版软免,表明數(shù)據(jù)已經(jīng)請求到了,可以操作頁面焚挠。

作用

該組件僅僅監(jiān)聽異步加載狀態(tài)膏萧,這從它的調(diào)用方式就可以看出來 const isLoading = loading.effects['user/query'],其中 user/query 是 model 中的異步請求方法蝌衔。

loading 在異步請求發(fā)出那一刻會持續(xù)監(jiān)聽該異步請求方法的狀態(tài)榛泛,在異步請求結(jié)束之前 isLoading 的值一直是 true,當此次異步請求結(jié)束時 isLoading 的值變成 false噩斟,同時 loading 對象停止監(jiān)聽曹锨。

配置

dva 項目的 index.js 文件:

import createLoading from 'dva-loading';

const app = dva();

app.use(createLoading());

配置完成后,在任何一個 dva 的 routes 組件中就都會有一個 loading 對象亩冬,如果你對 dva 稍有了解的話艘希,應(yīng)該不難知道它在哪。比如下面這行代碼中的 loading 對象就是由于上面的配置硅急。

export default connect(({ app, loading }) => ({ app, loading }))(App);

打印一下 loading 對象覆享,可看到內(nèi)容如下:

loading: {
  global: false,
  models: {app: false},
  effects: {app: false}
}

loading 有三個方法,其中 loading.effects['user/query'] 為監(jiān)聽單一異步請求狀態(tài)营袜,當頁面處于異步加載狀態(tài)時該值為 true撒顿,當頁面加載完成時,自動監(jiān)聽該值為 false荚板。

如果同時發(fā)出若干個異步請求凤壁,需求是當所有異步請求都響應(yīng)才做下一步操作吩屹,可以使用 loading.global() 方法,該方法監(jiān)聽所有異步請求的狀態(tài)拧抖。

怎么用煤搜?

使用 Antd 的 Table 組件 時,查閱 API 可以看到有個 loading 的屬性唧席。如果該屬性值為 true擦盾,Table 組件自身會顯示加載效果,該值為 false淌哟,加載效果消失迹卢。可以通過 loading 對象判斷當前是否有異步加載徒仓。具體示例代碼如下:

// src > models >user.js
export default {
  namespace: 'user',
  state: {
    userList: [],      // 存放用戶列表
  },
  effects: {
    * query ({ payload = {} }, { call, put }) {
      // 獲取用戶列表腐碱,賦值給 userList
      // 使用 axios 或者 ajax 請求后臺返回數(shù)據(jù)
      const result = axios.request('xxx/xxx');
      // 調(diào)用 reducers 中的 updateState 方法改變 state 中 userList 的值
      yield put({ type: 'updateState', payload: { userList: result.data });
    }
  },
  reducers: {
    updateState (state, { payload }) {
      return { ...state, ...payload };
    },
  },
}
// src > routes > user.js
import React from 'react';
import { connect } from 'dva';
import { Table } from 'antd';

const User = ({ dispatch, user, loading }) => {
  /** 
    根據(jù) loading.effects 對象判斷當前異步加載是否完成,并將該值傳遞給 Table 組件的 loading 屬性掉弛,
    Table 組件會自己控制加載樣式症见。dva-loading 在這里的作用只是提供異步加載的狀態(tài),
    具體加載樣式由對應(yīng)組件自己提供殃饿。
  */
  const isLoading = loading.effects['user/query']
  const { userList } = user

  return (
    <Table
      dataSource={userList}
      loading={isLoading}
      rowKey={record => record.id}
    />
  );
}

export default connect(({ user, loading }) => ({ user, loading }))(User);

注:如果還有疑問筒饰,可下方留言。

二壁晒、動畫組件 nprogress

安裝

$ npm install nprogress 

作用

制作頁面加載時動態(tài)頁面,在頁面頂端提供動態(tài)進度條业栅,表明當前頁面正在加載狀態(tài)秒咐。

nprogress

用法

xx.js 中

import NProgress from 'nprogress';

提供了兩個方法:NProgress.start() 和 NProgress.done()。

在剛開始請求(可以認為是 ajax 請求)頁面數(shù)據(jù)時調(diào)用 NProgress.start() 方法碘裕,此時頁面頂端會有藍色動態(tài)進度條携取;在頁面請求數(shù)據(jù)完畢時(可以認為是 ajax 的 success 回調(diào)函數(shù)),調(diào)用 NProgress.done() 方法帮孔,此時藍色進度條會瞬間加載 100% 然后消失雷滋。

三、dva-loading 和 nprogress 配合使用

index.js 中注冊 dva-loading 插件文兢。

import createLoading from 'dva-loading';

const app = dva();

app.use(createLoading());

app.js 組件中使用晤斩。

import React from 'react';
import { connect } from 'dva';
import NProgress from 'nprogress';

const App= ({ app, loading }) => {

    let currHref = '';
    const href = window.location.href;    // 瀏覽器地址欄中地址
    if (currHref !== href) {  // currHref 和 href 不一致時說明進行了頁面跳轉(zhuǎn)
        NProgress.start();    // 頁面開始加載時調(diào)用 start 方法
        if (!loading.global) {  // loading.global 為 false 時表示加載完畢
            NProgress.done();  // 頁面請求完畢時調(diào)用 done 方法
            currHref = href;   // 將新頁面的 href 值賦值給 currHref
        }
    }
        
}

export default withRouter(connect(({ app, loading }) => ({ app, loading }))(App));
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市姆坚,隨后出現(xiàn)的幾起案子澳泵,更是在濱河造成了極大的恐慌,老刑警劉巖兼呵,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兔辅,死亡現(xiàn)場離奇詭異腊敲,居然都是意外死亡,警方通過查閱死者的電腦和手機维苔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門碰辅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人介时,你說我怎么就攤上這事没宾。” “怎么了潮尝?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵榕吼,是天一觀的道長。 經(jīng)常有香客問我勉失,道長羹蚣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任乱凿,我火速辦了婚禮顽素,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘徒蟆。我一直安慰自己胁出,他們只是感情好,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布段审。 她就那樣靜靜地躺著全蝶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寺枉。 梳的紋絲不亂的頭發(fā)上抑淫,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音姥闪,去河邊找鬼始苇。 笑死,一個胖子當著我的面吹牛筐喳,可吹牛的內(nèi)容都是我干的催式。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼避归,長吁一口氣:“原來是場噩夢啊……” “哼荣月!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起槐脏,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤喉童,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體堂氯,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡蔑担,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了咽白。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啤握。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖晶框,靈堂內(nèi)的尸體忽然破棺而出排抬,到底是詐尸還是另有隱情,我是刑警寧澤授段,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布蹲蒲,位于F島的核電站,受9級特大地震影響侵贵,放射性物質(zhì)發(fā)生泄漏届搁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一窍育、第九天 我趴在偏房一處隱蔽的房頂上張望卡睦。 院中可真熱鬧,春花似錦漱抓、人聲如沸表锻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瞬逊。三九已至,卻和暖如春仪或,著一層夾襖步出監(jiān)牢的瞬間码耐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工溶其, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人敦间。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓瓶逃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親廓块。 傳聞我的和親對象是個殘疾皇子厢绝,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法带猴,內(nèi)部類的語法昔汉,繼承相關(guān)的語法,異常的語法拴清,線程的語...
    子非魚_t_閱讀 31,581評論 18 399
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,510評論 25 707
  • 文字記錄于今年2月靶病。 剛看過愛樂之城会通。 看過好幾篇影評,所以故事情節(jié)早就被劇透光光娄周。好評差評都如潮涕侈。 身邊看過的朋...
    懂大瞎閱讀 657評論 2 1
  • 1 昨天下班前就明確了今天要吃掉的三尺青蛙:明天開庭的資料準備和律師回復(fù)意見的反饋裳涛;通知工會解除關(guān)聯(lián)的材料簽字確認...
    冬冬Steven閱讀 200評論 0 1
  • 說您是故事高手端三,有人說現(xiàn)代人必須會講故事,講故事是未來10年不會失業(yè)的技能鹃彻,請您用故事回答為什么我們要學(xué)會講故事郊闯。...
    lucky杰_54b2閱讀 324評論 0 0