React利用路由实现登录界面的跳转

2023-10-28

React利用路由实现登录界面的跳转
上一篇在配置好了webpack和react的环境后,接下来开始写登录界面,以及接下来的跳转到主页的功能。
**1、首先看一下总体的目录结构。**因为很多时候在看别人写的例子的时候因为目录结构不熟悉后边会出现意想不到的岔子。

总体的目录结构
2、大体流程:
1)webpack配置入口文件src/index.js
2)运行index.html后首先加载入口文件src/index.js
3)加载路由表src/router/index.js
4)根据路由表中的配置会首先加载登录界面src/login.js
5)当在登录界面登录成功后跳转到src/components/myView.js
6)在myView文件中点击左侧菜单会分别显示指定页面(都是在路由表中配置)
3、写HTML文件。
其中,1)id为myContent处是为了放置我们写的组件。
2)script中加载的文件时webpack打包后的js文件。

<body>
    <div id="myContent"></div>
    <script src="./dist/bundle.js"></script>
</body>

4、登录界面写在了login.js中。
1)引入必要的模块:antd(Ant Design )是一个组件库,我们项目中使用的组件都来自它。(https://ant.design/index-cn)(不引入antd.css时,那么界面显示不出来样式)

import React from 'react'
import {Form,Input,Icon, Button} from 'antd'
// import {render} from 'react-dom'
// import axios from 'axios'

import '../node_modules/antd/dist/antd.css'//不引入这个文件那么不显示antd的样式
import './style/login.css';

2)创建登录表单组件。除了基本的Form、Input、Button组件外,实现跳转功能的主要是history.push(’/View’);(其中,history = this.props.history;)push函数中的路径是路由表中配置的路径( ),二者要对应起来。

class LoginFrom extends React.Component{
    constructor(){
        super()
    }

    handleSubmit = (e) => {
        //提交之前判断输入的字段是否有错误
        e.preventDefault();
        
        **let history = this.props.history;**
        this.props.form.validateFields((errors,values)=>{
            if (!errors) {
                console.log('Received values of form: ', values);
                **history.push('/View');**
              }
        })
    }

