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

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免费久久| 国产综合一区在线观看97| 人妻中字幕出轨中文字幕| 亚洲黄色av一区二区三区| 国产精品福利午夜在线| 日本道欧美一区二区aaaa| 九色视频在线观看91| 自拍国语对白在线视频| 九九热久久这里全是精品| 精品久久久久久久中文字幕| 亚洲国产精品综合久久网络| 精品人妻一区两区三区| 成人在线一区二区三区观看 | 欧美特黄在线免费观看| 亚洲av男人的天堂看| 午夜视频在线观看黄片| 人妻一本久道久久综合鬼色| 精品福利视频蜜臀91| 好色人妻在线播放中文字幕| 日本一区不卡二区高清| 欧美色视频综合在线观看| 国产亚洲av一区二区三区| 日韩乱码高清一本免费啪| 伊人久久九九精品综合| 三级av电影中文字幕| 91九色精品视频在线观看| 亚洲不卡在线免费av| 日本亚洲一区二区在线观看| 欧美一区二区三区日韩精品| av成熟一区二区三区| 欧美伦理片三级在线观看| 九九精品在线观看视频| 在线不卡日本v二区| 日韩人妻一级免费视频| 久久精品亚洲精品毛片| 日韩欧美一区二区大片|