Context官网: https://zh-hans.reactjs.org/docs/context.html
Context
context
创建一个 Context 对象
// 从 react 中引入 createContextimport { createContext } from "react";// 创建一个 Context 对象const MyContext = createContext(defaultValue);
Provider
defaultValue
渲染子组件
每个 Context 对象都会返回一个 Provider React 组件,它允许消费组件订阅 context 的变化。Provider 接收一个 value 属性,传递给消费组件。一个 Provider 可以和多个消费组件有对应关系。多个 Provider 也可以嵌套使用,里层的会覆盖外层的数据。当 Provider 的 value 值发生变化时,它内部的所有消费组件都会重新渲染。从 Provider 到其内部 consumer 组件(包括 .contextType 和 useContext)的传播不受制于 shouldComponentUpdate 函数,因此当 consumer 组件在其祖先组件跳过更新的情况下也能更新。通过新旧值检测来确定变化,使用了与 Object.is 相同的算法。
Provider React
value
consumer
.contextType
useContext
shouldComponentUpdate
Object.is
<MyContext.Provider value&#61;{value}> {/* 子组件 */} <component/>MyContext.Provider>
xxxContext.Provider
后代组件读取数据
方法一&#xff1a;Class.contextType&#xff0c;仅适用于类组件。
Class.contextType
class MyClass extends React.Component { // 声明接收context&#xff0c;使用 static 这个类属性来初始化 contextType static contextType &#61; MyContext; render() { // 读取context中的value数据 let value &#61; this.context; /* 基于这个值进行渲染工作 */ }}
static
contextType
this.context
方法二&#xff1a;Context.Consumer&#xff0c;函数组件与类组件都可以使用。
Context.Consumer
<MyContext.Consumer> {value &#61;> /* 基于 context 值进行渲染*/}MyContext.Consumer>
import React, { Component } from "react";import { createContext } from "react";// 创建一个createContext对象const CountContext &#61; createContext();// 从 Context 中获取 Provider, Consumerconst { Provider, Consumer } &#61; CountContext;export default class A extends Component { state &#61; { count: 100, name: "tom", }; render() { const { name, count } &#61; this.state; return ( <div> <h2>A组件</h2> <h4>数值为&#xff1a;{count}</h4> {/* 通过value属性给后代组件传递数据 */} <Provider value&#61;{{ name, count }}> <B /> </Provider> </div> ); }}class B extends Component { render() { return ( <div> <h2>B组件</h2> <C /> <D /> </div> ); }}class C extends Component { // 声明接收context static contextType &#61; CountContext; render() { // 接收值 console.log(this.context); return ( <div> <h2>C组件</h2> <h4> 接收到的A组件数值为&#xff1a;{this.context.count},名字为&#xff1a;{this.context.name} </h4> </div> ); }}function D() { return ( <div> <h2>D组件</h2> <h4> <Consumer> {(value) &#61;> { // 接收值 console.log(value); return &#96;接收到的A组件数值为&#xff1a;${value.count},名字为&#xff1a;${value.name}&#96;; }} </Consumer> </h4> </div> );}