Redux完整例子

一井厌、結(jié)構(gòu)
Redux主要由這幾部分構(gòu)成
1.Container(card.js)
2.Action (cardAction.js)
3.Reducer (cardReducer.js)
4.Saga (cardSaga.js)
這幾個文件分別起什么作用不贅述了症歇。
下面我直接進入實例:在前端獲取我們賬戶綁定的銀行卡信息膜蠢。(后臺到前端數(shù)據(jù)傳遞)

二、Action部分

根據(jù)功能要求旬蟋,我們在cardAction.js中這樣寫

//cardAction.js
export const SHOW_BANK_CARD_DATA = 'SHOW_BANK_CARD_DATA';
export const SHOW_BANK_CARD_DATA_SUCCESS = 'SHOW_BANK_CARD_DATA_SUCCESS';

export function getShowBankCardData(){
    return {type: SHOW_BANK_CARD_DATA}
}

SHOW_BANK_CARD_DATA-------------動作:讀取銀行卡SHOW_BANK_CARD_DATA_SUCCESS------------動作:銀行卡被成功讀取

三褒墨、Saga部分

cardSaga.js的作用就是監(jiān)聽SHOW_BANK_CARD_DATA,當這個動作發(fā)生了淹魄,就調(diào)服務(wù)端的數(shù)據(jù)。
SHOW_BANK_CARD_DATA在cardSaga.js被調(diào)用堡距,

具體實現(xiàn):
1.我們在cardSaga.js中設(shè)置watchGetAllBankCardData()函數(shù)來監(jiān)聽SHOW_BANK_CARD_DATA動作甲锡。
2.監(jiān)聽到container發(fā)來的動作后,我們調(diào)用getAllBanks()函數(shù)羽戒,來訪問BankModel.allBanks這個API接口缤沦。
3.把從API接口傳來的后臺數(shù)據(jù)保存成json文件傳遞給SHOW_BANK_CARD_DATA_SUCCESS。

//cardSaga.js
function* getAllBanks(){
    let json = yield call(BankModel.allBanks);
    yield put({
        type: actions.SHOW_BANK_CARD_DATA_SUCCESS,
        json: json
    })
}
export function* watchGetAllBankCardData(){
    yield takeEvery(actions.SHOW_BANK_CARD_DATA, getAllBanks)
}
//存API的.js文件
export var BankModel = {
    getBankName:(card_id)=>_api("GET", API("/api/v1/bank/searchbank"),{card_id}),   // 根據(jù)銀行卡號半醉,返回銀行名
    confirmAddBank:(card_id, cardholder, bank_name)=>_api("GET", API("/api/v1/bank/addcard"),{card_id, cardholder, bank_name}),   // 添加銀行卡
    allBanks:()=>_api("GET", API("/api/v1/bank/allbanks")),   //獲取已綁定的所有銀行卡信息
    deleteOneInfo: (id)=>_api("GET", API("/api/v1/bank/deleteoneinfo"),{id}),    //刪除一條銀行卡信息
    chooseCashoutCard: (id)=>_api("GET", API("/api/v1/bank/choosecashoutcard"),{id})
    };

四疚俱、By the way
這里有個問題,container怎么發(fā)出的SHOW_BANK_CARD_DATA這個動作的呢缩多。

//card.js
class ShowBankCardContainer extends React.Component{
    constructor(props){
        super(props);
        this.props.actions.getShowBankCardData();
    }

從代碼中我們能看出呆奕,組件被構(gòu)造出來之后我們調(diào)用了cardAction.js中傳來的函數(shù)this.props.actions.getShowBankCardData()來執(zhí)行SHOW_BANK_CARD_DATA動作。

除了這種方式衬吆,我們還能把動作和前端綁起來梁钾,比如按下某個按鈕,就執(zhí)行某個動作逊抡。例如我們的DELETE_ONE_BANK_CARD動作就是在按下按鈕后執(zhí)行的姆泻。

