之前做项目时经常会遇到某个组件需要传递方法或者数据到其内部的某个子组件,中间跨越了甚至三四层组件,必须层层传递,一不小心哪层组件忘记传递下去了就不行。然而我们的项目其实并没有那么复杂,所以也没有使用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. tp5.0:替换修改js、css等样式文件路径

    首先, 我们要知道,TP5已经不支持绝对路径访问样式文件啦!所以我们不必去花时间去找使用$_SERVER来获取 手册位置:模板->内置标签->资源文件加载 方法一: 过程: 1.首先在模块 ...

  2. PIL 图像字符画绘制

    from PIL import Image ascii_char = list('"$%_&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]? ...

  3. HDU 1521 指数型母函数

    方法一: DFS 方法二:生成函数 每个数可以重复一定次数,求排列组合数,这是裸的指数型生成函数: #include <bits/stdc++.h> using namespace std ...

  4. javascript之正则表达式基础知识小结

    javascript之正则表达式基础知识小结,对于学习正则表达式的朋友是个不错的基础入门资料.   元字符 ^ $ . * + ? = ! : | \ / ( ) [ ] { } 在使用这些符号时需要 ...

  5. HashMap对HashCode碰撞的处理

    先说Java之外的,什么是拉链法?怎么解决冲突的: 拉链法解决冲突的做法是:将所有关键字为同义词的结点链接在同一个单链表中. 若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数组t ...

  6. 论文笔记:Progressive Differentiable Architecture Search:Bridging the Depth Gap between Search and Evaluation

    Progressive Differentiable Architecture Search:Bridging the Depth Gap between Search and Evaluation ...

  7. nginx 图片,js,css等文件允许跨域

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ { #允许跨域请求 add_header Access-Control-Allow-Ori ...

  8. Ajax去除缓存

    1.在Ajax发送请求钱加上anyAjaxObj.setRequestHeader("If-Modeified-Since","0").2.在Ajax发送请求钱 ...

  9. 【题解】POJ 2115 C Looooops (Exgcd)

    POJ 2115:http://poj.org/problem?id=2115 思路 设循环T次 则要满足A≡(B+CT)(mod 2k) 可得 A=B+CT+m*2k 移项得C*T+2k*m=B-A ...

  10. PAT1067. Sort with Swap(0, *) (25) 并查集

    PAT1067. Sort with Swap(0, *) (25) 并查集 题目大意 给定一个序列, 只能进行一种操作: 任一元素与 0 交换位置, 问最少需要多少次交换. 思路 最优解就是每次 0 ...