10分钟学会React Context API

摘要:
Err){console.log('表单中的值:',Values);letrequest=Values;request.test

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》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android Studio Gradle:Resolvedependencies':app:_debugCompile' 问题解决纪录IBinder对象在进程间传递的形式(一)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

react 脚手架cra的注意事项,以及脚手架生成目录的分析,以及四个脚本命令

安装阶段 1.新建文件夹test 2.不需要在tset里npm init 3.全局安装脚手架 npm install -g create-react-app 4.create-react-app XXX,这里的名字,不能使react,或者react-dom等等,如果是这些关键词,他会提示错误。 create-react-app demo01 //用脚...

linux环境下 C++性能测试工具 gprof + kprof + gprof2dot

1.gprof 很有名了,google下很多教程 g++ -pg -g  -o test test.cc ./test   //会生成gmon.out gprof ./test > prof.log 看一下对于我前面提到的huffman编码压缩+解码解压缩全部过程的一个程序 对于生成的prof.log ,wow, 很有用处的但是看起来有点累,不是吗:)...

React配合Webpack实现代码分割与异步加载

这是Webpack+React系列配置过程记录的第四篇。其他内容请参考: 第一篇:使用webpack、babel、react、antdesign配置单页面应用开发环境 第二篇:使用react-router实现单页面应用路由 第三篇:优化单页面开发环境:webpack与react的运行时打包与热更新 第四篇:React配合Webpack实现代码分割与异步加...

京东阅读(web)体验优化

京东有电子书可以购买,可以多端阅读。比如PC客户端,移动端,以及本文提到的PC网站端。 先换个镜头,读书要记笔记(电子版本), 方便以后查阅。 镜头换回来,但是,我们为了方便肯定是想复制,下载啊,分享啊等,但是服务商一般是不允许你这么做的。 我了,在京东买了几本书,程序相关的,为了获取好的体验,在PC网站端阅读, 发现精彩之处,想去复制到笔记里面去。 结果...

Chromium base 基础库概览

Chromium 基础库概览 Chromium 基础库包括的内容十分繁杂,我把其中的主要部分大致分为以下几类: 1. 容器类型Chromium 的代码主要使用 STL 容器类型,比如 std::vector,std::list,另外 GCC 和 MSVC 提供的 STL 扩展容器类型 hash_map 和 hash_set 也在 Chromium 中使用...

react项目中引用amap

在调用amap的Geocoder Api 时,一直不能从AMap对象下找到Geocoder 。 结果在网上看到一个博客说的是,在index中引入链接时,需要在链接上配置plugin=AMap.Geocoder, 才能够在AMap调用Geocoder Api <script type="text/javascript" src="https://web...