react-redux中的數(shù)據(jù)傳遞

1嘉竟、connect

connect用于連接React組件與 Redux store凹髓,其使用方法如下

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

[mapStateToProps(state, [ownProps]): stateProps]是connect的第一個(gè)參數(shù)摧找,其類型為function,允許我們將 store 中的數(shù)據(jù)作為 props 綁定到組件上。

const mapStateToProps = (store) => {
  return {
    count:store.count
  }
}

(1)這個(gè)函數(shù)的第一個(gè)參數(shù)就是 Redux 的 store蓄喇,我們不必將 store中的數(shù)據(jù)原封不動(dòng)地傳入組件花鹅,可以根據(jù) state 中的數(shù)據(jù)氧腰,動(dòng)態(tài)地輸出組件需要的(最小)屬性。

(2)函數(shù)的第二個(gè)參數(shù) ownProps古拴,是組件自己的 props箩帚。有的時(shí)候,ownProps 也會(huì)對(duì)其產(chǎn)生影響黄痪。

當(dāng) state 變化紧帕,或者 ownProps 變化的時(shí)候,mapStateToProps 都會(huì)被調(diào)用桅打,計(jì)算出一個(gè)新的 stateProps是嗜,(在與 ownProps merge 后)更新給組件。

[mapDispatchToProps(dispatch, ownProps): dispatchProps]將 action 作為 props 綁定到組件上挺尾,也會(huì)成為 MyComp 的 props鹅搪。

stateProps 和 dispatchProps,都需要和 ownProps merge 之后才會(huì)被賦給組件遭铺。connect 的第三個(gè)參數(shù)就是用來做這件事丽柿。如果不傳這個(gè)參數(shù),connect 就會(huì)使用 Object.assign替代該方法魂挂。

connect 的第四個(gè)參數(shù)[options] (Object) 如果指定這個(gè)參數(shù)甫题,可以定制 connector 的行為,一般不用锰蓬。

connect核心代碼:

export default function connect(mapStateToProps, mapDispatchToProps, mergeProps, options = {}) {
  return function wrapWithConnect(WrappedComponent) {
    class Connect extends Component {
      constructor(props, context) {
        // 從祖先Component處獲得store
        this.store = props.store || context.store
        this.stateProps = computeStateProps(this.store, props)
        this.dispatchProps = computeDispatchProps(this.store, props)
        this.state = { storeState: null }
        // 對(duì)stateProps幔睬、dispatchProps、parentProps進(jìn)行合并
        this.updateState()
      }
      shouldComponentUpdate(nextProps, nextState) {
        // 進(jìn)行判斷芹扭,當(dāng)數(shù)據(jù)發(fā)生改變時(shí)麻顶,Component重新渲染
        if (propsChanged || mapStateProducedChange || dispatchPropsChanged) {
          this.updateState(nextProps)
            return true
          }
        }
        componentDidMount() {
          // 改變Component的state
          this.store.subscribe(() = {
            this.setState({
              storeState: this.store.getState()
            })
          })
        }
        render() {
          // 生成包裹組件Connect
          return (
            <WrappedComponent {...this.nextState} />
          )
        }
      }
      Connect.contextTypes = {
        store: storeShape
      }
      return Connect;
    }
  }

可以看到connect是一個(gè)高階函數(shù)
首先,傳入mapStateToProps舱卡、mapDispatchToProps
然后辅肾,返回一個(gè)生產(chǎn)Component的函數(shù)(wrapWithConnect)
最后,將真正的Component作為參數(shù)傳入wrapWithConnect
這樣就生產(chǎn)出一個(gè)經(jīng)過包裹的Connect組件轮锥,該組件具有如下特點(diǎn):

通過props.store獲取祖先Component的storeprops包括stateProps矫钓、dispatchProps、parentProps,合并在一起得到nextState舍杜,作為props傳給真正的Component
componentDidMount時(shí)新娜,添加事件this.store.subscribe(this.handleChange),實(shí)現(xiàn)頁面交互
shouldComponentUpdate時(shí)判斷是否有避免進(jìn)行渲染既绩,提升頁面性能概龄,并得到nextState
componentWillUnmount時(shí)移除注冊(cè)的事件this.handleChange

2、Provider

Provider組件主要有以下兩個(gè)作用:

