react-redux中的connect方法解析

connect()react-redux中的核心方法之一,它將react組件預redux中的Store真正連接在一起

組件

React-Redux將所有組件分為兩大類:展示組件(UI組件)好芭,容器組件

展示組件有以下幾個特征:

只負責 UI 的呈現(xiàn)铁坎,不帶有任何業(yè)務邏輯
沒有狀態(tài)(即不使用this.state這個變量)
所有數(shù)據(jù)都由參數(shù)(this.props)提供
不使用任何 Redux 的 API

容器組件有以下幾個特征:

負責管理數(shù)據(jù)和業(yè)務邏輯,不負責 UI 的呈現(xiàn)
帶有內(nèi)部狀態(tài)
使用 Redux 的 API

總結(jié)為一點:** 展示組件負責 UI 的呈現(xiàn)犯祠,容器組件負責管理數(shù)據(jù)和邏輯**

connect方法解析

下圖是connect()的概念圖

react-redux connect - connect是什么.jpg

connect()簽名
connect([mapStateToProps], [mapDispatchToProps], [mergeProps], [options])

參數(shù)

[mapStateToProps(state, [ownProps]): stateProps] (Function):

  • mapStateToProps必須是一個Function,作用是綁定state的指定值到props
  • state: 監(jiān)聽Redux store的變化竿报。任何時候只要 Redux store發(fā)生改變俄删,mapStateToProps 函數(shù)就會被調(diào)用,該回調(diào)函數(shù)必須返回一個純對象忆某,該對象會與相應展示組件的 props 合并点待。
  • ownProps: 該參數(shù)的值為傳遞到組件的 props,而且只要組件接收到新的props弃舒,mapStateToProps 也會被調(diào)用

[mapDispatchToProps(dispatch, [ownProps]): dispatchProps] (Object or Function)

  • mapDispatchToProps可以是一個Function癞埠,也可以是Object,作用是綁定action創(chuàng)建函數(shù)到props
  • dispatch:
    • 如果傳遞的是一個對象,那么每個定義在該對象的函數(shù)都將被當作Redux action creator聋呢,而且這個對象會與 Redux store綁定在一起苗踪,其中所定義的方法名將作為屬性名,合并到組件的 props 中;
    • 如果傳遞的是一個函數(shù)坝冕,該函數(shù)將接收一個 dispatch 函數(shù)徒探,然后由你來決定如何返回一個對象瓦呼,這個對象通過 dispatch 函數(shù)與 action creator 以某種方式綁定在一起

關于connect()簽名的詳細解釋可以看API文檔

connect()實例

以計數(shù)器為例

component/count.js


import React, { Component } from 'react'

class Counter extends Component {

    increment(){
     this.props.onAdd();
    }

    decrement(){
       this.props.onCut();
    }

    render() {
        return (
            <p>
                Clicked: {this.props.counter} times
                {' '}
                <button onClick={this.increment.bind(this)}>+</button>
                {' '}
                <button onClick={this.decrement.bind(this)}>-</button>
            </p>
        )
    }
}

export default Counter;

containers/count.js

import {connect} from 'react-redux'
import Counter from '../component/count'


//將state綁定到props的counter
const mapStateToProps = (state)=> {
    console.log(state);
    return {
        counter: state
    }
};
//將action的所有方法綁定到props上
const mapDispatchToProps = (dispatch) => {
    return {
        onAdd: ()=> {
            dispatch({type: "INCREMENT_COUNTER"});
        },
        onCut: ()=> {
            dispatch({type: "DECREMENT_COUNTER"});
        }
    };
};

//通過react-redux提供的connect方法將我們需要的state中的數(shù)據(jù)和actions中的方法綁定到props上

export default connect(mapStateToProps, mapDispatchToProps)(Counter)

reducers/count.js

import { INCREMENT_COUNTER, DECREMENT_COUNTER } from '../actions/count'

//reducer其實也是個方法而已,參數(shù)是state和action,返回值是新的state
export default function counter(state = 0, action) {
    switch (action.type) {
        case INCREMENT_COUNTER:
            return state + 1;
        case DECREMENT_COUNTER:
            return state - 1;
        default:
            return state
    }
}

