React实例对象的context和组合模式

252 阅读2分钟
  • context类似于共享,它的值也是个对象(也可以叫是它的上下文)

  • ThemeContext.Provider的作用就是把值传给它的后代,value就是向后传递的数据,不写value的话传的就是默认值(‘light’)

  • 每个 Context 对象都会返回一个 Provider React 组件,只要传进去的值变了,使用这个值的组件就变化了,如果发生Provider嵌套的情况下,它内部的组件就会找离该组件自身最近的Provider,当Provider的value值发生变化,那么消费它的那些组件会自动更新组件

  • static contextType=祖先组件里创建的context对象名,的作用就是把创建的context对象里的值,存到当前组件实例对象的context属性上

context传值

过程:

  1. 通过React.createContext()引入context对象
const MyconText=React.createContext();
   注意:不写的话有默认值"light";
  1. 在祖先组件里使用contextprovider属性把儿子组件包裹起来,并设置value值,value值就是要共享的数据
最顶层
class App enxtends React.Component{
    render(){
        return (
            <div>
                <MyContext.Provider value={传输的数据}>
                    <Work />  //这样Work组件以及它的后代都可以共享value里的数据
                </MyContext.Provider>
            </div>
        )
    }
}
  1. 儿子组件里照常调用孙子组件,不需要做任何事情
  2. 在底层组件里使用static contextType = MyContext;就相当于把高层组件里的数据存到了底层组件的context里,然后在底层组件里,直接this.context去读取数据就可以了。
最底层
class Person extends React.Component{
    render(){
    static contextType = MyContext;
        return (
            <div>{this.context}</div>
        )
    }
}

组合模式:先把后代作为祖先的儿子,把数据传给后代,再把子组件作为父组件的属性传回去,在子组件里用props接收。

过程:暴露后代——祖先里引入后代——后代组件在祖先组件里调用并赋值给一个变量——该变量作为子组件的属性传到子组件——在子组件里通过this.props.变量名进行渲染

另外一种写法:也是把后代组件放到祖先组件里,直接把孙子组件调用放在儿子组件调用中间,孙子照常接收祖先组件的数据(this.props.变量名),在子组件里渲染数据要写{this.props.children}