Create-react-app来学习这个功能: 注意下面代码红色的即可,非常简单.

在小项目里Context API完全可以替换掉react-redux.

修改app.js

import React, { lazy, useState } from "react";
import { Button } from 'antd';
import { HashRouter as Router, Route, Link } from 'react-router-dom'; import GlobalContext from './globalContext' // 导入全局context
import './App.css';
//import Hehe from './hehe' //直接导入会让包变大,使用lazy会让包变小
const Hehe = lazy(() => import("./hehe"));
const T2 = lazy(() => import("./T2"));
const Reg = lazy(() => import(/* webpackChunkName: "reg" */'./reg')); //普通的组件
const PageHeaderWrapper = (prop) => {
console.log("子组件刷新...");
return (
<>
<div>PageHeaderWrapper Memo:{prop.loading} {new Date().getTime()}</div>
<div>{prop.content}</div>
</>
)
} // React.memo对PageHeaderWrapper组件进行包装,让这个PageHeaderWrapper组件进行包装组件变成可控组件
// React.memo()可接受2个参数,第一个参数为纯函数的组件,第二个参数用于对比props控制是否刷新,true不更新,与shouldComponentUpdate()功能类似。
const Memo = React.memo(PageHeaderWrapper, (prevProps, nextProps) => {
console.log(prevProps, nextProps);
//return true;
return prevProps.loading === nextProps.loading
} ); //定义一个方法用来测试接受 Provider
const ChangeName = (props) => {
return (
<GlobalContext.Consumer>
{context =>
<div>{props.title}: {context.name}</div>
}
</GlobalContext.Consumer>
)
}
//产生一个随机内容的obj 只是为了示例使用
const rand = () => {
const a = parseInt(Math.random() * 4, 10);
return { name: "aaa" + a }
} //入口文件
const App = () => {
const [value, setValue] = useState({ name: "aaa" }); return (
<GlobalContext.Provider value={value}>
<div className="App">
<header className="App-header">
<Memo loading={value.name} content='Memo content' />
<Button type="primary" onClick={() => setValue(rand)}>Hehe</Button>
<p>
Provider: {value.name}
</p> <ChangeName title="changeName"></ChangeName> <React.Suspense fallback="T2 loading...">
<Hehe />
</React.Suspense> <Router>
<Link to="/reg">
<div>会员注册</div>
</Link>
<Link to="/t2">
<div>跳转到异步组件t2</div>
</Link> <Route exact path='/' component={() => <React.Suspense fallback="T2 loading..."> <T2 /> </React.Suspense>} />
<Route path='/t2' component={() => <React.Suspense fallback="T2 loading..."> <T2 /> </React.Suspense>} />
<Route path='/reg' component={() => <React.Suspense fallback="Reg loading..."> <Reg /> </React.Suspense>} />
{/* <Route path='/regsync' component={Reg1} /> 使用同步组件会让包变大 */} </Router> </header> </div> </GlobalContext.Provider>
)
} export default App;

reg.js

import React from "react";
import axios from "axios";
import { Form, Icon, Input, Button, Checkbox, Table } from 'antd'; const columns = [
{
title: '姓名',
dataIndex: 'name',
key: 'name',
},
{
title: 'Email',
dataIndex: 'email',
key: 'email',
},
{
title: 'Ip',
dataIndex: 'ip',
key: 'ip',
},
]; //不要在使用class组件,使用函数式组件来,具体看T2.js class NormalLoginForm extends React.Component {
constructor(props){
super(props)
this.state = {
dataSource:[]
} }
handleSubmit = e => {
e.preventDefault();
//开始验证表单,如果原因 通过执行回调发送ajax
this.props.form.validateFields((err, values) => {
if (!err) {
console.log('表单里的值: ', values);
let request=values;
request.test="test";
//向后台发送
axios.get("https://www.easy-mock.com/mock/5a3a2fc5ccd95b5cf43c5740/table_list",{
params: request
}).then(response=>{
//后台返回的值:
console.log(response.data);
this.setState({dataSource:response.data.data})
}).catch(e=>{
//请求网络原因等失败了处理
});
}
});
}; render() {
const { getFieldDecorator } = this.props.form;
return (
<div id="components-form-demo-normal-login">
<Form onSubmit={this.handleSubmit} className="login-form">
<Form.Item>
{getFieldDecorator('username', {
rules: [{ required: true, message: 'Please input your username!' }],
})(
<Input
prefix={<Icon type="user" style={{ color: 'rgba(0,0,0,.25)' }} />}
placeholder="Username"
/>,
)}
</Form.Item>
<Form.Item>
{getFieldDecorator('password', {
rules: [{ required: true, message: 'Please input your Password!' }],
})(
<Input
prefix={<Icon type="lock" style={{ color: 'rgba(0,0,0,.25)' }} />}
type="password"
placeholder="Password"
/>,
)}
</Form.Item>
<Form.Item>
{getFieldDecorator('remember', {
valuePropName: 'checked',
initialValue: true,
})(<Checkbox>Remember me</Checkbox>)} <Button type="primary" htmlType="submit" className="login-form-button">
Log in
</Button> </Form.Item>
</Form>
<Table dataSource={this.state.dataSource} columns={columns} style={{background:'#fff'}} />
</div>
);
}
} const Reg = Form.create({ name: 'normal_login' })(NormalLoginForm); export default Reg;

