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