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

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

修改app.js

  1. import React, { lazy, useState } from "react";
  2. import { Button } from 'antd';
  3. import { HashRouter as Router, Route, Link } from 'react-router-dom';
  4.  
  5. import GlobalContext from './globalContext' // 导入全局context
  6. import './App.css';
  7. //import Hehe from './hehe' //直接导入会让包变大,使用lazy会让包变小
  8. const Hehe = lazy(() => import("./hehe"));
  9. const T2 = lazy(() => import("./T2"));
  10. const Reg = lazy(() => import(/* webpackChunkName: "reg" */'./reg'));
  11.  
  12. //普通的组件
  13. const PageHeaderWrapper = (prop) => {
  14. console.log("子组件刷新...");
  15. return (
  16. <>
  17. <div>PageHeaderWrapper Memo:{prop.loading} {new Date().getTime()}</div>
  18. <div>{prop.content}</div>
  19. </>
  20. )
  21. }
  22.  
  23. // React.memo对PageHeaderWrapper组件进行包装,让这个PageHeaderWrapper组件进行包装组件变成可控组件
  24. // React.memo()可接受2个参数,第一个参数为纯函数的组件,第二个参数用于对比props控制是否刷新,true不更新,与shouldComponentUpdate()功能类似。
  25. const Memo = React.memo(PageHeaderWrapper, (prevProps, nextProps) => {
  26. console.log(prevProps, nextProps);
  27. //return true;
  28. return prevProps.loading === nextProps.loading
  29. }
  30.  
  31. );
  32.  
  33. //定义一个方法用来测试接受 Provider
  34. const ChangeName = (props) => {
  35. return (
  36. <GlobalContext.Consumer>
  37. {context =>
  38. <div>{props.title}: {context.name}</div>
  39. }
  40. </GlobalContext.Consumer>
  41. )
  42. }
  43. //产生一个随机内容的obj 只是为了示例使用
  44. const rand = () => {
  45. const a = parseInt(Math.random() * 4, 10);
  46. return { name: "aaa" + a }
  47. }
  48.  
  49. //入口文件
  50. const App = () => {
  51. const [value, setValue] = useState({ name: "aaa" });
  52.  
  53. return (
  54. <GlobalContext.Provider value={value}>
  55. <div className="App">
  56. <header className="App-header">
  57. <Memo loading={value.name} content='Memo content' />
  58. <Button type="primary" onClick={() => setValue(rand)}>Hehe</Button>
  59. <p>
  60. Provider: {value.name}
  61. </p>
  62.  
  63. <ChangeName title="changeName"></ChangeName>
  64.  
  65. <React.Suspense fallback="T2 loading...">
  66. <Hehe />
  67. </React.Suspense>
  68.  
  69. <Router>
  70. <Link to="/reg">
  71. <div>会员注册</div>
  72. </Link>
  73. <Link to="/t2">
  74. <div>跳转到异步组件t2</div>
  75. </Link>
  76.  
  77. <Route exact path='/' component={() => <React.Suspense fallback="T2 loading..."> <T2 /> </React.Suspense>} />
  78. <Route path='/t2' component={() => <React.Suspense fallback="T2 loading..."> <T2 /> </React.Suspense>} />
  79. <Route path='/reg' component={() => <React.Suspense fallback="Reg loading..."> <Reg /> </React.Suspense>} />
  80. {/* <Route path='/regsync' component={Reg1} /> 使用同步组件会让包变大 */}
  81.  
  82. </Router>
  83.  
  84. </header>
  85.  
  86. </div>
  87.  
  88. </GlobalContext.Provider>
  89. )
  90. }
  91.  
  92. export default App;