T2.js

import React, {useState, useEffect} from "react";
import axios from "axios"; //组件 里可以使用state,这样就可以不在使用class
const T2=(prop)=>{
const [message, setMessage]=useState(()=>{
return 'start...';
}); function temp(){
axios.get('http://route.showapi.com/1764-1').then(response=> {
console.log(response.data.showapi_res_error);
setMessage(response.data.showapi_res_error);
})
}
useEffect( () => {
temp()
}, [message]); // 给useEffect传第二个参数。用第二个参数来告诉react只有当这个参数的值发生改变时,才执行我们传的副作用函数(第一个参数)。
return (
<>
<div>T2. message: {message}</div>
</>
)
} export default T2;
GlobalContext.js
import React from 'react'
const GlobalContext = React.createContext();
export default GlobalContext;

10分钟学会React Context API的更多相关文章

  1. 10分钟学会VS NuGet包私有化部署

    前言 我们之前实现了打包发布NuGet,但是发布后的引用是公有的,谁都可以访问,显然这种方式是不可取的. 命令版本:10分钟学会Visual Studio将自己创建的类库打包到NuGet进行引用(ne ...

  2. 10分钟学会Linux

    10分钟学会Linux有点夸张,可是能够让一个新手初步熟悉Linux中最重要最主要的知识,本文翻译的英文网页在众多Linux入门学习的资料中还是很不错的. 英文地址:http://freeengine ...

  3. 10分钟学会搭建Android开发环境 Eclipse: The import android.support cannot be resolved

    10分钟学会搭建Android开发环境_隋雨辰 http://v.youku.com/v_show/id_XNTE2OTI5Njg0.html?from=s1.8-1-1.2 The import a ...

  4. 【译】10分钟学会Pandas

    十分钟学会Pandas 这是关于Pandas的简短介绍主要面向新用户.你可以参考Cookbook了解更复杂的使用方法 习惯上,我们这样导入: In [1]: import pandas as pd I ...

  5. UWP开发入门(十九)——10分钟学会在VS2015中使用Git

    写程序必然需要版本控制,哪怕是个人项目也是必须的.我们在开发UWP APP的时候,VS2015默认提供了对微软TFS和Git的支持.考虑到现在Git很火,作为微软系的程序员也不得不学一点防身,以免被开 ...

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

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

  7. 10分钟了解 react 引入的 Hooks

    "大家好,我是谷阿莫,今天要将的是一个...",哈哈哈,看到这个题我就想到这个开头.最近react 官方在 2018 ReactConf 大会上宣布 React v16.7.0-a ...

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

  9. React Context API

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

随机推荐

  1. 通俗易懂的理解 Redux(知乎)

    1. React有props和state: props意味着父级分发下来的属性[父组件的state传递给子组件  子组件使用props获取],state意味着组件内部可以自行管理的状态,并且整个Rea ...

  2. 虚拟机三种网络模式及Xshell与Centos7虚拟机连接

    一.虚拟机的三种网络模式 1.桥接模式 a.该模式下的虚拟机可以上外网 b. 局域网之内的主机可以访问该虚拟机(做共享服务器使用) c. 该虚拟机可以和宿主机进行通信 d. 同一台主机相同模式下的虚拟 ...

  3. 机器学习实战-K-近邻算法(kNN)

    k-近邻算法(kNN)---它的工作原理是:存在一个样本数据集合,也称做训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每个数据与所属分类的对应关系.输入没有标签的新数据后,将新数据的每 ...

  4. Arm-linux-gcc-4.3.2安装步骤 (转)

    http://blog.chinaunix.net/uid-26119896-id-3302233.html 安装交叉编译工具链: 1.首先以root用户登入 2.复制arm-linux-gcc-4. ...

  5. 深入理解java:2.3.2. 并发编程concurrent包 之重入锁/读写锁/条件锁

    重入锁 Java中的重入锁(即ReentrantLock)   与JVM内置锁(即synchronized)一样,是一种排它锁. ReentrantLock提供了多样化的同步,比如有时间限制的同步(定 ...

  6. [DS+Algo] 002 一维表结构

    目录 1. 顺序表 1.1 分类 1.2 实现方式 1.3 扩容问题 1.4 操作 2. 链表 2.1 分类 2.2 链表相关操作 2.3 链表 VS 顺序表 3. 关于代码实现 1. 顺序表 1.1 ...

  7. [转帖]CGI与ISAPI的区别(转)

    CGI与ISAPI的区别(转) 不知道原始网站是哪个 博客园里面也是转帖的 https://www.cnblogs.com/eret9616/p/8515095.html 不过我还是不了解CGI和IS ...

  8. c++ 判断两圆位置关系

    对于两圆的位置一般有五种关系: (1) 外离:两圆的半径之和小于两圆圆心距离 (2) 外切:两圆的半径之和等于两圆圆心距离 (3) 相交:两圆的半径之和大于两圆圆心距离,两圆圆心距离大于两圆半径之差 ...

  9. 洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心)

    洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/132 ...

  10. Python 多列数据存储

    zip()函数 zip函数可以把多个列表相加成一个tuple(元组) a = [1,2,3,4] b = [11,22,33,44] c = [111,222,333,444] A = list(zi ...