react中的context的基础用法
context提供了一种数据共享的机制,里面有两个关键概念——provider,consumer,下面做一些key features描述。
参考网址:https://react.docschina.org/docs/context.html#reactcreatecontext
consumer:
数据消费者,消费来自己向上回溯过程中,离自己最近的provider提供的数据。
consumer接收一个函数作为子节点,函数返回一个react节点;函数可以消费来自context的值(即最近provider提供的数据)进行内部JSX语法渲染。
provider:
数据提供者,一个provider下的所有消费者都可以消费来自该provider的数据。
provider接收一个value属性,这个属性讲被provider提供给其consumer子节点。
一个provider可对应多个consumer。
生成一对{ provider, consumer}

基本上关于Context相关的主要特性都介绍完了,一个完整的demo如下:
theme-context.js
export const themes = {
light: {
foreground: '#ffffff',
background: '#222222',
},
dark: {
foreground: '#000000',
background: '#eeeeee',
},
};
export const ThemeContext = React.createContext(
themes.light //默认值
);
themed-button.js
import React from 'react';
import {themes,ThemeContext} from './theme-context';
class ThemeCircle extends React.Component{
render(){
return (<ThemeContext.Consumer>
{ theme => (<div
style={{
width:"60px",
height:"60px",
borderRadius:"30px",
backgroundColor: theme.background}}>
{/* Circle */}
</div>) }
</ThemeContext.Consumer>
);
}
}
class ThemedButton extends React.Component{
constructor( props ){
super(props);
}
render(){
return (<ThemeContext.Consumer>
{ theme => (<button
onClick = {this.props.changeTheme}
{...this.props}
style={{
backgroundColor:theme.background,
color:theme.foreground,
width:"100px",
height:"45px",
fontSize:"14px",
borderRadius:"5px",
border:"none"}}
/>) }
</ThemeContext.Consumer>);
}
}
// class ToolBar extends React.Component{//一个用到ThemedButton的中间件
// constructor( props ){
// super(props);
// }
// render(){//以此种方式直接触发父级事件?
// return (<ThemedButton onClick={this.props.changeTheme}>
// Change Theme
// </ThemedButton>);
// }
// }
class CustomizedApp extends React.Component{
constructor( props ){
super(props);
this.state = {
theme: themes.light
};
this.handleChangeTheme = this.handleChangeTheme.bind( this );
}
handleChangeTheme(){
//必须有一个机制可以修改provider的value,以引起订阅者consumer的变更
this.setState( state => ({
theme: state.theme === themes.light?themes.dark:themes.light
}) );
}
render(){
return (<div>
<ThemeContext.Provider value={this.state.theme}>
{/* <ToolBar changeTheme={this.handleChangeTheme} /> */}
<ThemedButton changeTheme={this.handleChangeTheme}>
Toggle
</ThemedButton>
<ThemeCircle />
</ThemeContext.Provider>
</div>);
}
}
export default CustomizedApp;
然后在Router里配置调用“CustomizedApp”组件就可以了。
路漫漫其修远其,吾将上下而求索——May stars guide your way.
react中的context的基础用法的更多相关文章
- React中的Context——从父组件传递数据
简介:在React中,数据可以以流的形式自上而下的传递,每当你使用一个组件的时候,你可以看到组件的props属性会自上而下的传递.但是,在某些情况下,我们不想通过父组件的props属性一级一级的往下传 ...
- React中使用styled-components的基础使用
今天准备来给大家分享分享React中styled-components的基础使用,仅仅是我个人的一些理解,不一定全对,有错误还请大佬们指出,496838236这是我qq,有想指点我的大佬随时加我qq好 ...
- react中对于context的理解
一.context旧版的基本使用 1.context的理解 当不想在组件树中通过逐层传递props或state的方式来传递数据时,可使用context来实现跨层级的组件数据传递. 2.context的 ...
- React中ref的三种用法 可以用来获取表单中的值 这一种类似document.getXXId的方式
import React, { Component } from "react" export default class MyInput extends Component { ...
- python中在计算机视觉中的库及基础用法
基于python脚本语开发的数字图像处理包有很多,常见的比如PIL.Pillow.opencv.scikit-image等.PIL和pillow只提供了基础的数字图像处理,功能有限:OpenCV实际上 ...
- react基础用法一(在标签中渲染元素)
react基础用法一(渲染元素) 如图所示最简单的变量使用方法 格式 let 变量名称 = 赋值: 渲染格式直接用 {变量名称} 就可以直接渲染到页面 如图所示第二种渲染方法 格式 const 变量名 ...
- Spring中JdbcTemplate的基础用法
Spring中JdbcTemplate的基础用法 1.在DAO中使用JdbcTemplate 一般都是在DAO类中使用JdbcTimplate,在XML配置文件中配置好后,可以在DAO中注入即可. 在 ...
- Vue基础01vue的基本示例,vue的双向数据绑定,vue中常见的几种用法,vue相关常见指令
自学vue框架,每天记录重要的知识点,与大家分享!有不足之处,希望大家指正. 本篇将讲述:vue的基本示例,vue的双向数据绑定,vue中常见的几种用法,vue相关常见指令 前期学习基础,使用vue. ...
- React中Props 和 State用法
React中Props 和 State用法 1.本质 一句话概括,props 是组件对外的接口,state 是组件对内的接口.组件内可以引用其他组件,组件之间的引用形成了一个树状结构(组件树),如果下 ...
随机推荐
- Android四种启动模式
四种启动模式 standard(默认) singleTop singleTast singleInstance standard(默认) 系统默认的启动模式. Android是使用返回栈来管理活动的, ...
- Ubuntu12.04下安装、使用、卸载MySQL
转自:http://blog.csdn.net/yimi0903/article/details/11800713 一.安装 Step1:安装MySQL-server,mysql-client 执行以 ...
- SSAS GUID 添加 行计数,非重复计数 等 遇到的莫名其妙的问题
在基于某个GUID 进行非重复性计数时 需要对GUID 转换类型,如:CAST(ColumnName as varchar(36)) 可参考:http://stackoverflow.com/ques ...
- python3 类 组合
解决类与类之间代码冗余问题有两种解决方案: 第一 是继承,第二是组合 1:继承 描述的是类与类之间的也就是什么是什么的关系 2: 组合 描述的是类与类之间的关系, 是一种什么有什么的关系的,也 ...
- C#backgroundWorker用法
1.在 WinForms 中,有时要执行耗时的操作,在该操作未完成之前操作用户界面,会导致用户界面停止响应.解决的方法就是新开一个线程,把耗时的操作放到线程中执行,这样就可以在用户界面上进行其它操作. ...
- lua面向对象实现(实例化对象、继承、多态、多继承、单例模式)
lua面向对象实现: 一个类就像是一个创建对象的模具.有些面向对象语言提供了类的概念,在这些语言中每个对象都是某个特定类的实例.lua则没有类的概念,每个对象只能自定义行为和形态.不过,要在lua中模 ...
- HDU1059 【DP·二进制数优化】
题意: 有6种不同价值的物品,然后问你能不能分成两半使得两堆价值相等: 思路: 一共有20000*6=120000 多的价值, 总共背包有20000个,价值最大是120000,看看能不能DP到valu ...
- laravel 报错htmlspecialchars() expects parameter 1 to be string, object given
翻译过来就是 期望参数1是字符串 意思就是说变量为数组,应以数组的方式输出 @foreach($xxx as $k=>$y) {{$k}}{{$y}} @endforeach
- VR头盔产品镜片评测
2015-07-21 16:59 原创 Randy Orton http://www.leiphone.com/news/201507/7j46BjWsSitKML13.html 虚拟现实设备自从去年 ...
- [Xcode 实际操作]八、网络与多线程-(3)使用UIApplication对象拨打电话
目录:[Swift]Xcode实际操作 本文将演示如何使用应用程序单例对象,拨打电话的功能. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] 注:需要使用真机进行测 ...