[React]Context机制

在React中,Context机制是为了方便在组件树间传递数据。

例子

import React from ‘react‘
const themes={
    light:"亮色主题",
    dark:"暗色主题"
}
const sexs={
    man:"男性",
    wem:"女性",
}
const SexContext=React.createContext(sexs.man);
const ThemeContext=React.createContext(themes.dark);
export default class Context extends React.Component {
    state={
        theme:themes.light,
        sex:sexs.wem,
    }
    render(){
        return(
            <div>
                <ThemeContext.Provider value={this.state.theme}>
                    <ThemeSwitch />
                </ThemeContext.Provider>
                <SexContext.Provider value={this.state.sex}>
                    <SexSwitch />
                </SexContext.Provider>

            </div>
        );
    }
}

class ThemeSwitch extends React.Component {

    render(){
        //let theme=this.context;
        return (
            <ThemeContext.Consumer>
                {value=><button>{value}</button>}
            </ThemeContext.Consumer>
        );
    }
}

class SexSwitch extends React.Component {
    render(){
        let sex=this.context;
        return (
            <button>
                {sex}
            </button>
        );
    }
}
SexSwitch.contextType=SexContext;

这个例子是根据React文档进行修改得到的。

API

Context有几个API是必须要知道的:

React.createContext

作用:创建Context对象

用法:

const MyContext = React.createContext(defaultValue);

MyContext为Context对象名,defaultValue为默认数据。默认数据将会在Cousumer找不到Provider时生效。

Context.Provider

作用:为订阅它的数据在每次value变化时提供更新。

用法:

<MyContext.Provider value={/* 某个值 */}>

Class.contextType

作用:为Class绑定数据源,绑定后可以使用this.context获得Provider的value;

用法:

MyClass.contextType = MyContext;

MyClass为Cousumer所在的组件。

Context.Consumer

作用:在函数式组件中完成订阅context

用法:

<MyContext.Consumer>
  {value => /* 基于 context 值进行渲染*/}
</MyContext.Consumer>

value即为Provider的value属性

有了上面的知识,就可以对例子进行分析了

例子的解读

在例子中,声明了两个Context,分别代表主题和性别,它们是两个指定按钮的text

ThemeSwitch为通过函数式组件订阅context,

SexSwitch通过语句SexSwitch.contextType=SexContext;将SexSwitch与对应context进行绑定,以便使用this.context获得value值。

在使用时,两者的数据通过state输入。

最后的效果:

当有方法修改state时,将会对按钮的值进行修改。

补充后代码如下:

import React from ‘react‘
const themes={
    light:"亮色主题",
    dark:"暗色主题"
}
const sexs={
    man:"男性",
    wem:"女性",
}
const SexContext=React.createContext(sexs.man);
const ThemeContext=React.createContext(themes.dark);
export default class Context extends React.Component {
    state={
        theme:themes.light,
        sex:sexs.wem,
    }
    handleSwitch=()=>{
        let sex=this.state.sex;
        let theme=this.state.theme;

        this.setState({
            sex:sex==sexs.man?sexs.wem:sexs.man,
            theme:theme==themes.dark?themes.light:themes.dark,

        })
    }
    render(){
        return(
            <div>
                <ThemeContext.Provider value={this.state.theme}>
                    <ThemeSwitch />
                </ThemeContext.Provider>
                <SexContext.Provider value={this.state.sex}>
                    <SexSwitch />
                </SexContext.Provider>
                <button onClick={this.handleSwitch}>切换</button>
            </div>
        );
    }
}

class ThemeSwitch extends React.Component {

    render(){
        //let theme=this.context;
        return (
            <ThemeContext.Consumer>
                {value=><button>{value}</button>}
            </ThemeContext.Consumer>
        );
    }
}

class SexSwitch extends React.Component {
    render(){
        let sex=this.context;
        return (
            <button>
                {sex}
            </button>
        );
    }
}
SexSwitch.contextType=SexContext;

点击前:

点击切换后:

原文地址:https://www.cnblogs.com/liuju/p/12607838.html

时间: 2024-08-30 03:30:56

[React]Context机制的相关文章

React Context

[React Context] 1.Why Not To Use Context The vast majority of applications do not need to use context. 大多数应用不需要使用context. If you want your application to be stable, don't use context. It is an experimental API and it is likely to break in future rele

Flask 的 Context 机制

转自https://blog.tonyseek.com/post/the-context-mechanism-of-flask/ Flask 的 Context 机制 2014 年 07 月 21 日 用过 Flask 做 Web 开发的同学应该不会不记得 App Context 和 Request Context 这两个名字——这两个 Context 算是 Flask 中比较特色的设计.[1] 从一个 Flask App 读入配置并启动开始,就进入了 App Context,在其中我们可以访问

[React] Use React Context to Manage Application State Through Routes

We’ll create a Router component that will wrap our application and manage all URL related state. We’ll see how we can use React’s built in context mechanism to pass data and functions between components without having to pass props all the way down t

使用react context实现一个支持组件组合和嵌套的React Tab组件

纵观react的tab组件中,即使是github上star数多的tab组件,实现原理都非常冗余. 例如Github上star数超四百星的react-tab,其在render的时候都会动态计算哪个tab是被选中的,哪个该被隐藏: getChildren() { let index = 0; let count = 0; const children = this.props.children; const state = this.state; const tabIds = this.tabIds

浅析react中间件机制

看过react的人都知道, react是一个view层的展现库,要想实现对页面数据和路由的管理还需要配合其它的库.这其中最常用的就是redux和react-router库. 通过redux库能够统一管理页面数据,保证数据的单向流动,其大概流程是 用户触发页面交互,页面根据用户交互产生一个action并将这个action通过store的dispatch方法传给 sotre,store根据一定关系找到reducer,reducer根据action的type类型产生新的state值并将新产生的stat

源码看React 事件机制

对React熟悉的同学都知道,React中的事件机制并不是原生的那一套,事件没有绑定在原生DOM上,发出的事件也是对原生事件的包装.那么这一切是怎么实现的呢? 事件注册 首先还是看我们熟悉的代码 <button onClick={this.autoFocus}>点击聚焦</button> 这是我们在React中绑定事件的常规写法.经由JSX解析,button会被当做组件挂载.而onClick这时候也只是一个普通的props.ReactDOMComponent在进行组件加载(moun

react context toggleButton demo

//toggleButton demo: //code: //1.Appb.js: import React from 'react'; import {ThemeContext, themes} from './theme-context'; import ThemeTogglerButton from './theme-toggler-button'; class Appb extends React.Component { constructor(props) { super(props)

React事件机制-事件分发

事件分发 之前讲述了事件如何绑定在document上,那么具体事件触发的时候是如何分发到具体的监听者呢?我们接着上次注册的事件代理看.当我点击update counter按钮时,触发注册的click事件代理. function dispatchInteractiveEvent(topLevelType, nativeEvent) { interactiveUpdates(dispatchEvent, topLevelType, nativeEvent); } function interacti

react渲染机制

react组件 class Form extends React.Compoent{ constructor() { super() } render(){ return( <from><input type="text"/></from> ) } } ReactDOM.render((<div><Form/></div>)).document.getElementById('app') ReactDOM.rend