012|React之Context

假設(shè)有層級(jí) A->B->C->D,如果A需要傳遞一個(gè)參數(shù)給D,根據(jù)前文的知識(shí),只能通過(guò)props參數(shù)一層一層傳遞。

有沒(méi)有更便捷的方法呢?React提供了context機(jī)制來(lái)解決這個(gè)問(wèn)題。
context涉及到父級(jí)(發(fā)送方)和子級(jí)(接收方),父級(jí)設(shè)置context,子級(jí)讀取context。

我們先來(lái)看一下父級(jí)的一個(gè)實(shí)現(xiàn):

class MessageList extends React.Component {
  getChildContext() {
    return {color: "purple"};
  } // 此具返回childContext具體值

  render() {
    const children = this.props.messages.map((message) =>
      <Message text={message.text} />
    );
    return <div>{children}</div>;
  }
}

MessageList.childContextTypes = {  // 通過(guò)childContextTypes定義context中變量類型
  color: PropTypes.string
};

父級(jí)通過(guò)childContextType來(lái)定義context中的類型,以及通過(guò)getChildContext來(lái)返回context的具體value。

再來(lái)看一下子級(jí)如何獲取父級(jí)設(shè)置的context:

class Button extends React.Component {
  render() {
    return (
      <button style={{background: this.context.color}}> // 使用context
        {this.props.children}
      </button>
    );
  }
}

Button.contextTypes = { // 定義接收context
  color: PropTypes.string
};

子級(jí)通過(guò)contextTypes來(lái)標(biāo)識(shí)自己接收context,然后就能直接使用context了。
如果子級(jí)沒(méi)有定義contextTypes,則context對(duì)象將為空。另外,如果定義了contextTypes,以下回調(diào)中都會(huì)添加一個(gè)新參數(shù)context參數(shù):

constructor(props, context)
componentWillReceiveProps(nextProps, nextContext)
shouldComponentUpdate(nextProps, nextState, nextContext)
componentWillUpdate(nextProps, nextState, nextContext)
componentDidUpdate(prevProps, prevState, prevContext)

最后,函數(shù)式組件中,通過(guò)定義contextType也能使用context:

const PropTypes = require('prop-types');

const Button = ({children}, context) =>
  <button style={{background: context.color}}>
    {children}
  </button>;

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

因?yàn)楹瘮?shù)式組件不支持state、ref,一般不建議使用函數(shù)式組件。

想學(xué)計(jì)算機(jī)技術(shù)嗎?需要1對(duì)1專業(yè)級(jí)導(dǎo)師指導(dǎo)嗎?想要團(tuán)隊(duì)陪你一起進(jìn)步嗎?歡迎加我為好友!微信號(hào):iTekka。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,991評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,532評(píng)論 25 708
  • 第5章 引用類型(返回首頁(yè)) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,270評(píng)論 0 4
  • 記憶中的溫度漸漸淡掉 河邊的柳枝枯了又綠 頑皮的小貓叼走了手中的筆 院子里是誰(shuí)在踱步 踩出了歲月的痕跡 當(dāng)初那些哭...
    小妖的淺時(shí)光閱讀 511評(píng)論 0 0
  • 《投資是一種生活方式》的讀書筆記 作 者:朱平 作者簡(jiǎn)介: 出生于上世紀(jì)六十年代的朱平畢業(yè)于浙江大學(xué)物理系;在師范...
    格式化_001閱讀 2,229評(píng)論 0 1