react context组件传值
这种传值方法一般适用于多层传递 父-------->子-------------->孙
思路:
不管后代怎么嵌套,后代都是消费者Consumer ,父组件都是生产者 Provider。后代的值都是从父组件中获取的,个人认为父组件有点类似于Vue中的VueX。表面是嵌套关系 ,但是获取到的值都是父组件的。
后代的组件需要放在
标签内部,不然会报错(详情可见:子组件第12行代码)。
关键点(很重要)
父组件导出生产者:
export const {Provider,Consumer} = React.createContext("默认名称");
所有的后代组件都是从父组件index中引入接收 成为 消费者
import { Consumer } from "../index";//引入父组件的Consumer容器
父组件 index.js
import React, { Component } from 'react'
import ReactDOM from 'react-dom';
import AA from './Sun/AA'
export const {Provider,Consumer} = React.createContext("默认名称");
export default class GH extends Component {
constructor(){
super();
this.state={
count:0,
}
}
render() {
let name ="dasdasdasdasdasdasw"
return (
//Provider共享容器 接收一个name属性
<Provider value={name}>
<div style={{border:'1px solid red',width:'30%',margin:'50px auto',textAlign:'center'}}>
<p>父组件定义的值:{name}</p>
<AA />
</div>
</Provider>
);
}
submitHandler = (data)=>{
this.setState((nextState)=>{
return {
count:nextState.count+=data
}
})
}
}
ReactDOM.render(
<GH></GH>,
document.getElementById('root')
);
子组件AA.js代码
import React, { Component } from 'react'
import { Consumer } from "../index";//引入父组件的Consumer容器
import BB from "./BB"
export default class AA extends Component {
render() {
return (
<div>
<Consumer>
{
(data)=><div>
子组件 {data}
<BB></BB>
</div>
}
</Consumer>
</div>
)
}
clickHandler=()=>{
console.log(this.props.op(2))
}
}
孙子BB.js组件代码
import React, { Component } from 'react'
import { Consumer } from "../index";//引入父组件的Consumer容器
export default class BB extends Component {
render() {
return (
<div>
<Consumer>
{( data) =>
<div style={{ border: '1px solid blue', width: '60%', margin: '20px auto', textAlign: 'center' }}>
<p>孙组件。获取父组件的值:{data}</p>
</div>
}
</Consumer>
</div>
)
}
}