React-Context

669 阅读1分钟
/**
API: 
1 createContext(defaultValue?)::创建一个上下文的容器(组件), defaultValue可以设置共享的默认数据
const {Provider, Consumer} = React.createContext(defaultValue);

2 Provider(生产者): 和他的名字一样。用于生产共享数据的地方。生产什么呢? 那就看value定义的是什么了。value:放置共享的数据。
<Provider value={共享的数据}>
    里面可以渲染对应的内容
</Provider>

3 Consumer(消费者):这个可以理解为消费者。 他是专门消费供应商(Provider 上面提到的)产生数据。Consumer需要嵌套在生产者下面。才能通过回调的方式拿到共享的数据源。当然也可以单独使用,那就只能消费到上文提到的defaultValue
 <Consumer>
  {value => 根据上下文  进行渲染相应内容}
 </Consumer>
*/

import { Component,createContext } from 'react'
//import { View, Text,Button } from '@tarojs/components'

const BatteryContext = createContext();//如果有参数,则参数为默认值
const OnlineContext = createContext(true);

class Leaf extends Component{
    render(){
        return (
            /**Consumer也是要嵌套,注意参数 
             * Consumer消费者使用Context的值
             * 但子组件不能是其他组件,必须渲染一个函数,函数的参数就是Context的值
             * 当出现多个Consumer时,进行嵌套,每个Consumer的子组件必须是一个函数
            */
            <BatteryContext.Consumer>
                {
                    battery => (
                    <OnlineContext.Consumer>
                    {
                        online => <h1>Battery:{battery},Online:{String(online)}这里有个坑,boolean渲染不出来,要转为string</h1>
                    }
                    </OnlineContext.Consumer>)
                }
            </BatteryContext.Consumer>
        )
    }
}
class Middle extends Component{
    render(){
        return <Leaf/>
    }
}

export default class Index extends Component {
      state = {
        battery:100,
        online:true,
      }
  render () {
    const {battery,online} = this.state;
    return (
        /*有多个Context时,直接嵌套,顺序不重要*/
        <BatteryContext.Provider value={battery}>
        <OnlineContext.Provider value={online}>
        <Middle/>
        <Button onClick={()=>this.setState({battery:battery-1})}>
            Button
        </Button>
        <Button onClick={()=>this.setState({online:!online})}>
            Online
        </Button>
        </OnlineContext.Provider>
        </BatteryContext.Provider>
    )
  }
}