跨组件通信
import React from 'react'; // 创建上下文件对象 const Context = React.createContext({}); // 从上下文中获取容器组件 // Provider 生产者容器组件 负责生产数据 // Consumer 消费者容器组件 负责使用数据 const {Provider, Consumer} = Context; class Son extends React.Component { render() { return ( <Consumer> { (value) => { return ( <div> <p>{value.name}</p> <p>{value.age}</p> </div> ) } } </Consumer> ) } } class Father extends React.Component { render() { return ( <div> <h2>Father</h2> <Son /> </div> ); } } class App extends React.Component { render() { return ( <Provider value={{name: 'xiebenyin', age: 66}}> <h1>App</h1> <Father /> </Provider> ) } } export default App;
- 调用 React.createContext 函数创建一个 Context 上下文对象
- 从 Context 上下文对象中解构出 Provider 生产者组件和 Consumer 消费者组件
- 使用 Provider 组件的时候通过 value 属性生产数据
- 在后代组件中使用 Consumer 消费者组件消费 Provider 生产出来的数据
- Consumer 消费者组件在使用时会自动调用一个回调函数,并将 Provider 生产出来的数据作为回调函数的第一个参数传递进去
上下文对象的第二种使用方法
import React from 'react'; // 创建上下文对象 const Context = React.createContext({ name: 'xiebenyin', age: 66 }); class Son extends React.Component { render() { return ( <div> <h3>Son</h3> <p>{this.context.name}</p> <p>{this.context.age}</p> </div> ) } } // 扩展一个静态属性 Son.contextType = Context class Father extends React.Component { render() { return ( <div> <h2>Father</h2> <Son /> </div> ); } } class App extends React.Component { render() { return ( <div> <h1>App</h1> <Father /> </div> ) } } export default App;
- 调用 React.createContext 函数时传递一个参数作为数据
- 给任意一个类组件扩展一个静态属性 contextType 取值是 Context 上下文对象
- 在该组件中通过 this.context.name 就可以使用上下文中的数据
多个上下文对象的使用
import React from 'react'; // 创建两个上下文对象 const Context1 = React.createContext({}); const Context2 = React.createContext({}); class Son extends React.Component { render() { return ( <Context1.Consumer> { (value1) => { return ( <Context2.Consumer> { (value2) => { return ( <div> <p>{value1.name}</p> <p>{value2.age}</p> </div> ) } } </Context2.Consumer> ) } } </Context1.Consumer> ); } } class Father extends React.Component { render() { return ( <div> <h2>Father</h2> <Son /> </div> ) } } class App extends React.Component { render() { return ( <Context1.Provider value={{name: 'xiebenyin'}}> <Context2.Provider value={{age: 66}}> <h1>App</h1> <Father /> </Context2.Provider> </Context1.Provider> ) } } export default App;
- 创建两个上下文对象 Context1 和 Context2
- 使用 Context1.Provider 生产者组件通过 value 生产数据并在内部使用 Context2.Provider 生产者组件生产数据
- 在后代组件中,可以通过 Context1.Consumer 或 Context2.Consumer 消费者组件拿到各自上下文对象中生产出来的数据