-
context类似于共享,它的值也是个对象(也可以叫是它的上下文)
-
ThemeContext.Provider的作用就是把值传给它的后代,value就是向后传递的数据,不写value的话传的就是默认值(‘light’)
-
每个 Context 对象都会返回一个 Provider React 组件,只要传进去的值变了,使用这个值的组件就变化了,如果发生Provider嵌套的情况下,它内部的组件就会找离该组件自身最近的Provider,当Provider的value值发生变化,那么消费它的那些组件会自动更新组件
-
static contextType=祖先组件里创建的context对象名,的作用就是把创建的context对象里的值,存到当前组件实例对象的context属性上
context传值
过程:
- 通过React.createContext()引入context对象
const MyconText=React.createContext();
注意:不写的话有默认值"light";
- 在祖先组件里使用
context的provider属性把儿子组件包裹起来,并设置value值,value值就是要共享的数据
最顶层
class App enxtends React.Component{
render(){
return (
<div>
<MyContext.Provider value={传输的数据}>
<Work /> //这样Work组件以及它的后代都可以共享value里的数据
</MyContext.Provider>
</div>
)
}
}
- 儿子组件里照常调用孙子组件,不需要做任何事情
- 在底层组件里使用
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}