關(guān)于React中Context的使用和理解

官方對于Context的定義

React文檔官網(wǎng)并未對Context給出“是什么”的定義,更多是描述使用的Context的場景泉瞻,以及如何使用Context。

官網(wǎng)對于使用Context的場景是這樣描述的:

In Some Cases, you want to pass data through the component tree without having to pass the props down manuallys at every level. you can do this directly in React with the powerful "context" API.

簡單說就是苞冯,當(dāng)你不想在組件樹中通過逐層傳遞props或者state的方式來傳遞數(shù)據(jù)時袖牙,可以使用Context來實(shí)現(xiàn)跨層級的組件數(shù)據(jù)傳遞。

意思就是說舅锄,當(dāng)你多個組件深層嵌套后最里層的組件想要使用最外層組件的傳過來的值的時候鞭达,通過props傳值就得一層層的往下傳,代碼很繁瑣皇忿,而使用Context畴蹭,子組件就可以很方便的使用外層的父組件的值

如何使用Context (V16.x之前)

如果要Context發(fā)揮作用,需要用到兩種組件鳍烁,一個是Context生產(chǎn)者(Provider)叨襟,通常是一個父節(jié)點(diǎn),另外是一個Context的消費(fèi)者(Consumer)幔荒,通常是一個或者多個子節(jié)點(diǎn)糊闽。所以Context的使用基于生產(chǎn)者消費(fèi)者模式。

對于父組件爹梁,也就是Context生產(chǎn)者右犹,需要通過一個靜態(tài)屬性childContextTypes聲明提供給子組件的Context對象的屬性,并實(shí)現(xiàn)一個實(shí)例getChildContext方法姚垃,返回一個代表Context的純對象 (plain object) 念链。


父組件

class Parent extends React.Component {
  getChildContext() {
    return {color: "purple"};
  }
}

Parent.childContextTypes = {
  color: PropTypes.string
};

子組件

class Child extends React.Component {
  render() {
    return (
      <p>
        直接用過,context訪問屬性
        {this.context.color}
      </p>
    );
  }
}
子組件需要通過一個靜態(tài)屬性contextTypes聲明后,
才能訪問父組件Context對象的屬性钓账,否則碴犬,即使屬性名沒寫錯,
拿到的對象也是undefined

Child.contextTypes = {
  color: PropTypes.string
};

V16.x之后 (更加明確了生產(chǎn)者消費(fèi)者模式的使用方式)

通過靜態(tài)方法React.createContext()創(chuàng)建一個Context對象梆暮,這個Context對象包含兩個組件服协,<Provider /><Consumer />

爺組件

import React from "react";
import ReactDom from "react-dom";
const GrandFatherContext = React.createContext({
  color:'red'
});

class App extends React.Component {
  render() {
    return (
      <GrandFatherContext.Provider>
       <Father value={{color:'red'}}></Father>
      </GrandFatherContext.Provider>
    );
  }
}

<Provider />value相當(dāng)于之前的getChildContext()

父組件(嵌套子組件)

class Father extends React.Component {
  render () {
    return (
      <Son>Hello React Context API</Son>
    );
  }
}
 
class Son extends React.Component {
  render () {
    return (
      <GrandFatherContext.Consumer>
        {context => (
          <h1 style={{ color: context.color}}>
            {this.props.children}
          </h1>
        )}
      </GrandFatherContext.Consumer>
    )
  }
}

<Consumer />children必須是一個函數(shù),通過函數(shù)的參數(shù)獲取<Provider />提供的Context

總結(jié)

新版 Context API 組成:

  • React.createContext 方法用于創(chuàng)建一個Context 對象啦粹。該對象包含 ProviderConsumer兩個屬性偿荷,分別為兩個 React 組件。
  • Provider 組件唠椭。用在組件樹中更外層的位置跳纳。它接受一個名為 value的 prop,其值可以是任何 JavaScript 中的數(shù)據(jù)類型贪嫂。
  • Consumer 組件寺庄。可以在 Provider組件內(nèi)部的任何一層使用力崇。它接收一個名為children 值為一個函數(shù)的 prop斗塘。這個函數(shù)的參數(shù)是 Provider 組件接收的那個value prop 的值,返回值是一個 React 元素(一段 JSX 代碼)亮靴。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末馍盟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子茧吊,更是在濱河造成了極大的恐慌贞岭,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搓侄,死亡現(xiàn)場離奇詭異瞄桨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)休讳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門讲婚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尿孔,“玉大人俊柔,你說我怎么就攤上這事』詈希” “怎么了雏婶?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長白指。 經(jīng)常有香客問我留晚,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任错维,我火速辦了婚禮奖地,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赋焕。我一直安慰自己参歹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布隆判。 她就那樣靜靜地躺著犬庇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪侨嘀。 梳的紋絲不亂的頭發(fā)上臭挽,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機(jī)與錄音咬腕,去河邊找鬼欢峰。 笑死,一個胖子當(dāng)著我的面吹牛涨共,可吹牛的內(nèi)容都是我干的赤赊。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼煞赢,長吁一口氣:“原來是場噩夢啊……” “哼抛计!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起照筑,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤吹截,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后凝危,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體波俄,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年蛾默,在試婚紗的時候發(fā)現(xiàn)自己被綠了懦铺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡支鸡,死狀恐怖冬念,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情牧挣,我是刑警寧澤急前,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站瀑构,受9級特大地震影響裆针,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一世吨、第九天 我趴在偏房一處隱蔽的房頂上張望澡刹。 院中可真熱鬧,春花似錦耘婚、人聲如沸像屋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽己莺。三九已至,卻和暖如春戈轿,著一層夾襖步出監(jiān)牢的瞬間凌受,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工思杯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胜蛉,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓色乾,卻偏偏與公主長得像誊册,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子暖璧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350