我學react之父子元件通訊

air10086發表於2019-04-10

react父子元件通訊

react父子間通訊的幾種情況

  • 父元件向子元件通訊
  • 子元件向父元件通訊
  • 跨級元件通訊
  • 兄弟元件通訊

父元件向子元件通訊

由於react是單向資料流向的,父元件一般通過props向子元件傳遞相關的一些資訊
來看一下下面這個例子,在這裡我封裝了一個modal元件,它的顯示與取消的狀態交由父元件來管理,它們之間的關係用一張圖表示
流程圖
程式碼如下

​ 父元件程式碼![1550835009221](C:UsersABCAppDataRoamingTyporatypora-user-images1550835009221.png)

![1550835041364](C:UsersABCAppDataRoamingTyporatypora-user-images1550835041364.png)

這樣子元件中的visible就被父元件接管了

子元件向父元件通訊

子元件向父元件通訊同樣需要父元件向子元件傳遞props,只是父元件傳遞的是是作用域為自己的函式,子元件呼叫次函式,並將子元件想要傳遞的資訊,作為引數,傳遞到父元件的作用域中

還是以上面的這個例子距離,當開啟模態框的時候,通過父元件的

showModal()方法,改變visible的值,通過props傳遞到子元件,

關閉模態框是由內向外的。模態框在內部改變visible的值在把它傳遞給外部的方法

程式碼如下

DBModal.jsx![1550835624227](C:UsersABCAppDataRoamingTyporatypora-user-images1550835624227.png)

父元件

![1550835685064](C:UsersABCAppDataRoamingTyporatypora-user-images1550835685064.png)

跨級元件通訊

通過context進行通訊,我們可以把元件之間的關係想象成一個元件樹,原始的方法就是通過props一級一級的把狀態往下傳,在通過呼叫方法一級一級傳回去,另一種方法就是在他們之間設定一個區域,每個元件都可以訪問到,相當於父元件下的一個全域性變數

程式碼

最頭部的父元件

class Index extends Component {
  static childContextTypes = {
    themeColor: PropTypes.string
  }

  constructor () {
    super()
    this.state = { themeColor: 'red' }
  }

  getChildContext () {
    return { themeColor: this.state.themeColor }
  }

  render () {
    return (
      <div>
        <Header />
        <Main />
      </div>
    )
  }
}複製程式碼

要在父元件設定這個context區域,在childContextTypes中設定允許子元件們訪問的變數的名稱,getChildContext()會設定這個區域,這樣所有的子元件都可以訪問到themeColor這個引數了

子元件如何訪問

class Title extends Component {
  static contextTypes = {
    themeColor: PropTypes.string
  }

  render () {
    return (
      <h1 style={{ color: this.context.themeColor }}>React.js 小書標題</h1>
    )
  }
}複製程式碼

通過在this.context的方式就可以訪問到了



相關文章