跨组件通信 (2)
跨组件通信
import React from 'react'; // 创建上下文件对象 const Context = React.createContext({}); // 从上下文中获取容器组件 // Provider 生产者容器组件 负责生产数据 // Consumer 消费者容器组件 负责使用数据 const {Provider, Consumer} = Context; class Son extends React.Component { render() { return ({ (value) => { return ( ) } } class Father extends React.Component { render() { return () } }{value.name}
{value.age}
); } } class App extends React.Component { render() { return (Father
) } } export default App; 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 () } } // 扩展一个静态属性 Son.contextType = Context class Father extends React.Component { render() { return (Son
{this.context.name}
{this.context.age}
); } } class App extends React.Component { render() { return (Father
) } } export default App;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 ({ (value1) => { return ( ); } } class Father extends React.Component { render() { return ({ (value2) => { return ( ) } }) } }{value1.name}
{value2.age}
) } } class App extends React.Component { render() { return (Father
) } } export default App; App
- 创建两个上下文对象 Context1 和 Context2
- 使用 Context1.Provider 生产者组件通过 value 生产数据并在内部使用 Context2.Provider 生产者组件生产数据
- 在后代组件中,可以通过 Context1.Consumer 或 Context2.Consumer 消费者组件拿到各自上下文对象中生产出来的数据