资讯专栏INFORMATION COLUMN

React路由深入实战用户登录

williamwen1986 / 804人阅读

摘要:本篇基于路由来实战用户登录功能,会涉及到表单的数据绑定表单提交和登录判断等新玩意。

本篇基于React路由来实战用户登录功能,会涉及到表单的数据绑定、表单提交和登录判断等新玩意。

续上篇:React的路由深入

先来创建一个组件 - 登录表单组件

// file:src/components/UserLogin.js

"use strict";

import React from "react";

export default class UserLogin extends React.Component {
    construct(props) {
        super(props);
        this.state = {
            username: "",
            password: ""
        };
    }
    
    render() {
        return 

用户登录

用户名:
密码:
} }

绑定表单元素到state,并且绑定点击事件到按钮

// file:src/components/UserLogin.js

"use strict";

import React from "react";

export default class UserLogin extends React.Component {
    construct(props) {
        super(props);
        this.state = {
            username: "",
            password: ""
        };
    }
    
    setUserInfo(event, key) {
        // input表单元素会自动绑定一个event对象对事件函数
        // event对象target属性等于input DOM元素对象,所以event.target.value 可以获取到当前input的value值
        let obj = {};
        obj[key] = event.target.value;
        // 更新状态
        this.setState(obj);
    }
    
    render() {
        return 

用户登录

用户名: { this.setUserInfo(event, "username"); }}>
密码: { this.setUserInfo(event, "password"); }}>
} }

input表单元素会自动绑定一个event对象对事件函数

event对象target属性等于input DOM元素对象,所以event.target.value 可以获取到当前inputvalue

定义一个用户登录操作类

本篇不涉及后台接口,暂时用固定用户名和密码模拟登录

// file:src/core/Passport.js

"use strict";

export default class Passport {
    constructor() {
        // 用户登录标识
        this.isLogin = false;
    }
    
    login(username, password, callback) {
        if (username === "mi360" && password === "123") {
            // 登录成功
            this.isLogin = true;
            // 将登录成功之后的操作给调用者处理
            callback();
        } else {
            // 登录失败
            // 这里简单弹出一个消息
            alert("登录失败!");
        }
    }
}

在登录表单中调用登录操作类

// file:src/components/UserLogin.js

"use strict";

import React from "react";

// 导入登录操作类
import Passport from "../core/Passport";

export default class UserLogin extends React.Component {
    construct(props) {
        super(props);
        this.state = {
            username: "",
            password: ""
        };
    }
    
    setUserInfo(event, key) {
        // input表单元素会自动绑定一个event对象对事件函数
        // event对象target属性等于input DOM元素对象,所以event.target.value 可以获取到当前input的value值
        let obj = {};
        obj[key] = event.target.value;
        // 更新状态
        this.setState(obj);
    }
    
    render() {
        return 

用户登录

用户名: { this.setUserInfo(event, "username"); }}>
密码: { this.setUserInfo(event, "password"); }}>
} }

在我们的路由组件中加上登录组件的路由

// file:src/components/MyRouter.js

"use strict";

import React from "react";
import News from "../components/News";
import Shop from "../components/Shop";
import Detail from "../components/Detail";

// 用户登录组件
import Login from "../components/UserLogin";

import {
    HashRouter as Router,
    Route,
    Redirect,
    Link
} from "react-router-dom";

export default class MyRouter extends React.Component {

    render() {
        return 
            
  • 首页
  • 商品
  • 新闻
  • 用户登录

} }

访问页面,预览效果:

输入中正确的用户名和密码会跳到新闻页面!

添加登录判断

给新闻页面加上登录判断,如果没有登录,自动跳转到登录页面

import React from "react";
import News from "../components/News";
import Shop from "../components/Shop";
import Detail from "../components/Detail";
import Login from "../components/UserLogin";

import {
    HashRouter as Router,
    Route,
    Redirect,
    Link
} from "react-router-dom";

// 导入用户登录操作类,并实例化
import Passport from "../core/Passport";
let passport = new Passport();

export default class MyRouter extends React.Component {

