简单整理React的Context API
之前做项目时经常会遇到某个组件需要传递方法或者数据到其内部的某个子组件,中间跨越了甚至三四层组件,必须层层传递,一不小心哪层组件忘记传递下去了就不行。然而我们的项目其实并没有那么复杂,所以也没有使用redux。这种情况下,使用react本身的Context API来解决数据层层传递问题就很方便啦。
废话不多说,直接来说说这个API怎么用!其实官网文档里写的已经非常清楚了,而且也有examples。我写此篇博客,纯粹就是自己闲着没事整理下罢了。
我们先来看个我写的小demo:
import React, {createContext, PureComponent} from 'react';
const ThemeContext = createContext({
color: '#f83',
background: '#EEE'
});
const themes = [
{
color: '#f00',
background: '#efa'
},
{
color: '#06fae5',
background: '#aae'
},
{
color: '#ef5',
background: '#cef'
},
{
color: '#fff',
background: '#000'
}
];
class ThemedButton extends PureComponent {
render() {
return (
<ThemeContext.Consumer>
{({theme, changeTheme}) => <button onClick={changeTheme} style={{background: theme.background, color: theme.color}}> It's a button. </button>}
</ThemeContext.Consumer>
);
}
}
class ShowTheme extends PureComponent {
render() {
return (
<ThemeContext.Consumer>
{({theme, changeTheme}) => <div>
<span>color是:{theme.color}</span>
<br/>
<span>background是:{theme.background}</span>
</div>}
</ThemeContext.Consumer>
);
}
}
class Header extends PureComponent {
render() {
return (
<div>
<ThemedButton/>
<ShowTheme/>
</div>
);
}
}
export default class TestContext extends PureComponent {
state = {
themeIndex: 0
};
changeTheme = () => {
const {themeIndex} = this.state;
const newIndex = themeIndex < themes.length - 1 ? (themeIndex + 1) : 0;
this.setState({
themeIndex: newIndex
});
};
render() {
const {themeIndex} = this.state;
return (
<div className="test-test">
<ThemeContext.Provider value={{
theme: themes[themeIndex],
changeTheme: this.changeTheme
}}>
<Header />
</ThemeContext.Provider>
</div>
);
}
}
实现的功能很简单:我预设了4个主题色,点击按钮的时候会按照预设的主题色依次改变button的字体颜色和背景色,并且列出当前所使用的主题色。
接下来简单分析下书面的代码:
1、首先需要导入react的createContext方法,可以传个defaultValue作为默认值作为参数给这个方法,得到了ThemeContext
2、ThemeContext上挂了两个组件:Provider、Consumer,看字面意思就知道一个是供应者、一个是消费者。供应者,就是提供数据的地方。消费者,就是使用数据的地方。
3、Consumer组件必须在Provider的内部,Consumer可以是一个,也可以是多个,上面代码中就有两个Consumer。
4、Consumer的children是一个函数,返回一个组件。函数的参数就是从Provider的value或者defaultValue获取到的数据。
5、Provider可以有,也可以没有。有Provider时,Consumer就会获取Provider的value里的数据。没有Provider时,Consumer就会取调用createContext时作为参数传进去的defaultValue值。
6、Provider的value,不限制啥类型,你传字符串可以,你传map也可以,就看你的业务场景怎么用比较爽。
简单整理React的Context API的更多相关文章
- 手写一个React-Redux,玩转React的Context API
上一篇文章我们手写了一个Redux,但是单纯的Redux只是一个状态机,是没有UI呈现的,所以一般我们使用的时候都会配合一个UI库,比如在React中使用Redux就会用到React-Redux这个库 ...
- React Hooks & Context API
React Hooks & Context API responsive website https://reactjs.org/docs/hooks-reference.html https ...
- React 新 Context API 在前端状态管理的实践
本文转载至:今日头条技术博客 众所周知,React的单向数据流模式导致状态只能一级一级的由父组件传递到子组件,在大中型应用中较为繁琐不好管理,通常我们需要使用Redux来帮助我们进行管理,然而随着Re ...
- React 全新的 Context API
Context API 可以说是 React 中最有趣的一个特性了.一方面很多流行的框架(例如react-redux.mobx-react.react-router等)都在使用它:另一方面官方文档中却 ...
- React 16.3来了:带着全新的Context API
文章概览 React在版本16.3-alpha里引入了新的Context API,社区一片期待之声.我们先通过简单的例子,看下新的Context API长啥样,然后再简单探讨下新的API的意义. 文中 ...
- [译]迁移到新的 React Context Api
随着 React 16.3.0 的发布,context api 也有了很大的更新.我已经从旧版的 api 更新到了新版.这里就分享一下我(作者)的心得体会. 回顾 下面是一个展示如何使用旧版 api ...
- React Context API
使用React 开发程序的时候,组件中的数据共享是通过数据提升,变成父组件中的属性,然后再把属性向下传递给子组件来实现的.但当程序越来越复杂,需要共享的数据也越来越多,最后可能就把共享数据直接提升到最 ...
- 10分钟学会React Context API
Create-react-app来学习这个功能: 注意下面代码红色的即可,非常简单. 在小项目里Context API完全可以替换掉react-redux. 修改app.js import React ...
- [React] Use the new React Context API
The React documentation has been warning us for a long time now that context shouldn't be used and t ...
随机推荐
- 关于git stash的应用总结
Step1 新增 git stash save -a "message" // 对于在项目里加入了代码新文件的开发来说,-a选项才会将新加入的代码文件同时放入暂存区 类似于 git ...
- [EffectiveC++]item31:将文件间的编译依存关系降至最低
P143:“声明的依赖性"替换“定义的依存性”
- 微信小程序国际化
微信小程序国际化 现状 小程序国际化官方没有支持,也没有现成的插件. 网上有人做了国际化的尝试.但是只能替换静态文本,就是简单的键值匹配. vue-i18n 由于是基于html 和 vue, 不同于w ...
- 如何将BSP应用配置成Fiori Launchpad上的一个tile
当我们通过WebIDE或者Eclipse的插件Team Provider把一个本地开发好的UI5应用部署到了ABAP Netweaver服务器上之后,我们可以将该UI5应用配置成Fiori launc ...
- NO.011-2018.02.16《三五七言 / 秋风词》唐代:李白
三五七言 / 秋风词_古诗文网 三五七言 / 秋风词 唐代:李白 秋风清,秋月明,秋风凌清,秋月明朗. 落叶聚还散,寒鸦栖复惊.风中的落叶时聚时散,寒鸦本已栖息,又被明月惊起.落叶聚还(huán)散: ...
- C语言 指向函数的指针
#include <stdio.h> int sum(int a, int b) { int c = a + b; printf("%d + %d = %d\n", a ...
- 【LOJ6052】「雅礼集训 2017 Day11」DIV(杜教筛)
点此看题面 大致题意: 求\(1\sim n\)内所有满足\(a>0\)的约数\(a+bi\)的\(a\)之和. 解题思路 首先,我们设\(x=(a+bi)(c+di)(1\le x\le n) ...
- 【转】彻底理解安卓里的ldpi、mdpi、hdpi、xhdpi、xxhdpi文件夹含义
这个问题我相信困惑了好多人包括很多老鸟,而且有的人以为自己理解其实是错误的,包括之前的我在内,在做安卓适配的时候,一般让美工做720*1280的切图,就直接放到xhdpi下,如果是做了1080*192 ...
- No space left on device错误解决
No space left on device错误解决笔记 今天准备重启下数据库(linux oracle11g) conn /as sysdba; 出现这样的错误No space left on d ...
- 【luogu P4568 [JLOI2011]飞行路线】 题解
题目链接:https://www.luogu.org/problemnew/show/P4568 卡了一晚上,算是分层图最短路的模板.注意卡SPFA,所以我写了个SLF优化. 同时 AC400祭!~ ...