摘要:一種通知請求成功的。對于這種,可能會把接收到的新數(shù)據(jù)合并到中,并重置。另外,有些會保存這些失敗信息,并在里顯示出來。
一、redux基礎(chǔ) redux
通過 dispatch(action) -> 中間件 -> reducer處理數(shù)據(jù) -> 改變store -> 使用subscribe()監(jiān)聽store改變更新視圖 的方式管理狀態(tài)
將所有狀態(tài)存儲在一個(gè)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接收兩個(gè)參數(shù): mapStateToProps, mapDispatchToProps
mapStateToProps,將狀態(tài)映射到UI組件的props
mapDispatchToProps,將dispatch方法映射到UI組件的props
Provider組件,使用content API將store從頂層開始傳到每一層component供connect使用
二、redux處理異步的中間件 redux-thunkredux-thunk中間件允許action是一個(gè)方法
中間件收到action后會執(zhí)行action方法并將結(jié)果提供給reducer
action混亂導(dǎo)致不易維護(hù)
redux-sagasaga會監(jiān)聽action并基于這個(gè)action執(zhí)行Effects操作
Effects提供靈活的API,包括阻塞、非阻塞調(diào)用,取消、等待、race等操作
方便隔離并執(zhí)行異步操作,并易于測試
三、redux-request-async-middleware 先從redux文檔中的異步action說起,每個(gè)接口調(diào)用需要dispatch三個(gè)同步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 里顯示出來。
也就是一個(gè)接口發(fā)起是這樣的
dispatch(fetchPostsRequest(subject)); fetch(url).then(res => { dispatch(fetchPostsSuccess(subject, res)); }).catch(e => { dispatch(fetchPostsFailure(subject, e)); })而我做的事情只是將這個(gè)操作封裝進(jìn)中間件里,特殊的地方在于:
所有的異步請求共用這三個(gè)action
用subject來區(qū)分是哪一個(gè)請求
將所有的結(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, } } ); default: 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; };
寫一個(gè)方法來發(fā)起FETCH_POSTS_REQUEST action
也就是說寫請求的時(shí)候不用再管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;
可以獲取結(jié)果和多個(gè)請求下loading的狀態(tài)
有更多的操作或者格式還可以繼續(xù)封裝,比如列表
使用方法redux-request-async-middleware 四、總結(jié)使用了redux來進(jìn)行狀態(tài)管理,而并不需要編寫redux那一套復(fù)雜邏輯,最大程度的減少異步操作的復(fù)雜度
適用于前端通過接口來處理和存儲數(shù)據(jù)的項(xiàng)目
接口由redux處理,而視圖組件由內(nèi)部state來處理,而外部只暴露簡單的接口來進(jìn)行操作,分離業(yè)務(wù)層和視圖層
對比react 16.3 new content API,redux的優(yōu)勢在于熱插播的中間件和純函數(shù)reducer寫法
更多文章 yjy5264.github.io文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/108175.html
摘要:項(xiàng)目地址下載完項(xiàng)目然后即可基于的項(xiàng)目,主要是為了學(xué)習(xí)實(shí)戰(zhàn)。數(shù)據(jù)都是固定的,從餓了么接口臨時(shí)抓的,模擬了一個(gè)的異步數(shù)據(jù)延遲,感謝餓了么。詳細(xì)信息可以看上面的官方文檔,我這里就簡單說一下我這個(gè)項(xiàng)目的應(yīng)用。 react-ele-webapp 項(xiàng)目地址 :https://github.com/kliuj/reac... run 下載完項(xiàng)目npm install然后npm run dev 即可 ...
摘要:項(xiàng)目開發(fā)準(zhǔn)備描述項(xiàng)目技術(shù)選型接口接口文檔測試接口啟動項(xiàng)目開發(fā)使用腳手架創(chuàng)建項(xiàng)目開發(fā)環(huán)境運(yùn)行生產(chǎn)環(huán)境打包運(yùn)行管理項(xiàng)目創(chuàng)建遠(yuǎn)程倉庫創(chuàng)建本地倉庫配置將本地倉庫推送到遠(yuǎn)程倉庫在本地創(chuàng)建分支并推送到遠(yuǎn)程如果本地有修改新的同事克隆倉庫如果遠(yuǎn)程修 day01 1. 項(xiàng)目開發(fā)準(zhǔn)備 1). 描述項(xiàng)目 2). 技術(shù)選型 3). API接口/接口文檔/測試接口 2. 啟動項(xiàng)目開發(fā) 1). 使用react...
摘要:在上已經(jīng)有接近的數(shù)了,是目前最熱門的前端框架。惟一改變的辦法是觸發(fā),一個(gè)描述發(fā)生什么的對象。對對象的任何修改或添加刪除操作都會返回一個(gè)新的對象。從導(dǎo)入需要的類型初始化狀態(tài)就是一個(gè)純函數(shù),接收舊的和,返回新的。 React在Github上已經(jīng)有接近70000的 star 數(shù)了,是目前最熱門的前端框架。而我學(xué)習(xí)React也有一段時(shí)間了,現(xiàn)在就開始用 React+Redux 進(jìn)行實(shí)戰(zhàn)! Re...
摘要:作者小滬江前端開發(fā)工程師本文為原創(chuàng)文章,有不當(dāng)之處歡迎指出。于是,單一數(shù)據(jù)源規(guī)則實(shí)施起來,是規(guī)定用的頂層容器組件的來存儲單一對象樹,同時(shí)交給來管理。顧名思義,當(dāng)更新時(shí),的回調(diào)函數(shù)會更新視圖層,以達(dá)到訂閱的效果。 作者:小boy (滬江web前端開發(fā)工程師)本文為原創(chuàng)文章,有不當(dāng)之處歡迎指出。轉(zhuǎn)載請注明出處。文章示例代碼:https://github.com/ikcamp/rea... ...
摘要:它的作用就是像它的名字那樣,建立一個(gè)從外部的對象到組件的對象的映射關(guān)系。比如表示從整個(gè)的表示當(dāng)前組件容器的用來建立組件的參數(shù)到方法的映射比如表示它定義了哪些用戶的操作應(yīng)該當(dāng)作,傳給。 最近做的項(xiàng)目加入了react-redux,對react-redux一直沒理解透徹,最近有時(shí)間把react-redux梳理了一番,希望能夠幫助到大家, 首先有這幾個(gè)文件,action,reducer,sag...
閱讀 4183·2022-09-16 13:49
閱讀 1410·2021-11-22 15:12
閱讀 1532·2021-09-09 09:33
閱讀 1049·2019-08-30 13:15
閱讀 1737·2019-08-29 15:30
閱讀 668·2019-08-27 10:52
閱讀 2651·2019-08-26 17:41
閱讀 1907·2019-08-26 12:11