美文网首页
React学习总结5--Context

React学习总结5--Context

作者: 琉璃_xin | 来源:发表于2019-08-15 20:12 被阅读0次

demos源码
Context 设计目的是为了共享那些对于一个组件树而言是“全局”的数据。

如何使用

  1. 将初始状态传递给 React.createContext。这个方法会返回一个带有 Provider 和 Consumer 的对象。
  2. 使用 Provider 组件包裹在组件树的最外层,并接收一个 value 属性。value 属性可以是任何值。
  3. 使用 Consumer 组件,在组件树中 Provider 组件内部的任何地方都能获取到状态的子集。

ThemeContext:

import React from 'react';
const ThemeContext = React.createContext({
    theme: "red"
});

export default ThemeContext;

ContextCom:

import React, { Component } from "react";
import ChildCom from "./ChildCom";

import ThemeContext from "./ThemeContext";

class ContextCom extends Component {
    render() {
        return (
            <div>
                <ThemeContext.Provider value={{theme: 'pink'}}>
                    <ChildCom />
                </ThemeContext.Provider>
            </div>
        );
    }
}

export default ContextCom;

ChildCom:

import React, { Component } from 'react'
import ThemeContext from "./ThemeContext";

class ChildCom extends Component {
  render() {
    return (
      <ThemeContext.Consumer>
        {
          context => (
            <div>this.theme: {context.theme}</div>
          )
        }
      </ThemeContext.Consumer>
    )
  }
}

export default ChildCom;

注意点

  1. 当 Provider 的 value 值发生变化时,它内部的所有消费组件都会重新渲染。Provider 及其内部 consumer 组件都不受制于 shouldComponentUpdate 函数。
  2. Context.Consumer需要函数作为子元素(function as a child)这种做法。这个函数接收当前的 context 值,返回一个 React 节点。

Class.contextType

可以通过Class.contextType直接将Context 对象挂载到class的contextType属性,然后就可以使用this.context对context对象进行使用。

import React, { Component } from "react";
import TestThemeContext from "./TestThemeContext";

class ContextTypeChildCom extends Component {
    render() {
        return <div>{JSON.stringify(this.context)}</div>;
    }
    componentDidMount() {
        console.log(this.context);
    }
}

ContextTypeChildCom.contextType = TestThemeContext;

export default ContextTypeChildCom;

如何更新Context的值呢

可以通过 context 传递一个函数,使得 consumers 组件更新 context:
ContextComProVider:

class ContextComProVider extends Component {
    constructor(props) {
        super(props);

        this.state = {
            theme: "pink",
            toggleTheme: this.toggleTheme
        };
    }

    toggleTheme = value => {
        console.log(value);
        this.setState(state => ({
            theme: value
        }));
    };

    render() {
        return (
            <div>
                <ThemeContext.Provider value={this.state}>
                    <ChildCom />
                </ThemeContext.Provider>
            </div>
        );
    }
}

childCom:

import React, { Component } from 'react'
import ThemeContext from "./ThemeContext";

let arr = ['red_','pink_','green_'];

class ChildCom extends Component {
  render() {
    return (
      <ThemeContext.Consumer>
        {
          ({theme, toggleTheme}) => (
            <div onClick={() => {toggleTheme(arr[Math.floor(Math.random() * 3)])}}>this.theme: {theme}</div>
          )
        }
      </ThemeContext.Consumer>
    )
  }
}

export default ChildCom;

相关文章

  • React学习总结5--Context

    demos源码Context 设计目的是为了共享那些对于一个组件树而言是“全局”的数据。 如何使用 将初始状态传递...

  • 2019年10月-11月学习内容总结

    学习内容总结 前端 React主要的学习路径是在React的官网以及阮一峰大佬的教程; React Hook Ne...

  • react-hooks

    前置 学习面试视频 总结react hooks react-hooks react-hooks为函数组件提供了一些...

  • react学习(2019/7/30-8/7)

    今日总结 课上提到的内容 1. 讲了react要学习的内容提纲 react 基础,JSX语法,插件 react-r...

  • React 基础学习总结

    React 基础学习总结 1、创建虚拟DOM对象的两种方式 React.createElement(type, p...

  • React 学习总结

    官网地址https://facebook.github.io/react/docs/hello-world.htm...

  • react学习总结

    1.安装npm install -g create-react-appcreate-react-app 文件名cd...

  • React学习总结

    第1章 课程导学 学习前提要有一些js、es6、webpack、npm等基础知识 第2章 React初探 2-1 ...

  • React学习总结

    创建react应用 npm install create-react-app -g html写在了哪个js文件中,...

  • React Native如何集成到现有项目中

    本系列文章作为学习RN期间的总结 React Native如何集成到现有项目中 React Native和Nati...

网友评论

      本文标题:React学习总结5--Context

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