reg.js

  1. import React from "react";
  2. import axios from "axios";
  3. import { Form, Icon, Input, Button, Checkbox, Table } from 'antd';
  4.  
  5. const columns = [
  6. {
  7. title: '姓名',
  8. dataIndex: 'name',
  9. key: 'name',
  10. },
  11. {
  12. title: 'Email',
  13. dataIndex: 'email',
  14. key: 'email',
  15. },
  16. {
  17. title: 'Ip',
  18. dataIndex: 'ip',
  19. key: 'ip',
  20. },
  21. ];
  22.  
  23. //不要在使用class组件,使用函数式组件来,具体看T2.js
  24.  
  25. class NormalLoginForm extends React.Component {
  26. constructor(props){
  27. super(props)
  28. this.state = {
  29. dataSource:[]
  30. }
  31.  
  32. }
  33. handleSubmit = e => {
  34. e.preventDefault();
  35. //开始验证表单,如果原因 通过执行回调发送ajax
  36. this.props.form.validateFields((err, values) => {
  37. if (!err) {
  38. console.log('表单里的值: ', values);
  39. let request=values;
  40. request.test="test";
  41. //向后台发送
  42. axios.get("https://www.easy-mock.com/mock/5a3a2fc5ccd95b5cf43c5740/table_list",{
  43. params: request
  44. }).then(response=>{
  45. //后台返回的值:
  46. console.log(response.data);
  47. this.setState({dataSource:response.data.data})
  48. }).catch(e=>{
  49. //请求网络原因等失败了处理
  50. });
  51. }
  52. });
  53. };
  54.  
  55. render() {
  56. const { getFieldDecorator } = this.props.form;
  57. return (
  58. <div id="components-form-demo-normal-login">
  59. <Form onSubmit={this.handleSubmit} className="login-form">
  60. <Form.Item>
  61. {getFieldDecorator('username', {
  62. rules: [{ required: true, message: 'Please input your username!' }],
  63. })(
  64. <Input
  65. prefix={<Icon type="user" style={{ color: 'rgba(0,0,0,.25)' }} />}
  66. placeholder="Username"
  67. />,
  68. )}
  69. </Form.Item>
  70. <Form.Item>
  71. {getFieldDecorator('password', {
  72. rules: [{ required: true, message: 'Please input your Password!' }],
  73. })(
  74. <Input
  75. prefix={<Icon type="lock" style={{ color: 'rgba(0,0,0,.25)' }} />}
  76. type="password"
  77. placeholder="Password"
  78. />,
  79. )}
  80. </Form.Item>
  81. <Form.Item>
  82. {getFieldDecorator('remember', {
  83. valuePropName: 'checked',
  84. initialValue: true,
  85. })(<Checkbox>Remember me</Checkbox>)}
  86.  
  87. <Button type="primary" htmlType="submit" className="login-form-button">
  88. Log in
  89. </Button>
  90.  
  91. </Form.Item>
  92. </Form>
  93. <Table dataSource={this.state.dataSource} columns={columns} style={{background:'#fff'}} />
  94. </div>
  95. );
  96. }
  97. }
  98.  
  99. const Reg = Form.create({ name: 'normal_login' })(NormalLoginForm);
  100.  
  101. export default Reg;

T2.js

  1. import React, {useState, useEffect} from "react";
  2. import axios from "axios";
  3.  
  4. //组件 里可以使用state,这样就可以不在使用class
  5. const T2=(prop)=>{
  6. const [message, setMessage]=useState(()=>{
  7. return 'start...';
  8. });
  9.  
  10. function temp(){
  11. axios.get('http://route.showapi.com/1764-1').then(response=> {
  12. console.log(response.data.showapi_res_error);
  13. setMessage(response.data.showapi_res_error);
  14. })
  15. }
  16. useEffect( () => {
  17. temp()
  18. }, [message]);
  19.  
  20. // 给useEffect传第二个参数。用第二个参数来告诉react只有当这个参数的值发生改变时,才执行我们传的副作用函数(第一个参数)。
  21. return (
  22. <>
  23. <div>T2. message: {message}</div>
  24. </>
  25. )
  26. }
  27.  
  28. export default T2;
GlobalContext.js
  1. import React from 'react'
  2. const GlobalContext = React.createContext();
  3. 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. current_url 获取当前测试地址和page_souce获取当前网页源代码

    from selenium import webdriverdriver = webdriver.Firefox()driver.get("https://www.baidu.com&quo ...

  2. ugui拖拽

    整理了下以前写的 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityE ...

  3. 可持久化并查集 by zky

    zz:https://www.cnblogs.com/cjoierljl/p/9567859.html https://www.cnblogs.com/peng-ym/p/9357220.html n ...

  4. JPA-style positional param was not an integral ordinal 异常

    JPA-style positional param was not an integral ordinal 多是sql之间的空格问题,或者sql拼接问题. 字符串与字符串直接相加要加空格

  5. 2019CSP-S游记(?)

    认识我的人都知道,我懒得写算法和模拟赛的博客,但是游记就不一样了,它比较好玩. Day0 中午随便收拾了下就坐高铁出发了,一个小时左右就到南昌了,随后坐公交,再步行到宾馆安置(也没多远). 宾馆离学校 ...

  6. 【转】centos7安装

    转自:https://blog.csdn.net/qq_42570879/article/details/82853708 1.CentOS下载CentOS是免费版,推荐在官网上直接下载,网址:htt ...

  7. tensorflow白话篇

    接触机器学习也有相当长的时间了,对各种学习算法都有了一定的了解,一直都不愿意写博客(借口是没时间啊),最近准备学习深度学习框架tensorflow,决定还是应该把自己的学习一步一步的记下来,方便后期的 ...

  8. 转:mysql datetime类型精确到毫秒、微秒的问题

    原文地址:mysql datetime类型精确到毫秒.微秒的问题 mysql里面的datetime类型的精确度是可以到1/ 10 ^ 6 秒的某些客户端(如navicat for mysql)的显示经 ...

  9. 《剑指offer》面试题22 栈的压入、弹出序列 Java版

    (输入两个整数序列,第一个序列是一串数字的压入顺序,判断第二个序列是否是该栈数字的弹出顺序.) 我的方法:压入序列是给定的,每一次弹出操作形成一个弹出序列的值,我们从前往后遍历弹出序列,每一次访问弹出 ...

  10. Nginx工作机制

    Nginx分为单工作进程和多工作进程两种模式.通常采用1个master+多个worker进程配合异步非阻塞的工作机制.master进程主要负责管理自身和下属的worker进程,worker负责处理请求 ...