[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;
点击前:
点击切换后:
[React]Context机制的更多相关文章
- 探索 Redux4.0 版本迭代 论基础谈展望(对比 React context)
Redux 在几天前(2018.04.18)发布了新版本,6 commits 被合入 master.从诞生起,到如今 4.0 版本,Redux 保持了使用层面的平滑过渡.同时前不久, React 也从 ...
- Flask 的 Context 机制
转自https://blog.tonyseek.com/post/the-context-mechanism-of-flask/ Flask 的 Context 机制 2014 年 07 月 21 日 ...
- React context基本用法
React的context就是一个全局变量,可以从根组件跨级别在React的组件中传递.React context的API有两个版本,React16.x之前的是老版本的context,之后的是新版本的 ...
- [React] Prevent Unnecessary Rerenders of Compound Components using React Context
Due to the way that React Context Providers work, our current implementation re-renders all our comp ...
- 【React】354- 一文吃透 React 事件机制原理
大纲 主要分为4大块儿,主要是结合源码对 react事件机制的原理 进行分析,希望可以让你对 react事件机制有更清晰的认识和理解. 当然肯定会存在一些表述不清或者理解不够标准的地方,还请各位大神. ...
- React Context API
使用React 开发程序的时候,组件中的数据共享是通过数据提升,变成父组件中的属性,然后再把属性向下传递给子组件来实现的.但当程序越来越复杂,需要共享的数据也越来越多,最后可能就把共享数据直接提升到最 ...
- React Hooks +React Context vs Redux
React Hooks +React Context vs Redux https://blog.logrocket.com/use-hooks-and-context-not-react-and-r ...
- [译]React Context
欢迎各位指导与讨论 : ) 前言 由于笔者英语和技术水平有限,有不足的地方恳请各位指出.我会及时修正的 O(∩_∩)O 当前React版本 15.0.1 时间 2016/4/25 正文 React一个 ...
- 理解Go Context机制
1 什么是Context 最近在公司分析gRPC源码,proto文件生成的代码,接口函数第一个参数统一是ctx context.Context接口,公司不少同事都不了解这样设计的出发点是什么,其实我也 ...
随机推荐
- git指令-删除
git指令-删除 添加一个新文件test.txt到Git并且提交: $ git add test.txt $ git commit -m "add test.txt" [maste ...
- Python3——2019年全国大学生计算二级考试
Python语言程序设计二级重点(2019年版) 第一章 程序设计基本方法 IPO程序编写方法 :输入(input),输出(output),处理(process): Python程序的特点: (1)语 ...
- 《OneForAll框架搭建之旅》前端篇:微前端架构设计(Vue)
心之所向,勇往直前!记录开发过程中的那些小事,给自己加点经验值. 前言 作为一个.Net后端开发,在竞争愈加激烈的当下,掌握点前端配菜好像已经是家常便饭了. 刚好在工作的第5个年头,辞去小主管职务的我 ...
- 【JavaScript】DOM之表单操作
DOM 表单操作 1.获取表单 获取表单元素 以Document对象中forms属性来获取当前HTML页面所有表单集合以Document对象中表单的name属性值来获取表单元元素 <body&g ...
- 必备技能六、Vue中实现全局方法
现实背景:很多时候我们会在全局调用一些方法. 实现方式两种:官网的实现use方法,然后你也可以用野路子直接在Vue.prototype上面定义. 先说野路子,因为其实野路子就是最根本的实现方式,官方的 ...
- 如何找回微信小程序源码?2020年微信小程序反编译最新教程 小宇子李
前言:在网上看了找回微信小程序源码很多教程,都没法正常使用.微信版本升级后,会遇到各种报错, 以及无法获取到wxss的问题.查阅各种资料,最终解决,于是贴上完整的微信小程序反编译方案与教程. 本文章仅 ...
- 「踩坑记」Android API 判断权限申请结果的闪退问题
这几天尝试着用Android Studio写一个小工具的时候遇到了一个动态权限申请的问题.权限的申请使用的语句为: ActivityCompat.requestPermissions(this, ne ...
- JAVA多线程面试必看(转载)
JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...
- 深度学习归一化:BN、GN与FRN
在深度学习中,使用归一化层成为了很多网络的标配.最近,研究了不同的归一化层,如BN,GN和FRN.接下来,介绍一下这三种归一化算法. BN层 BN层是由谷歌提出的,其相关论文为<Batch No ...
- 通达OA rce复现
通达OA下载:链接:https://pan.baidu.com/s/1c0P-M-IyY5VxfH5d0qKHsQ 提取码:l0pc 漏洞原因:未授权文件上传 + 文件包含(利用nginx日志也可以g ...