学习:React之Context

200 阅读1分钟
Context 设计目的是为了共享那些对于一个组件树而言是“全局”的数据.

1. 作为一个全局数据,且使用的地方不限于是子组件,可能是孙子组件以及更深层的组件,可以避免使用大批量的props属性来传递属性

2. 向所有组件树下的组件广播数据


API

1. React.createContext(defaultValue)

2. Context.Provider 

3. Context.Consumer

4. Context.displayName


基本使用实例

父组件:App.js


import React from 'react'
import './App.scss'
import './fix.scss'
import Footer from './footer/footer'
export const { Provider, Consumer } = React.createContext('light')
class App extends React.Component { 
 constructor(props) {   
 super(props)    this.state = {      a: []   
 } 
 } 
 render() { 
   return
 (      <div className="App">        <div>        </div>        <p>{this.state.a}</p>
        <Provider value={this.state.a}>
          <Footer /> 
       </Provider>
      </div>    )
  }
}
export default App

子组件:Footer.js

import React from 'react'
import LitterFooter from '../littleFooter'
function Footer(props) {
  return (    <div>      <LitterFooter />    </div>  )
}
export default Footer

孙子组件:LitterFooter.js

import React from 'react'
import { Consumer } from '../App'
export default class LittleFooter extends React.Component
 {
  render() {
    return <Consumer>{value => <p>父组件传的内容=>{value}</p>}</Consumer>  
}
}

将App.js中的Consumer暴露出去,以便组件树内的组件可以获取到这个Consumer,当子组件等获取Context中的数据的时候,要保证Provider和Consumer要配对使用


3个问题

1. 只有当组件树中没有匹配到Provider,其defaultValue才会生效,如果往value值中传入了undefined,那么defaultValue值也不会生效

2. Consumer在进行取值的时候,会取离自己最近的Provider传递的值

3. 当Provider的value值发生更改的时候,内部的所有的消费组件都会发生重新渲染。Provider和内部的consumer组件都不受制于shouldComponentUpdate函数,因此Consumer组件在其祖先组件退出更新的时候,也会发生更新