对于react-redux的理解梳理

由于前段时间做react的一个框架,顺便用上了react-redux,在这里将自己的理解记录下来,给自己增加些印象,顺便希望能帮助一些使用react-redux的萌新们。

网上已有大堆资料介绍react-redux,它是redux和react结合的一个框架,我们可以说是用来专门管理自己数据业务(或逻辑状态)的一个框架。所以在这里我们首先过一遍redux是什么?

redux

redux就是用来统一管理项目中的状态(state)。state它可以是前后端的各种数据,也可以是UI上的一些信息。简单点,它就是个对象,包含了项目中可能用于改变的一些信息。

redux重要关注的几点:ActionsReducersStore,下面就分别来看看吧。

1、Actions:

function changeTable(index) {
        return { type: "channgTable", data:index }
}

以上例子就是一个action,我们不用纠结它定义个一个函数形式还是其它,最终它就是一个对象。包含type、data或者还有其他元素的对象。

action就是用来告诉我们的状态管理器需要做什么样的一种操作。拿以上例子来说,就是为了做一个切换table的操作,那么我就定义了这么一个action。data就是你做这个操作需要处理的一些数据等。

2、Reducers :

const reducer = function(state={"tableIndex":0}, action={}) {
        switch(action.type){
              //当发出type为changeTable的action对state的操作
              case "changeTable":
                    let backup = state;
                    backup["tableIndex"] = action.data;
                    return Object.assign({}, state,backup);
              default :
                    return Object.assign({}, state);
        }
}

以上例子就是一个reducer,它是一个会对不同action做出不同操作的函数。

如当我发出切换table的action时,就是把我们之前定义action的data传递给state下的tableIndex变量,用来告诉state,我要切换table的序号。

在没有任何操作情况下,我们返回初始的state。

我们不直接去改变state的值,而是返回一个新的对象,保持state的唯一性。缓存可以在这里做,后面会有叙述

3、Store:

var store = createStore(reducer);

这就是Store了,用来管理state的单一对象。其中有三个方法:

  • store.getState():获取state,如上,经过reducer已经返回了一个新的state,那么就可以用该函数获取;
  • store.dispatch(action):发出操作,更新state。action内有操作的类型,就可以出发不同的对state的更新;
  • store.subscribe(listener):监听变化,当state发生更新时,就可以在这个函数的回调中监听。

上述为基本redux的用法和含义,发出的操作也是同步的,如要更深入了解异步操作和对state更合理的逻辑管理,可以查看Middleware、combineReducers函数等,本文不再详述。

react-redux

讲完了基本的redux,那么理解和react结合就简单的多了。

在使用react-redux之前,别忘了下载该模块。

react-redux在redux的基础上,就关注两点:Providerconnect

1、Provider:

<Provider store={store}>
    <Router ref="router" history={hashHistory}>
        <Route path='/' component={Index}>
            <IndexRoute  component={MainPage}></IndexRoute>
        </Route>
    </Router>
</Provider>

Provider就是把我们用rudux创建的store传递到内部的其他组件。让内部组件可以享有这个store并提供对state的更新。

2、connect:

export default connect(mapStateToProps,mapDispatchToProps)(MainPage);

connect()一共有四个参数,但我这里只说基本的两个,mapStateToPropsmapDispatchToProps

  • mapStateToProps:简单来说,就是把状态绑定到组件的属性当中。我们定义的state对象有哪些属性,在我们组件的props都可以查阅和获取。

    const mapStateToProps = (state, ownProps) => {
          return {tableIndex:state.tableIndex}
    }
    
查看props

在props中,我们就看到了我们绑定的状态。

它的初值就是reducer默认返回state中的值。

  • mapDispatchToProps:在redux中介绍过,用store.dispatch(action)来发出操作,那么我们同样可以把这个方法封装起来,即绑定到我们的方法中。

    const mapDispatchToProps = (dispatch, ownProps) => {
        return {
            changeActive:(args)=>dispatch({type:"changeTable",data:args})
        }
    }
    

可以看到,这个方法return的就是一个dispatch函数,将该方法绑定到属性上,我们同样可以在props查看和调用。

查看props

这样,我们只要在组件中调用该属性中的方法,就可以发出一个特定的action,触发reducer对state进行更新。这里的reducer就是之前在redux中定义的reducer。

这时候state如果发生更新,因为我们已经把state也绑定到props中,那么会把这些新的props重新传递下去,组件会进行更新渲染,达到我们需要的目的。

如果需要缓存怎么办?

还记得我们定义的reducer么。我们只需要将最新的状态存起来(无论是sessionStorage、数据库还是其它),然后默认的state去取缓存过的状态进行初始化渲染即可。

 const reducer = function(state={"tableIndex":0}, action={}) {
        switch(action.type){
              //当发出type为changeTable的action对state的操作
              case "changeTable":
                    let backup = state;
                    backup["tableIndex"] = action.data;       
                    //定义新的state,用于存储                           
                    let newState = Object.assign({}, state,backup);
                    sessionStorage.setItem("state",JSON.stringify(newState));
                    return newState;
              default :
                    if(sessionStorage.getItem("state")){
                    //获取缓存过的state
                          return Object.assign({},JSON.parse(sessionStorage.getItem("state")));
                    }else{
                          return Object.assign({}, state);
                    }
        }
}

其实react-redux中还有许多可用配置的参数和方法。越是复杂的项目,用起来会越清晰。本文只是一些基本用法的梳理,更深的了解可访问:https://github.com/reactjs/react-redux 等其他在线资料。

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

推荐阅读更多精彩内容