    render(){
        //Form.create 包装的组件会自带this.props.form属性,该属性提供了一系列API,包括以下4个
        //getFieldDecorator用于和表单进行双向绑定
        //isFieldTouched判断一个输入控件是否经历过 getFieldDecorator 的值收集时机 options.trigger(收集子节点的值的时机,默认时onChange)
        //getFieldError获取某个输入控件的 Error
        //获取一组输入控件的 Error ,如不传入参数,则获取全部组件的 Error
        const { getFieldDecorator, getFieldsError, getFieldError, isFieldTouched } = this.props.form;
        const userNameError = isFieldTouched('userName') && getFieldError('userName');
        const passWordError = isFieldTouched('password') && getFieldError('password');
        return (
            <div className="login">
                <div className="login-form">
                    <div className="login-logo">
                        <div className="login-name">MSPA</div>
                    </div>
                    <Form onSubmit={this.handleSubmit}>
                        {/* 一个FromItem中放一个被 getFieldDecorator 装饰过的 child */}
                        <Form.Item
                            validateStatus={userNameError ? 'error' : ''}//validateStatus为校验状态,如不设置,则会根据校验规则自动生成,可选:'success' 'warning' 'error' 'validating'
                        >
                        {
                            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
                            validateStatus={passWordError ? "error" : ''}
                        >
                        {
                            getFieldDecorator('passWord',{
                                rules:[{required:true,message:"Please input your Password!"}]
                            })(
                                <Input prefix={<Icon type="lock" style={{ color: 'rgba(0,0,0,.25)' }}/>}
                                        placeholder="Password"
                                />
                            )
                        }
                        </Form.Item>
                        <Form.Item>
                            <Button
                                type="primary"
                                htmlType="submit"
                                disabled={hasErrors(getFieldsError)}
                            >登录
                            </Button>
                        </Form.Item>
                    </Form>
                </div>
            </div>
        )
    }
}
let LoginForm = Form.create()(LoginFrom);
export default LoginForm;

3、在第二步中我们已经把静态页面写出来了,接下来就是配置路由表**了。**我们将路由信息都配置在了router文件夹下的index.js中。react-router中文文档(https://react-guide.github.io/react-router-cn/),其中history的简单介绍可以参考(https://segmentfault.com/a/1190000010251949),比较容易快速理解。

代码如下:前三行中引入的模块是基本的模块,后边import的模块是写好的组件:首页显示login界面,登录成功后跳转到myView界面,myPicture和myDocument是在myView界面点击后所显示的组件。(嵌套路由)

import React from 'react'
import {HashRouter as Router , Route , Switch} from 'react-router-dom'
import { createBrowserHistory } from "history";

import MyView from '../components/myView.js'
import LoginModule from '../login.js'
import MyPicture from '../components/myPicture'
import MyDocument from '../components/myDocument.js'

export default class MyRoute extends React.Component{
    render(){
        return(
            <Router history={createBrowserHistory()}>
                <Switch>
                    <Route exact path="/" component={LoginModule}/>
                     <MyView path='/View' component={MyDocument}>
                        <Route path="/View/abc" component={MyDocument} />
                        <Route path="/View/myPicture" component={MyPicture} /> 
                    </MyView>   
                </Switch>
            </Router>
        )
    }  
}

4、接下来我们在src文件夹下的index.js(程序的入口文件)文件中写如下代码。

import MyRoute from './router/index.js'
import {render} from 'react-dom'
import React from 'react'
render(
    <MyRoute />, 
    document.getElementById('myContent')
);

5、程序测试结果如下:
1)登录界面(login.js):

2)输入用户名和密码点击登录后的跳转界面(myView.js):
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React利用路由实现登录界面的跳转 的相关文章

