React第五篇 综合应用(登录+列表)

2,368 阅读3分钟

React 学习笔记

完整代码戳git

第一部分,腾讯课堂react入门课程
课程地址
React第一篇 npm、yarn介绍
React第二篇 React语法
React第三篇 单页应用开发
React第四篇 路由&Hooks
React第五篇 综合应用(登录+列表)

第二部分,Redux课程
课程地址
React第六篇 Redux
React第七篇 React Redux


在src下新建pages/demo文件夹存放综合应用案例代码

1.编写首页

export default function DemoApp() {

    return <div  className="container">
        <h1>欢迎来到React的世界</h1>
        {/*Link的使用*/}
        {/*如果是HashRouter  浏览器地址栏输入http://localhost:3000/#/login#/即可跳转到登录页 */}
        <Link to="/demologin">跳转登录</Link>
        <br/>
        <Link to="/demohome">跳转主页</Link>
        <br/>
    </div>
}

src下路由router.js下添加如下代码

<Route path = "/demo" component={DemoApp}/>
<Route path = "/demologin" component={DemoLogin}/>
<Route path = "/demohome" component={DemoHome}/>

demo.scss

.container{
  padding-top: 20px;
  font-size: 28px;
  text-align:center;
  a{
    font-size: 26px;
  }
}

.ant-form.login-form{
  width: 300px;
  margin: 40px auto 0;
  button{
    width: 100%;
  }
}

2.编写登录页面

模拟网络请求

  • 安装axios:yarn add axios --save
import React ,{useState}from 'react'
import {Form,Input,Button} from "antd";
import {useHistory} from "react-router-dom";
import './demo.scss'
import axios from 'axios'

/**
 * @Description:
 * @author dongshuhuan
 * @date 2020-05-16
 */
const FormItem = Form.Item;
export default function DemoLogin() {

    const [name,setName] = useState('');
    const [pwd,setPwd] = useState('');
    const history = useHistory();

    return <Form className={"login-form"}>
        <FormItem>
            <Input placeholder={"请输入用户名"} maxLength={5} onChange={(event)=>{
                setName(event.target.value)
            }}/>
        </FormItem>
        <FormItem>
            <Input placeholder={"请输入密码"} maxLength={5} type="password" onChange={(event)=>{
                setPwd(event.target.value)
            }}/>
        </FormItem>
        <label>用户名:{name}    密码:{pwd}</label>
        <FormItem>
            <Button type={"primary"} onClick={()=>{
                login(name,pwd).then((response)=>{
                    let res = response.data;
                    if (res.code===0){
                        history.push('/demohome')
                    }
                })
            }}>登录</Button>
        </FormItem>


    </Form>
}

function login(name,pwd) {
    return axios.get('login.json',{
        params:{
            name,pwd
        }
    })
}

3.编写首页列表

home.scss

.home{
  height: calc(100vh);
  background: #10aeb5;
  h1{
    color: #ffffff;
    text-align: center;
    padding-top: 40px;
  }
  .wrap{
    padding: 20px 20px 50px;
    width: 800px;
    border-radius: 10px;
    background: white;
    margin: 0 auto;
    .nav{
      border-bottom: 1px solid lightgray;
      margin-bottom: 30px;
      line-height: 50px;
      a{
        display: inline-block;
        width: 25%;
        text-align: center;
        color: black;
        font-size: 18px;
        //a 标签和class在同一级用&
        &.checked{
          color:lightseagreen ;
          font-weight: bold;
        }
      }
    }
    p{
      color: lightgray;
    }
    .nav-link{
      display: inline-block;
      margin-top: 30px;
    }
  }
}

home.js

import React,{useEffect,useState} from 'react'
import { Table } from 'antd';
import {Link} from 'react-router-dom'
import './home.scss'
import axios from 'axios'

/**
 * @Description:
 * @author dongshuhuan
 * @date 2020-05-16
 */
export default function DemoHome() {
    const [data,setData] = useState([]);
    const [index,setIndex] = useState(0);
    const columns = [
        {
            title:'地区',
            dataIndex:'area'
        },{
            title:'Java',
            dataIndex:'java'
        },{
            title:'Php',
            dataIndex:'php'
        },{
            title:'Node',
            dataIndex:'node'
        },{
            title:'JS',
            dataIndex:'js'
        },{
            title:'Python',
            dataIndex:'python'
        }
    ];

    useEffect(()=>{
        axios.get("/data.json").then((response)=>{
            const res = response.data;
            if (res.code===0){
                setData(res.data)
            }
        })
    },[])

    return <div className={"home"}>
        <h1>语言大数据报告</h1>
            <div className={"wrap"}>
            <p>数据纯属虚构</p>
            <div className={"nav"}>
                <a className={index==0 ?"checked":""} onClick={()=>setIndex(0)}>语言动态</a>
                <a className={index==1 ?"checked":""} onClick={()=>setIndex(1)}>语言地图</a>
                <a className={index==2 ?"checked":""} onClick={()=>setIndex(2)}>语言热搜</a>
                <a className={index==3 ?"checked":""} onClick={()=>setIndex(3)}>语言播报</a>
            </div>
            <Table bordered
                   pagination={false}
                   columns={columns}
                   dataSource={data} />
            <Link to={'/demo'} className="nav-link">回到首页</Link>

        </div>

    </div>
}

//class 有状态组件实现页面交互功能
// export default class DemoHome extends React.Component{
//
//     //初始化表格 数据源
//     state={
//         data:[],
//         index:0,
//         columns : [{
//             title:'地区',
//             dataIndex:'area'
//         },{
//             title:'Java',
//             dataIndex:'java'
//         },{
//             title:'Php',
//             dataIndex:'php'
//         },{
//             title:'Node',
//             dataIndex:'node'
//         },{
//             title:'JS',
//             dataIndex:'js'
//         },{
//             title:'Python',
//             dataIndex:'python'
//         }],
//
//     }
//
//     componentDidMount() {
//         axios.get("/data.json").then((response)=>{
//             const res = response.data;
//             if (res.code===0){
//                 this.setState({
//                     data:res.data
//                 })
//             }
//         })
//     }
//
//     handleSwitch =(index)=>{
//         this.setState({
//             index
//         })
//     }
//
//     render() {
//         const {index,columns,data} = this.state;
//         return <div className={"home"}>
//             <h1>语言大数据报告</h1>
//             <div className={"wrap"}>
//                 <p>数据纯属虚构</p>
//                 <div className={"nav"}>
//                     <a className={index==0 ?"checked":""} onClick={()=>this.handleSwitch(0)}>语言动态</a>
//                     <a className={index==1 ?"checked":""} onClick={()=>this.handleSwitch(1)}>语言地图</a>
//                     <a className={index==2 ?"checked":""} onClick={()=>this.handleSwitch(2)}>语言热搜</a>
//                     <a className={index==3 ?"checked":""} onClick={()=>this.handleSwitch(3)}>语言播报</a>
//                 </div>
//                 <Table bordered
//                        pagination={false}
//                        columns={columns}
//                        dataSource={data} />
//                 <Link to={'/demo'} className="nav-link">回到首页</Link>
//
//             </div>
//
//         </div>
//     }
//
// }

4.网页效果

登录

列表