react-redux中的Provider解析

react-redux中有兩大核心方法

  • connect
  • Provider

本文要說(shuō)的是Provider,connect請(qǐng)看這里

Provider的作用

  • Provider是作為整個(gè)App的容器攻人,在你原有的App Container的基礎(chǔ)上再包上一層
  • 接受Redux的store作為props照宝,并將其聲明為context的屬性之一
  • 子組件可以在聲明了contextTypes之后可以方便的通過(guò)this.context.store訪問(wèn)到store

Provider源碼分析

// Provider 依賴react裂垦,導(dǎo)入react中元素
import { Component, PropTypes, Children } from 'react'
// 導(dǎo)入store驗(yàn)證規(guī)則以及警告提示方法
import storeShape from '../utils/storeShape'
import warning from '../utils/warning'

// 標(biāo)識(shí)是否已經(jīng)收到警告
let didWarnAboutReceivingStore = false
// 此方法主要用來(lái)警告當(dāng)前的對(duì)象是否和傳入的對(duì)象相同
function warnAboutReceivingStore() {
  if (didWarnAboutReceivingStore) {
    return
  }
  didWarnAboutReceivingStore = true

  warning(
    '<Provider> does not support changing `store` on the fly. ' +
    'It is most likely that you see this error because you updated to ' +
    'Redux 2.x and React Redux 2.x which no longer hot reload reducers ' +
    'automatically. See https://github.com/reactjs/react-redux/releases/' +
    'tag/v2.0.0 for the migration instructions.'
  )
}

// Provider是一個(gè)內(nèi)部組建
export default class Provider extends Component {

  // 構(gòu)造方法傳入props和context
  constructor(props, context) {
    super(props, context)
    this.store = props.store
  }

  // 返回從構(gòu)造方法傳遞的store迫淹,將store傳遞給子孫component
  getChildContext() {
    return { store: this.store }
  }

  // 返回僅有的一個(gè)子元素,否則(沒(méi)有子元素或超過(guò)一個(gè)子元素)
  // 報(bào)錯(cuò)且不渲染任何東西也榄。 這也說(shuō)明Provider下必須只能是一個(gè)
  // 子元素
  render() {
    return Children.only(this.props.children)
  }
}

// 如果我們運(yùn)行的環(huán)境是production,則還需要定義
// componentWillReceiveProps原型方法
if (process.env.NODE_ENV !== 'production') {
  Provider.prototype.componentWillReceiveProps = function (nextProps) {
    const { store } = this
    const { store: nextStore } = nextProps
    // 如果當(dāng)前對(duì)象與傳遞的對(duì)象不一樣第队,則發(fā)出警告
    if (store !== nextStore) {
      warnAboutReceivingStore()
    }
  }
}

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

Provider使用示例

import React from 'react'
import { render } from 'react-dom'
import { Provider } from 'react-redux'
import App from './containers/count'
import configureStore from './store/configureStore'

const store = configureStore();

render(
    <Provider store={store}>
        <App />
    </Provider>,
    document.getElementById('app')
);

完整代碼請(qǐng)看這里


參考資料:
https://github.com/ckinmind/ReactCollect/issues/57
https://my.oschina.net/997155658/blog/709155

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末励稳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子犬金,更是在濱河造成了極大的恐慌念恍,老刑警劉巖六剥,帶你破解...
    沈念sama閱讀 212,294評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異樊诺,居然都是意外死亡仗考,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門词爬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)秃嗜,“玉大人,你說(shuō)我怎么就攤上這事顿膨」牵” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 157,790評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵恋沃,是天一觀的道長(zhǎng)必搞。 經(jīng)常有香客問(wèn)我,道長(zhǎng)囊咏,這世上最難降的妖魔是什么恕洲? 我笑而不...
    開(kāi)封第一講書人閱讀 56,595評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮梅割,結(jié)果婚禮上霜第,老公的妹妹穿的比我還像新娘。我一直安慰自己户辞,他們只是感情好泌类,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,718評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著底燎,像睡著了一般刃榨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上双仍,一...
    開(kāi)封第一講書人閱讀 49,906評(píng)論 1 290
  • 那天枢希,我揣著相機(jī)與錄音,去河邊找鬼殊校。 笑死晴玖,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的为流。 我是一名探鬼主播呕屎,決...
    沈念sama閱讀 39,053評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼敬察!你這毒婦竟也來(lái)了秀睛?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,797評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤莲祸,失蹤者是張志新(化名)和其女友劉穎蹂安,沒(méi)想到半個(gè)月后椭迎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,250評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡田盈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,570評(píng)論 2 327
  • 正文 我和宋清朗相戀三年畜号,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片允瞧。...
    茶點(diǎn)故事閱讀 38,711評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡简软,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出述暂,到底是詐尸還是另有隱情痹升,我是刑警寧澤,帶...
    沈念sama閱讀 34,388評(píng)論 4 332
  • 正文 年R本政府宣布畦韭,位于F島的核電站疼蛾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏艺配。R本人自食惡果不足惜察郁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,018評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望转唉。 院中可真熱鬧绳锅,春花似錦、人聲如沸酝掩。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,796評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)期虾。三九已至,卻和暖如春驯嘱,著一層夾襖步出監(jiān)牢的瞬間镶苞,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,023評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工鞠评, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留茂蚓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,461評(píng)論 2 360
  • 正文 我出身青樓剃幌,卻偏偏與公主長(zhǎng)得像聋涨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子负乡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,595評(píng)論 2 350

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