随机推荐

  • Windows平台Java开发环境的搭建

    下载安装JDK 首先到oracle的jdk下载页面 下载jdk jdk建议使用最新的jdk8 根据系统版本选择32位或者64位的 下载完成之后点击安装 安装位置随意 但是必须记住 一会配置环境变量的时候会用到 配置环境变量 安装完成之后就可
  • ubuntu 16.04 安装ssh失败,原因竟然是自带的openssh-client版本造成的

    ubuntu 16 04默认安装上了最新的openssh client 可以连接其他计算机上的ssh服务 而没有安装openssh server服务端 允许其他计算机通过ssh访问和操作计算机 如 xshell等工具 openssh ser
  • 题海战 C++ STL set应用

    目录 题目描述 思路分析 代码 题目描述 某信息学奥赛教练经验丰富 他的内部题库有 m 道题 他有 n 个学生 第 i 个学生已经做过p i 道题 由于马上要进行noip考试 该教练准备举行 k 场比赛和训练 每场比赛或训练都会有一些他的学
  • STM32堆和栈及变量的存储理解

    STM32堆和栈及变量的存储理解 转至 https blog csdn net shaynerain article details 71952754 关于堆和栈已经是程序员的一个月经话题 大部分有是基于os层来聊的 那么 在赤裸裸的单片机
  • 学习太极创客 — MQTT 第二章(九)本章测试

    程序代码如下 项目名称 Project 零基础入门学用物联网 程序名称 Program name complete connect 团队 Team 太极创客团队 Taichi Maker www taichi maker com 作者 Au
  • 硬件比软件难,那为什么硬件工程师待遇还不如软件?

    大家好 我是张巧龙 今天看知乎 有一个很有意思的问题 硬件明明比软件更难 国内的硬件技术也不如软件 为什么硬件工程师待遇还不如软件 在这里分享几个回答 有一定的参考价值 欢迎留言讨论 01 回答1 作者 Tinker 链接 https ww
  • FFmpeg调用avformat_open_input时返回错误 -22(Invalid argument)

    一 FFmpeg报错误 22 Invalid argument 这个错误确实浪费了我一晚上 为啥呢 因为我打开rtsp的地址是能播放的 但是换成http xxx HD live mp4 auth key xxx这种带鉴权的地址后 就报非法参
  • minikube 部署的 k8s 集群准备 kubeconfig 文件

    CSDN 中文章不一定能及时更新 欢迎点击前往我的博客查看最新版本 许盛的博客 题外话 最近大出血 换了 m1pro 黑苹果就暂时没啥用了 本来准备装个 ubuntu 用来部署 kubesphere 玩玩的 不过在尝试了 ubuntu 官方
  • margin重叠问题、 解决办法

    margin重叠问题 两个块级元素的上外边距和下外边距可能会合并 折叠 为一个外边距 其大小会取其中外边距值大的那个 这种行为就是外边距折叠 重叠只会出现在垂直方向 解决办法 兄弟之间重叠
  • 联邦学习-区块链论文笔记:Blockchained On-Device Federated Learning

    链接 IEEE Xplore Full Text PDF ieeexplore ieee org stamp stamp jsp tp arnumber 8733825 作者 Hyesung Kim 延世大学团队 一点感悟 区块链和联邦学习
  • 2021年暑假康复性训练(Codeforces Round #731 (Div. 3))全题解

    2021暑假康复性训练 Codeforces Round 731 Div 3 A Shortest Path with Obstacle B Alphabetical Strings C Pair Programming D Co grow
  • libboost_system.so.xxx: cannot open shared object file: No such file or directory

    遇见这个错误说明没找到libboost system so xxx文件 1 查看 usr local lib下是否有这个库文件 有的话说明已经安装了libboost system 没有说明没有安装 2 若没有安装就下载个安装包 安装好 再测
  • C语言的员工管理系统

    include
  • Mac操作系统下 命令行 cp命令的坑

    Mac系统下的命令与Linux系统下的命令大部分是一样的 但是有一些事不同的用法 有的时候找个命令在Linux下好使 在Mac下就不好使 下面来研究下cp命令在Mac系统下的坑 Mac MacBook Pro mac mkdir aa Ma
  • Your build is currently configured to use Java 17.0.6 and Gradle 5.6.4.

    报错信息 Unsupported Java Your build is currently configured to use Java 17 0 6 and Gradle 5 6 4 Possible solution Upgrade G
  • C++ abort() has been called错误

    程序可以成功编译 说明没有语法问题 应是代码内部的问题 报错如下 abort has been called 中止被调用 该错误出现有很多原因 查询了多条博客后 发现一卒2018博主已经在博客上总结了几条原因和解决办法 谢谢博主 借博主的思
  • JAVA容器学习-集合

    Java集合是我认为在Java基础中最最重要的知识点了 Java集合是必须掌握的 我在实习 秋招面试的时候 只要是面到Java 那一定是少不了Java集合 作为一个新人 最关心的其实有一点 这个技术在工作中是怎么用的 换个说法 工作中常用到
  • 如何在BIOS中开启虚拟化技术

    虚拟化技术目前主要依赖于您电脑的CPU型号及BIOS 某些CPU或者BIOS暂时还不能支持虚拟化技术 支持虚拟化技术的可以在BIOS中开启 开启方法如下 1 进入BIOS 开机时按F2或F12或DEL或ESC等键 各电脑有所不同 2 进入B
  • jmeter安装和压力测试

    一 安装 1 1 下载安装包 1 2 解压到指定目录 1 3 配置环境变量 JMETER HOME D java apache jmeter 5 1 1 CLASSPATH JMETER HOME lib ext ApacheJMeter
  • React利用路由实现登录界面的跳转

    React利用路由实现登录界面的跳转 上一篇在配置好了webpack和react的环境后 接下来开始写登录界面 以及接下来的跳转到主页的功能 1 首先看一下总体的目录结构 因为很多时候在看别人写的例子的时候因为目录结构不熟悉后边会出现意想不