 delete(id, index) {
        this.props.actions.deleteBankCard(id, index);
    }
<button onClick={this.delete.bind(this,item.id, index)}>

五、Reducer部分
我們拿到后臺傳來的json后冒嫡,通過cardReducer.js進行處理拇勃。

1.我們先初始化allcards這個state對象,并用status,msg,data這三個子state來接收json孝凌。這三個state設(shè)置的很有講究:
status為0的時候方咆,說明與后臺訪問成功(這是后端程序員規(guī)定的),返回status和data蟀架。
status非0的時候瓣赂,說明與后臺訪問失斢苌А(這是后端程序員規(guī)定的),返回status和msg煌集。
這說明data攜帶的是json傳來的數(shù)據(jù)妓肢,而msg是json傳來的訪問失敗錯誤信息,status攜帶的是指示(本例中為0 / 1)苫纤。

//cardReducer.js
const initialState = {
    allcards: {
        status: 1,
        msg: '',
        data: [],   // 所有綁定的銀行卡信息
    },
export function showBankCardReducer(state=initialState, action){
    switch(action.type){
    case showBankCardActions.SHOW_BANK_CARD_DATA_SUCCESS:
            let allcards_status = action.json.status;
            if (allcards_status !== 0){
                let allcards = {status: allcards_status,msg:action.json.msg};
                return Object.assign({}, state, {allcards})
            }else{
                let allcards = {status: allcards_status, data: action.json.data};
                return Object.assign({}, state, {allcards})
            }
        default:
             return state
        }
    }

2.我們把allcards和state的值傳給了{}碉钠,而不是把allcards傳給state,為了不改變state本身的值方面。這點體現(xiàn)了reducer作為一個純函數(shù)放钦,每次輸出的值不受先前的值影響色徘。
經(jīng)過reducer處理后恭金,我們在container即card.js中拿到這些state

//cardReducer.js
 return Object.assign({}, state, {allcards})
//card.js
function mapStateToProps(state){
    const allcards = state.showBankCardReducer.allcards;
    return {
        allcards
    }
}

3.這樣我們就能用this.props.allcards.data把allcards的數(shù)據(jù)傳到前端了

//card.js
<p>this.props.allcards.data</p>

結(jié)語:麻雀雖小,五臟俱全褂策。本文沒涉及store以及Action,Reducer綁定Container横腿,因為那太簡單了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末斤寂,一起剝皮案震驚了整個濱河市耿焊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌遍搞,老刑警劉巖罗侯,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異溪猿,居然都是意外死亡钩杰,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門诊县,熙熙樓的掌柜王于貴愁眉苦臉地迎上來讲弄,“玉大人,你說我怎么就攤上這事依痊”艹” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵胸嘁,是天一觀的道長瓶摆。 經(jīng)常有香客問我,道長性宏,這世上最難降的妖魔是什么群井? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮衔沼,結(jié)果婚禮上蝌借,老公的妹妹穿的比我還像新娘昔瞧。我一直安慰自己,他們只是感情好菩佑,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布自晰。 她就那樣靜靜地躺著,像睡著了一般稍坯。 火紅的嫁衣襯著肌膚如雪酬荞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天瞧哟,我揣著相機與錄音混巧,去河邊找鬼。 笑死勤揩,一個胖子當著我的面吹牛咧党,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播陨亡,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼傍衡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了负蠕?” 一聲冷哼從身側(cè)響起蛙埂,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎遮糖,沒想到半個月后绣的,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡欲账,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年屡江,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敬惦。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡盼理,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出俄删,到底是詐尸還是另有隱情宏怔,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布畴椰,位于F島的核電站臊诊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏斜脂。R本人自食惡果不足惜抓艳,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望帚戳。 院中可真熱鬧玷或,春花似錦儡首、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至位他,卻和暖如春氛濒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鹅髓。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工舞竿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人窿冯。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓骗奖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親靡菇。 傳聞我的和親對象是個殘疾皇子重归,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

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