詳細代碼請看:https://github.com/yhl221/react-redux-counter
更多示例請看:React+Redux系列教程


參考資料:
https://segmentfault.com/a/1190000006196949
http://cn.redux.js.org/docs/react-redux/api.html
http://www.ruanyifeng.com/blog/2016/09/redux_tutorial_part_three_react-redux.html
http://www.cnblogs.com/lewis617/p/5145073.html
http://www.cnblogs.com/hhhyaaon/p/5863408.html
源碼解析:https://my.oschina.net/997155658/blog/709155

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末喂窟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子央串,更是在濱河造成了極大的恐慌磨澡,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,332評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件质和,死亡現(xiàn)場離奇詭異稳摄,居然都是意外死亡,警方通過查閱死者的電腦和手機饲宿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評論 3 385
  • 文/潘曉璐 我一進店門厦酬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胆描,“玉大人,你說我怎么就攤上這事仗阅〔玻” “怎么了?”我有些...
    開封第一講書人閱讀 157,812評論 0 348
  • 文/不壞的土叔 我叫張陵减噪,是天一觀的道長。 經(jīng)常有香客問我,道長黎棠,這世上最難降的妖魔是什么椎木? 我笑而不...
    開封第一講書人閱讀 56,607評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮朝卒,結(jié)果婚禮上证逻,老公的妹妹穿的比我還像新娘。我一直安慰自己扎运,他們只是感情好瑟曲,可當我...
    茶點故事閱讀 65,728評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著豪治,像睡著了一般洞拨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上负拟,一...
    開封第一講書人閱讀 49,919評論 1 290
  • 那天烦衣,我揣著相機與錄音,去河邊找鬼掩浙。 笑死花吟,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的厨姚。 我是一名探鬼主播衅澈,決...
    沈念sama閱讀 39,071評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谬墙!你這毒婦竟也來了今布?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,802評論 0 268
  • 序言:老撾萬榮一對情侶失蹤拭抬,失蹤者是張志新(化名)和其女友劉穎部默,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體造虎,經(jīng)...
    沈念sama閱讀 44,256評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡傅蹂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,576評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片份蝴。...
    茶點故事閱讀 38,712評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡犁功,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出婚夫,到底是詐尸還是另有隱情波桩,我是刑警寧澤,帶...
    沈念sama閱讀 34,389評論 4 332
  • 正文 年R本政府宣布请敦,位于F島的核電站镐躲,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏侍筛。R本人自食惡果不足惜萤皂,卻給世界環(huán)境...
    茶點故事閱讀 40,032評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望匣椰。 院中可真熱鬧裆熙,春花似錦、人聲如沸禽笑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽佳镜。三九已至僚稿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蟀伸,已是汗流浹背蚀同。 一陣腳步聲響...
    開封第一講書人閱讀 32,026評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留啊掏,地道東北人蠢络。 一個月前我還...
    沈念sama閱讀 46,473評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像迟蜜,于是被迫代替她去往敵國和親刹孔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,606評論 2 350

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

  • 做React需要會什么? react的功能其實很單一微姊,主要負責渲染的功能酸茴,現(xiàn)有的框架分预,比如angular是一個大而...
    蒼都閱讀 14,751評論 1 139
  • 前言 本文 有配套視頻兢交,可以酌情觀看。 文中內(nèi)容因各人理解不同笼痹,可能會有所偏差配喳,歡迎朋友們聯(lián)系我討論酪穿。 文中所有內(nèi)...
    珍此良辰閱讀 11,898評論 23 111
  • 學習必備要點: 首先弄明白,Redux在使用React開發(fā)應用時晴裹,起到什么作用——狀態(tài)集中管理 弄清楚Redux是...
    賀賀v5閱讀 8,880評論 10 58
  • 我們已經(jīng)詳細介紹了Action被济,Reducer,Store和它們之間的流轉(zhuǎn)關系涧团。Redux的基礎知識差不多也介紹完...
    張歆琳閱讀 3,737評論 1 17
  • http://gaearon.github.io/redux/index.html 只磷,文檔在 http://rac...
    jacobbubu閱讀 79,930評論 35 198