美文网首页
组件跨层级通信 - Context

组件跨层级通信 - Context

作者: 衣裳云墨 | 来源:发表于2020-12-07 08:17 被阅读0次

    如何使用Context:
    step1 : 创建一个context对象
    step2: 创建Provider,传递value
    step3: 子组件消费value , 有三种途径: contextType、useContext、Consumer

    区别
    contextType 只能用在类组件,只能订阅单一的context来源
    useContext只能用在函数组件或者自定义hook中
    Consumer 不限制函数或者类组件

    1. 创建一个context对象
    export const Context = React.createContext()
    
    1. 创建Provider,传递value
    constructor(props) {
      super(props);
      this.state = {
        theme: {themeColor: "red"}
      };
    
      render() {
        const {theme} = this.state;
        return (
          <div>
            <h3>ContextPage</h3>
            <Context.Provider value={theme}>
                <ContextTypePage />
                <UseContextPage />
                <ConsumerPage />
            </Context.Provider>
          </div>
        );
      };
    }
    

    3.1. contextType使用

    export default class ContextTypePage extends Component {
      static contextType = Context;
    
      render() {
        const {themeColor} = this.context;
        console.log("contextType", this.context); 
    
        return (
          <div>
            <h3 className={themeColor}>ContextTypePage</h3>
          </div>
        );
      }
    }
    

    3.2 useContext

    import React from "react";
    import {Context} from "../Context";
    
    export default function UseContextPage(props) {
      const theme = React.useContext(Context);
    
      return (
        <div>
          <h3 className={theme.themeColor}>UseContextPage</h3>
        </div>
      );
    }
    
    

    3.3 Consumer

    import React, {Component} from "react";
    import {Context} from "../Context";
    
    export default class ConsumerPage extends Component {
      render() {
        return (
          <div>
            <h3>ConsumerPage</h3>
            <Context.Consumer>
              {theme => {
                return (
                  <div className={theme.themeColor}>
                    omg
                  </div>
                );
              }}
            </Context.Consumer>
          </div>
        );
      }
    }
    

    相关文章

      网友评论

          本文标题:组件跨层级通信 - Context

          本文链接:https://www.haomeiwen.com/subject/ffrzwktx.html