    render() {
        return 
            
  • 首页
  • 商品
  • 新闻
  • 用户登录

// 使用render属性定义处理函数路由跳转判断 { if (passport.islogin) { return } else { return } }} /> // 将用户操作类实例传递给用户登录组件 { return }} />
} }

修改用户登录组件使用路由传递过来的用户登录操作类

"use strict";

import React from "react";
import Passport from "../core/Passport";

export default class UserLogin extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            username: "",
            password: ""
        }
    }

    setUserInfo(event, key) {
        let obj = {};
        obj[key] = event.target.value;
        this.setState(obj);
    }

    render() {
        return 

用户登录

用户名: { this.setUserInfo(event, "username"); }} />
密码: { this.setUserInfo(event, "password") }} />
} }

再次预览访问效果,并且测试新闻未登录下是否能够访问,登录后能否访问!

原文链接:https://www.mi360.cn/articles...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/105864.html

相关文章

  • React实战篇(React仿今日头条)

    摘要:前言上次初学用写了个后台管理,这次便寻思写个移动端的项目。便有了这次的这个项目。然后通过来判断如何动画具体处理异步用来书写跟配置还有一些零零散散的知识点,就不介绍了,具体可以到上查看。个人博客在线观看地址 前言 上次初学用 react 写了个后台管理,这次便寻思写个移动端的项目。便有了这次的这个项目。 这个项目以前写了个 vue 的版本。有兴趣的可以 点击进入 模拟数据用的是 Eas...

    NicolasHe 评论0 收藏0
  • angular4实战(2) router

    摘要:在上一章节,通过新建项目之后,会自动引入路由模块,接下来需要做的事情就是对路由模块进行配置。为了方便维护,单独把路由模块的配置拿出来,再去输出到中。路由守卫业务需求是在没有登录的情况下,是不允许跳入到下一个页面的。 router 单页面应用通过路由来去渲染不同的视图,为用户在同一个页面看到不同的场景,提供基础服务。 在上一章节,通过新建项目之后,ngModule会自动引入路由模块,接下...

    wanglu1209 评论0 收藏0
  • React+ Redux + React-route + Axios 实战,很适合进阶

    摘要:前言前段时间学习完了的基础自己网上找了一些实战项目做了几个感觉项目不是很全面就想做一个完整的项目来提升自己的水平以前学习的时候就看过大神的项目所以自己打算用重写它后端数据还是用实在没有精力撸后端感谢大神该项目是饿了么目前开发了登录注册购 前言 前段时间学习完了React的基础,自己网上找了一些实战项目,做了几个感觉项目不是很全面,就想做一个完整的项目来提升自己的React水平.以前学习...

    phpmatt 评论0 收藏0
  • 基于 Webpack 4 多入口生成模板用于服务端渲染的方案及实战

    摘要:原作者原链接基于多入口生成模板用于服务端渲染的方案及实战法律声明警告本作品遵循署名非商业性使用禁止演绎未本地化版本协议发布。这是什么背景现代化的前端项目中很多都使用了客户端渲染的单页面应用。 原作者:@LinuxerPHL原链接:基于 Webpack 4 多入口生成模板用于服务端渲染的方案及实战 法律声明 警告:本作品遵循 署名-非商业性使用-禁止演绎3.0 未本地化版本(CC BY-...

    big_cat 评论0 收藏0
  • 基于 Webpack 4 多入口生成模板用于服务端渲染的方案及实战

    摘要:原作者原博文地址基于多入口生成模板用于服务端渲染的方案及实战法律声明警告本作品遵循署名非商业性使用禁止演绎未本地化版本协议发布。这是什么背景现代化的前端项目中很多都使用了客户端渲染的单页面应用。 原作者:@LinuxerPHL原博文地址: 基于 Webpack 4 多入口生成模板用于服务端渲染的方案及实战 法律声明 警告:本作品遵循 署名-非商业性使用-禁止演绎3.0 未本地化版本(...

    Lavender 评论0 收藏0

发表评论

0条评论

williamwen1986

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<