Redux完整例子

一、结构
Redux主要由这几部分构成
1.Container(card.js)
2.Action (cardAction.js)
3.Reducer (cardReducer.js)
4.Saga (cardSaga.js)
这几个文件分别起什么作用不赘述了。
下面我直接进入实例:在前端获取我们账户绑定的银行卡信息。(后台到前端数据传递)

二、Action部分

根据功能要求,我们在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的作用就是监听SHOW_BANK_CARD_DATA,当这个动作发生了,就调服务端的数据。
SHOW_BANK_CARD_DATA在cardSaga.js被调用,

具体实现:
1.我们在cardSaga.js中设置watchGetAllBankCardData()函数来监听SHOW_BANK_CARD_DATA动作。
2.监听到container发来的动作后,我们调用getAllBanks()函数,来访问BankModel.allBanks这个API接口。
3.把从API接口传来的后台数据保存成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}),   // 根据银行卡号,返回银行名
    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怎么发出的SHOW_BANK_CARD_DATA这个动作的呢。

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

从代码中我们能看出,组件被构造出来之后我们调用了cardAction.js中传来的函数this.props.actions.getShowBankCardData()来执行SHOW_BANK_CARD_DATA动作。

除了这种方式,我们还能把动作和前端绑起来,比如按下某个按钮,就执行某个动作。例如我们的DELETE_ONE_BANK_CARD动作就是在按下按钮后执行的。

 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设置的很有讲究:
status为0的时候,说明与后台访问成功(这是后端程序员规定的),返回status和data。
status非0的时候,说明与后台访问失败(这是后端程序员规定的),返回status和msg。
这说明data携带的是json传来的数据,而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本身的值。这点体现了reducer作为一个纯函数,每次输出的值不受先前的值影响。
经过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的数据传到前端了

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

结语:麻雀虽小,五脏俱全。本文没涉及store以及Action,Reducer绑定Container,因为那太简单了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容