欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

redux異步操作的示例分析-創(chuàng)新互聯(lián)

小編給大家分享一下redux異步操作的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

十余年的沈北新網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。全網(wǎng)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整沈北新建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“沈北新網(wǎng)站設(shè)計”,“沈北新網(wǎng)站推廣”以來,每個客戶項目都認(rèn)真落實執(zhí)行。

一、redux基礎(chǔ)

redux

  • 通過 dispatch(action) -> 中間件 -> reducer處理數(shù)據(jù) -> 改變store -> 使用subscribe()監(jiān)聽store改變更新視圖 的方式管理狀態(tài)

  • 將所有狀態(tài)存儲在一個store對象里面

  • reducer為純函數(shù),而異步操作由于結(jié)果的不確定性所以含有副作用,所以需要特殊處理

react-redux
容器組件,負(fù)責(zé)管理數(shù)據(jù)和業(yè)務(wù)邏輯,不負(fù)責(zé)UI呈現(xiàn)
UI組件,提供UI呈現(xiàn),無狀態(tài)即不使用this.state,狀態(tài)全部由this.props提供
由connect生成容器組件,每次store改變會調(diào)用connect,connect接收兩個參數(shù): mapStateToProps, mapDispatchToProps
mapStateToProps,將狀態(tài)映射到UI組件的props
mapDispatchToProps,將dispatch方法映射到UI組件的props
Provider組件,使用content API將store從頂層開始傳到每一層component供connect使用

二、redux處理異步的中間件

redux-thunk
redux-thunk中間件允許action是一個方法
中間件收到action后會執(zhí)行action方法并將結(jié)果提供給reducer
action混亂導(dǎo)致不易維護
redux-saga
saga會監(jiān)聽action并基于這個action執(zhí)行Effects操作
Effects提供靈活的API,包括阻塞、非阻塞調(diào)用,取消、等待、race等操作
方便隔離并執(zhí)行異步操作,并易于測試

三、redux-request-async-middleware

先從redux文檔中的異步action說起,每個接口調(diào)用需要dispatch三個同步action,分別是:
一種通知 reducer 請求開始的 action。對于這種 action,reducer 可能會切換一下 state 中的 isFetching 標(biāo)記。以此來告訴 UI 來顯示加載界面。
一種通知 reducer 請求成功的 action。對于這種 action,reducer 可能會把接收到的新數(shù)據(jù)合并到 state 中,并重置 isFetching。UI 則會隱藏加載界面,并顯示接收到的數(shù)據(jù)。
一種通知 reducer 請求失敗的 action。對于這種 action,reducer 可能會重置 isFetching。另外,有些 reducer 會保存這些失敗信息,并在 UI 里顯示出來。
也就是一個接口發(fā)起是這樣的

dispatch(fetchPostsRequest(subject));
fetch(url).then(res => {
  dispatch(fetchPostsSuccess(subject, res));
}).catch(e => {
  dispatch(fetchPostsFailure(subject, e));
})

只是將這個操作封裝進(jìn)中間件里,特殊的地方在于:

  • 所有的異步請求共用這三個action

  • 用subject來區(qū)分是哪一個請求

  • 將所有的結(jié)果都放到store.requests里

中間件源碼

export const reduxRequest = store => next => action => {
  let result = next(action);
  let { type, subject, model } = action;
  let _next = action.next;
  if(type === FETCH_POSTS_REQUEST) {
    model().then(response => {
      _next && _next(response);
      store.dispatch(fetchPostsSuccess(subject, response));
    }).catch(error => {
      console.error(error);
      store.dispatch(fetchPostsFailure(subject, error));
    });
  }
  return result
};/
  • 和redux-thunk一樣,將方法放進(jìn)action里

  • 中間件攔截FETCH_POSTS_REQUEST action,并進(jìn)行異步處理

reducer源碼

