之前做项目时经常会遇到某个组件需要传递方法或者数据到其内部的某个子组件,中间跨越了甚至三四层组件,必须层层传递,一不小心哪层组件忘记传递下去了就不行。然而我们的项目其实并没有那么复杂,所以也没有使用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的更多相关文章

  1. 手写一个React-Redux,玩转React的Context API

    上一篇文章我们手写了一个Redux,但是单纯的Redux只是一个状态机,是没有UI呈现的,所以一般我们使用的时候都会配合一个UI库,比如在React中使用Redux就会用到React-Redux这个库 ...

  2. React Hooks & Context API

    React Hooks & Context API responsive website https://reactjs.org/docs/hooks-reference.html https ...

  3. React 新 Context API 在前端状态管理的实践

    本文转载至:今日头条技术博客 众所周知,React的单向数据流模式导致状态只能一级一级的由父组件传递到子组件,在大中型应用中较为繁琐不好管理,通常我们需要使用Redux来帮助我们进行管理,然而随着Re ...

  4. React 全新的 Context API

    Context API 可以说是 React 中最有趣的一个特性了.一方面很多流行的框架(例如react-redux.mobx-react.react-router等)都在使用它:另一方面官方文档中却 ...

  5. React 16.3来了:带着全新的Context API

    文章概览 React在版本16.3-alpha里引入了新的Context API,社区一片期待之声.我们先通过简单的例子,看下新的Context API长啥样,然后再简单探讨下新的API的意义. 文中 ...

  6. [译]迁移到新的 React Context Api

    随着 React 16.3.0 的发布,context api 也有了很大的更新.我已经从旧版的 api 更新到了新版.这里就分享一下我(作者)的心得体会. 回顾 下面是一个展示如何使用旧版 api ...

  7. React Context API

    使用React 开发程序的时候,组件中的数据共享是通过数据提升,变成父组件中的属性,然后再把属性向下传递给子组件来实现的.但当程序越来越复杂,需要共享的数据也越来越多,最后可能就把共享数据直接提升到最 ...

  8. 10分钟学会React Context API

    Create-react-app来学习这个功能: 注意下面代码红色的即可,非常简单. 在小项目里Context API完全可以替换掉react-redux. 修改app.js import React ...

  9. [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 ...

随机推荐

  1. Opencv4android的Android Studio环境配置及项目实例下载

    因为软件竞赛的项目会用到Opencv for Android,所以就研究了一下如何在Android Studio上配置Opencv4Android 环境概述: Android Studio 2.3 O ...

  2. 代码混淆和dump

    首先是安装和使用dump: 下载dump地址 1.选择class-dump-3.5.dmg 下载: 2.下载之后,点击打开,复制class-dump文件, 3.shift+command+G 打开fi ...

  3. POJ 1745 【0/1 背包】

    题目链接:http://poj.org/problem?id=1745 Divisibility Time Limit: 1000MS   Memory Limit: 10000K Total Sub ...

  4. 2018.11.28 OGNL表达式与struts2框架结合的体现---在配置文件中体现(补充)

    Demo3Action配置 struts.xml 主配置文件配置 地址栏输入 http://localhost:8080/StrutsDay03/Demo3Action 对于主配置的文件参数而言,如果 ...

  5. 【luoguP1563】【2016NOIP-High】玩具迷题

    P1563 玩具谜题 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业. 有一天, 这些玩具小人把小南的眼镜藏了起来. 小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外.如下图: ...

  6. 【题解】洛谷P2607【ZJOI2008】骑士

    洛谷P2607:https://www.luogu.org/problemnew/show/P2607 一道毒瘤的环基树问题 第一次做环基树的题目 刚看题目的时候觉得不就是跟没有上司的舞会一样嘛 然后 ...

  7. 优雅的QSignleton (四) 通过属性器实现MonoSingleton

      大家都出去过周六了,而我却在家写代码T.T...   接下来介绍通过属性器实现MonoSingleton. 代码如下: MonoSingletonProperty.cs namespace QFr ...

  8. Java实现桶排序

    public class BucketSort { public static void main(String[] args) { int[] list = {1000, 192, 221, 12, ...

  9. oracle client安装与配置

    (一)安装Oracle client 环境:windows7 64-bit.oracle client 64-bit (1)解压client安装包 (2)双击setup.exe,选择管理员,一直nex ...

  10. Linux修改时区以及同步时间

    Centos7为例:修改时区 timedatectl list-timezones |grep Shanghai #查找中国时区的完整名称 Asia/Shanghai timedatectl set- ...