react

161 阅读1分钟

说说Context有哪些属性?

  • React.createContext:创建一个context对象
  • Context.Provider:允许子组件消费context
  • Context.Consumer:消费组件,会消费离它最近的provider中定义的值,如果不存在,则会销毁context的默认值
  • Class.contextType:允许销毁最近的context的值
  • Context.displayName:确定Context显示的名称

怎么使用Context开发组件?

使用Class.contextType

import './App.css';
import React from 'react';
const myContext = React.createContext('defaultContext');

class App extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            name: '123'
        };
    }
    render() {
        return (
            <myContext.Provider value={this.state}>
                <Toolbar theme="dark" />;
            </myContext.Provider>
        );
    }
}

function Toolbar(props) {
    return (
        <div>
            <ThemedButton theme={props.theme} />
        </div>
    );
}

class ThemedButton extends React.Component {
    render() {
        return <div>{this.context.name}</div>;
    }
}
ThemedButton.contextType = myContext;
export default App;

使用Context.Consumer

import './App.css';
import React from 'react';
const myContext = React.createContext('defaultContext');

class App extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            name: '123'
        };
    }
    render() {
        return (
            <myContext.Provider value={this.state}>
                <Toolbar theme="dark" />;
            </myContext.Provider>
        );
    }
}

function Toolbar(props) {
    return (
        <div>
            <ThemedButton theme={props.theme} />
        </div>
    );
}

class ThemedButton extends React.Component {
    render() {
        return (
            <myContext.Consumer>
                {({ name }) => <div>{name}</div>}
            </myContext.Consumer>
        );
    }
}

export default App;

为什么React并不推荐我们优先考虑使用Context?

  • 会破坏组件树之间的依赖,不正确的使用context会使数据管理变得复杂多乱
  • 这是一个实验性的api,以后可能会被废弃掉

除了实例的属性可以获取Context外哪些地方还能直接获取Context呢?

  • 无状态组件参数直接获取
  • 构造函数
  • 生命周期函数 shouldComponentUpdate componentWillReceiveProps componentWillUpdate

childContextTypes是什么?它有什么用

childContextTypes用来定义context数据类型