export const requests = (state = {}, action) => {
  switch (action.type) {
    case FETCH_POSTS_REQUEST:
      return assign({},
        state,
        {
          [action.subject]: {
            isFetching: true,
            state: 'loading',
            subject: action.subject,
            response: null,
            error: null,
          }
        }
      );
    case FETCH_POSTS_FAILURE:
      return assign({},
        state,
        {
          [action.subject]: {
            isFetching: false,
            state: 'error',
            subject: action.subject,
            response: state[action.subject].response,
            error: action.error,
          }
        }
      );
    case FETCH_POSTS_SUCCESS:
      return assign({},
        state,
        {
          [action.subject]: {
            isFetching: false,
            state: 'success',
            subject: action.subject,
            response: action.response,
          }
        }
      );
    case FETCH_POSTS_CLEAR:
      return assign({},
        state,
        {
          [action.subject]: {
            isFetching: false,
            state: 'cleared',
            subject: null,
            response: null,
            error: null,
          }
        }
      )
      return state;
  }
}
  • 將結(jié)果放入該subject對應(yīng)下的response,如果錯誤的話將錯誤信息放入error當(dāng)中

  • isFetching表示當(dāng)前的請求狀態(tài)

  • 另外還加入了當(dāng)前的狀態(tài)state和subject信息

將請求進(jìn)行封裝

const request = (subject, model, next) => {
  _dispatch(fetchPostsRequest(subject, model, next));
  return true;
};
  • 寫一個方法來發(fā)起FETCH_POSTS_REQUEST action

  • 也就是說寫請求的時候不用再管action這東西了,直接調(diào)用request方法

將結(jié)果進(jìn)行封裝

const getResponse = state =>
  state
  && state.response !== null
  && state.response;
 
const getLoading = (states = []) =>
  states.reduce((pre, cur) =>
    pre || (cur && cur.isFetching)
    , false)
  || false;
  1. 可以獲取結(jié)果和多個請求下loading的狀態(tài)

  2. 有更多的操作或者格式還可以繼續(xù)封裝,比如列表

四、總結(jié)

  1. 使用了redux來進(jìn)行狀態(tài)管理,而并不需要編寫redux那一套復(fù)雜邏輯,大程度的減少異步操作的復(fù)雜度

  2. 適用于前端通過接口來處理和存儲數(shù)據(jù)的項目

  3. 接口由redux處理,而視圖組件由內(nèi)部state來處理,而外部只暴露簡單的接口來進(jìn)行操作,分離業(yè)務(wù)層和視圖層

  4. 對比react 16.3 new content API,redux的優(yōu)勢在于熱插播的中間件和純函數(shù)reducer寫法

以上是“redux異步操作的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)網(wǎng)站制作公司行業(yè)資訊頻道!

新聞標(biāo)題:redux異步操作的示例分析-創(chuàng)新互聯(lián)
分享地址:http://aaarwkj.com/article0/dsjpio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站面包屑導(dǎo)航、建站公司關(guān)鍵詞優(yōu)化、App設(shè)計、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護公司
亚洲黄色av乱码在线观看| 国产综合精品一区二区| 精品久久久久久亚洲野狼| 欧美精品激情在线不卡| 欧美另类不卡在线观看| 日本一区二区欧美在线| 日韩av高清免费播放| 国产亚洲av一区二区三区| 99久久夜国产精品| 一二区中文字幕在线观看| 加勒比久久精品网址系列| 亚洲精品入口一区二区| 亚洲一级特黄高清录像| 日本加勒比一本在线观看| 亚洲二区三区四区在线| 韩国三级在线视频网站| 蜜臀国产午夜在线视频| 清纯唯美校园春色亚洲激情| av国产剧情在线观看| 国产女主播在线观看免费观看 | 国产一区在线免费在线观看| 日韩版色视频在线观看| 国产黄片自拍视频免费看| 国产精品97久久97久久久久| 亚洲国产日韩精品久久| 九九热这里面只有精品| 精品少妇人妻av免费久久久| 日韩激情小视频在线观看| 蜜臀av午夜福利在线| 四虎成人免费永久视频| 尤物视频网站在线观看| 国产一区免费二区三区四区| 日韩av一区二区在线| 亚洲成人av毛片在线观看| 亚洲精品香蕉久久情趣| 亚洲精品国产av成人网| 国语对白刺激真实精品| 亚洲亚洲精品av在线动| 丰满少妇一区二区三区在线观看| 禁止未满十八在线观看| 久久热久久热精品视频|