1饲握、在原應(yīng)用組件上包裹一層私杜,使原來整個(gè)應(yīng)用成為Provider的子組件
2蚕键、接收Redux的store作為props,通過context對(duì)象傳遞給子孫組件

其代碼如下

export default class Provider extends Component {
  getChildContext() {
    return { store: this.store }
  }

  constructor(props, context) {
    super(props, context)
    this.store = props.store
  }

  render() {
    return Children.only(this.props.children)
  }
}

if (process.env.NODE_ENV !== 'production') {
  Provider.prototype.componentWillReceiveProps = function (nextProps) {
    const { store } = this
    const { store: nextStore } = nextProps

    if (store !== nextStore) {
      warnAboutReceivingStore()
    }
  }
}

Provider.propTypes = {
  store: storeShape.isRequired,
  children: PropTypes.element.isRequired
}
Provider.childContextTypes = {
  store: storeShape.isRequired
}

從上面的代碼可以看出Provider是通過context傳遞給子組件的衰粹,子組件通過connect獲得數(shù)據(jù)锣光,實(shí)現(xiàn)過程如下,可以看到在沒有定義props的情況下铝耻,通過context直接取得store中的數(shù)據(jù)誊爹。

...
constructor(props, context) {
        this.store = props.store || context.store 
        this.stateProps = computeStateProps(this.store, props)
        this.dispatchProps = computeDispatchProps(this.store, props)
        this.state = { storeState: null }
        this.updateState()
}
...
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市瓢捉,隨后出現(xiàn)的幾起案子替废,更是在濱河造成了極大的恐慌,老刑警劉巖泊柬,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異诈火,居然都是意外死亡兽赁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門冷守,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刀崖,“玉大人,你說我怎么就攤上這事拍摇×燎眨” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵充活,是天一觀的道長(zhǎng)蜂莉。 經(jīng)常有香客問我,道長(zhǎng)混卵,這世上最難降的妖魔是什么映穗? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮幕随,結(jié)果婚禮上蚁滋,老公的妹妹穿的比我還像新娘。我一直安慰自己赘淮,他們只是感情好辕录,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著梢卸,像睡著了一般走诞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上低剔,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天速梗,我揣著相機(jī)與錄音肮塞,去河邊找鬼。 笑死姻锁,一個(gè)胖子當(dāng)著我的面吹牛枕赵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播位隶,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼拷窜,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了涧黄?” 一聲冷哼從身側(cè)響起篮昧,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎笋妥,沒想到半個(gè)月后懊昨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡春宣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年酵颁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片月帝。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡躏惋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嚷辅,到底是詐尸還是另有隱情簿姨,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布簸搞,位于F島的核電站扁位,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏攘乒。R本人自食惡果不足惜贤牛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望则酝。 院中可真熱鬧殉簸,春花似錦、人聲如沸沽讹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽爽雄。三九已至蝠检,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挚瘟,已是汗流浹背叹谁。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工饲梭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人焰檩。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓憔涉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親析苫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子兜叨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • 做React需要會(huì)什么国旷? react的功能其實(shí)很單一,主要負(fù)責(zé)渲染的功能茫死,現(xiàn)有的框架跪但,比如angular是一個(gè)大而...
    蒼都閱讀 14,740評(píng)論 1 139
  • 前言 本文 有配套視頻,可以酌情觀看峦萎。 文中內(nèi)容因各人理解不同特漩,可能會(huì)有所偏差,歡迎朋友們聯(lián)系我討論骨杂。 文中所有內(nèi)...
    珍此良辰閱讀 11,894評(píng)論 23 111
  • 我們已經(jīng)詳細(xì)介紹了Action,Reducer雄卷,Store和它們之間的流轉(zhuǎn)關(guān)系搓蚪。Redux的基礎(chǔ)知識(shí)差不多也介紹完...
    張歆琳閱讀 3,731評(píng)論 1 17
  • 今天來看一下react組件之間是怎么進(jìn)行通訊的。react推崇的是單向數(shù)據(jù)流丁鹉,自上而下進(jìn)行數(shù)據(jù)的傳遞妒潭,但是由下而上...
    親親qin閱讀 5,997評(píng)論 2 12
  • 學(xué)習(xí)必備要點(diǎn): 首先弄明白,Redux在使用React開發(fā)應(yīng)用時(shí)揣钦,起到什么作用——狀態(tài)集中管理 弄清楚Redux是...
    賀賀v5閱讀 8,877評(píng)論 10 58