首页 web前端 js教程 通过一个用户管理实例学习react-router-dom

通过一个用户管理实例学习react-router-dom

Oct 12, 2017 am 09:34 AM
实例 用户 管理

我们通过一个用户管理实例来学习react-router-dom

这个实例包括9个小组件

App.js 引入组件

Home.js 首页组件

User.js 用户管理组件

  -  UserList.js 用户列表组件

  -  UserAdd.js 用户添加组件

  - UserDetail.js  用户详情组件

Profile.js 个人中心组件

Login.js  用户登录组件

Protected.js 处理登录的组件(我们模拟登录的)

我们先建立一个App组件,作为我们项目引入的组件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

import React, {Component} from 'react';//Router 容器,它是用来包裹路由规则的//Route 是路由规则//BrowserRouter基于h5的。兼容性不好//引入react-router-demoimport {HashRouter as Router, Route,Link,NavLink,Switch} from 'react-router-dom';//引入我们需要的组件import Home from "./Home";

import User from "./User";

import Profile from "./Profile";

import Login from "./Login";

import Protected from './Protected'//定义一个App组件export default class App extends Component {

    render() {        //定义一个我们选中的状态

        let activeStyle={color:&#39;red&#39;}        return (            <Router>

                <p className="container">

                    <nav className=&#39;nav navbar-default&#39;>

                        <p className="container-fluid">

                            <a className="navbar-brand">用户管理</a>

                        </p>

                        <ul className="nav">

                            <li className=&#39;navbar-nav&#39;><NavLink exact activeStyle={activeStyle} to="/">首页</NavLink></li>

                            <li className=&#39;navbar-nav&#39;><NavLink activeStyle={activeStyle} to="/user">用户管理</NavLink></li>

                            <li className=&#39;navbar-nav&#39;><NavLink activeStyle={activeStyle} to="/profile">个人中心</NavLink></li>

                        </ul>

                    </nav>

                    <p>

                        {/*Switch是匹配*/}

                        {/*exact 我们匹配/斜杠时候,就匹配第一个*/}                        <Switch>

                        <Route exact path="/" component={Home}/>

                        <Route path="/user" component={User}/>

                            <Protected path="/profile" component={Profile}/>

                            <Route path="/login" component={Login}/>

 

                        </Switch>

                    </p>

                </p>

            </Router>        )

    }

}

登录后复制

App组件使我们引入的组件,在这个组件里面,我们需要注意到最外层的Router

这个是路由容器,我们路由规则Route需要包裹在日期里面

Route包含了两个属性,path 和 component

path指向的路由路径,component指向的是要跳转的组件

我们路由导航,一般是Link和NavLink两个

这两个功能一样,都是路由跳转,但是NavLink有一个属性用来显示跳转选中的样式,activeStyle属性,写显示高亮样式的,接收一个对象{}

在我们路由导航有一个to属性

to属性是我们路由的要跳转的路径

下面是User.js 组件,主要包含两个路由NavLink和Route,和上面一个意思,切换两个组件NavLink和Route

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

import React, {Component} from &#39;react&#39;import {Link,Route,NavLink} from &#39;react-router-dom&#39;import UsersList from &#39;./UsersList&#39;import UsersAdd from &#39;./UsersAdd&#39;import UserDetail from "./UserDetail";

export default class User extends Component {

    render() {

        let activeStyle={color:&#39;red&#39;}        return (            <p className=&#39;row&#39;>

                <p className="col-sm-3">

                    <nav>

                        <ul className="nav nav-stacked">

                            <li><NavLink activeStyle={activeStyle} to="/user/list">用户列表</NavLink></li>

                            <li><NavLink activeStyle={activeStyle} to="/user/add">添加用户</NavLink></li>

                        </ul>

                    </nav>

                </p>

                <p className="col-sm-9">

                    <Route path="/user/list" component={UsersList}></Route>

                    <Route path="/user/add" component={UsersAdd}></Route>

                    <Route path="/user/detail/:id" component={UserDetail}></Route>

                </p>

            </p>        )

    }

}

登录后复制

- UserAdd.js 用户添加组件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

import React, {Component} from &#39;react&#39;export default class UsersAdd extends Component {

    handleSubmit=()=>{

        let username=this.refs.username.value;

        let password=this.refs.password.value;

        let user={username,password,id:Date.now()};

        let users=JSON.parse(localStorage.getItem(&#39;USERS&#39;)||"[]");

        users.push(user);

        localStorage.setItem(&#39;USERS&#39;,JSON.stringify(users));        this.props.history.push(&#39;/user/list&#39;)

    }

    render() {        /*

        * history 用来跳转页面

        * location.pathname 用来存放当前路径

        * match代表匹配的结果

        *

        * */

        return (            <form onSubmit={this.handleSubmit}>

                <p className="form-group">

                    <label htmlFor="username" className="control-label">

                        用户名                    </label>

                    <input type="text" className="form-control" ref="username" placeholder="用户名"/>

                </p>

                <p className="form-group">

                    <label htmlFor="username" className="control-label">

                        密码                    </label>

                    <input type="password" className="form-control" ref="password" placeholder="密码"/>

                </p>

                <p className="form-group">

 

                    <input type="submit" className="btn btn-danger" />

                </p>

            </form>        )

    }

}

登录后复制

我们将用户添进去的数据,在页面缓存,方便我们用户列表页渲染

1

<span style="font-size: 14pt;">localStorage.setItem(&#39;USERS&#39;,JSON.stringify(users));</span><br/><span style="font-size: 14pt;">缓存完成后跳转到列表详情页面userList</span><br/><span style="font-size: 14pt;">this.props.history.push(&#39;/user/list&#39;)</span>

登录后复制

- UserList.js 用户列表组件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

import React, {Component} from &#39;react&#39;import {Link} from &#39;react-router-dom&#39;export default class UsersList extends Component {

    constructor(){

        super();       

        this.state={users:[]}

    }

    componentWillMount(){

        let users = JSON.parse(localStorage.getItem(&#39;USERS&#39;) || "[]");       

        this.setState({users});

    }

    render(){       

    return (          

    <ul className="list-group">

               {                  

                       this.state.users.map((user,index)=>(                      

                       <li key={index} className="list-group-item">

                           <span>用户名:</span>

                           <Link to={`/user/detail/${user.id}`}>{user.username}</Link>

                          <span className="btn btn-danger" onClick={()=>{

                              let users=this.state.users.filter(item=>item.id!=user.id)                              this.setState({users});

                          }}>删除</span>

                       </li>                   ))

               }           </ul>        )

    }

}

登录后复制

componentWillMount()是组件挂载完成后的组件周期函数

在这个钩子函数里面,我们去userAdd存储的USERS数据,然后渲染到页面上去
{user.username}

这里面我们跳转到个人信息详情里面,把每个人的用户id带上

然后我们用户详情页面UserDetail.js 组件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

import React, {Component} from &#39;react&#39;export default class UserDetail extends Component {

    render() {        // let user=this.props.location.state.user

        let users = JSON.parse(localStorage.getItem(&#39;USERS&#39;)||"[]");

        let id = this.props.match.params.id;

        let user = users.find(item=>item.id == id);       

        return (           

        <table className="table table-bordered">

                <thead>

                <tr>

                    <th>ID</th>

                    <th>用户名</th>

                    <th>密码</th>

                </tr>

                </thead>

                <tbody>

                    <tr>

                    <td>{user.id}</td>

                    <td>{user.username}</td>

                    <td>{user.password}</td>

                    </tr>

                </tbody>

            </table>        )

    }

}

登录后复制

let id = this.props.match.params.id;

let user = users.find(item=>item.id == id);

通过match里面获取到路由带过来的id

然后判断users里面id相同的那一项

然后渲染到页面上去

,然后我们判断登录,如果没有登录,就去登录,登录后才能看用户管理

1

2

3

4

5

6

import React from &#39;react&#39;;

import {Route, Redirect} from &#39;react-router-dom&#39;;//函数组件//把属性对象中的Component属性取出来赋给comp,把其它属性取出来赋给other对象//再把other对象的全部属性取出来赋给Route// component=组件// render函数 当路由匹配的时候,渲染的是render方法的返回值export default function ({component: _comp, ...rest}) {    return <Route {...rest} render={

        props => localStorage.getItem(&#39;login&#39;) ? <_comp/> :

            <Redirect to={{pathname: &#39;/login&#39;, state: {from: props.location.pathname}}}/>

    }/>    return null;

}

登录后复制

如果没有登录,我们就进入登录组件,其实我们模拟登录就是设置了一个缓存login为true,模拟权限,真实项目中,我们通过后台接口来限制,路由跳转

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

import React, {Component} from &#39;react&#39;;

export default class Login extends Component {

    handleClick = ()=>{

        localStorage.setItem(&#39;login&#39;,&#39;true&#39;);

        console.log(this.props);       

        this.props.history.push(this.props.location.state.from);

    }

    render() {       

    return (           

    <p>

                   <button

                    onClick={this.handleClick}

                    className="btn btn-primary">登录               

                    </button>

            </p>       

            )

    }

}

登录后复制

 后面,我们首页Hone和Profile两个组件,基本就是展示个人信息的,就是渲染,所以我就没有必要写了!

总体完成,路由嵌套路由,然后通过路由参数分辨路由不同的信息

以上是通过一个用户管理实例学习react-router-dom的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1670
14
CakePHP 教程
1428
52
Laravel 教程
1329
25
PHP教程
1274
29
C# 教程
1256
24
如何用小红书号查找用户?能查到手机号吗? 如何用小红书号查找用户?能查到手机号吗? Mar 22, 2024 am 08:40 AM

随着社交媒体的迅速发展,小红书已经成为了备受青睐的社交平台之一。用户可以通过创建小红书号来展示个人身份,并与其他用户交流互动。如果你需要查找某个用户的小红书号码,可以按照以下简单步骤进行操作。一、如何用小红书号查找用户?1.打开小红书APP,点击右下角的“发现”按钮,然后选择“笔记”选项。2.在笔记列表中,找到你想查找的用户发布的那篇笔记。点击进入笔记详情页。3.在笔记详情页中,点击用户头像下方的“关注”按钮,即可进入该用户的个人主页。4.在用户个人主页右上角,点击三个点按钮,然后选择“个人信息

以超级用户身份登录Ubuntu 以超级用户身份登录Ubuntu Mar 20, 2024 am 10:55 AM

在Ubuntu系统中,root用户通常是禁用状态的。要激活root用户,可以使用passwd命令设置密码,然后使用su-命令以root身份登录。根用户是具有系统管理权限且不受限制的用户。他拥有访问和修改文件、用户管理、软件安装和删除,以及系统配置更改等权限。根用户与普通用户有着明显的区别,根用户拥有系统中最高的权限和更广泛的控制权。根用户可以执行重要的系统命令和编辑系统文件,而普通用户则无法做到这一点。在本指南中,我将探讨Ubuntu根用户,如何以根用户身份登录,以及它与普通用户的不同之处。注意

教程:Ubuntu系统如何删除普通用户账户? 教程:Ubuntu系统如何删除普通用户账户? Jan 02, 2024 pm 12:34 PM

Ubuntu系统添加了很多用户,想在不用的用户想要删除,该怎么删除呢?下面我们就来看看详细的教程。1、打开终端命令行,运用userdel命令删除指定的用户,注意要加sudo权限指令,如下图所示2、在删除的时候一定注意是在管理员目录下的,普通的用户是没有这个权限的,如下图所示3、删除指令执行完了以后怎么判断是否真正删除了呢?下面我们运用cat命令打开passwd文件,如下图所示4、我们看到passwd文件中已经没有了所删除的用户信息了,这证明用户已经被删除了,如下图所示5、然后我们进入home文件

什么是 sudo,为什么它如此重要? 什么是 sudo,为什么它如此重要? Feb 21, 2024 pm 07:01 PM

sudo(超级用户执行)是Linux和Unix系统中的一个关键命令,允许普通用户以root权限运行特定命令。sudo的功能主要体现在以下几个方面:提供权限控制:sudo通过授权用户以临时方式获取超级用户权限,从而实现了对系统资源和敏感操作的严格控制。普通用户只能在需要时通过sudo获得临时的特权,而不需要一直以超级用户身份登录。提升安全性:通过使用sudo,可以避免在常规操作中使用root账户。使用root账户进行所有操作可能会导致意外的系统损坏,因为任何错误或不小心的操作都将具有完全的权限。而

Oracle数据库:一个用户是否可以拥有多个表空间? Oracle数据库:一个用户是否可以拥有多个表空间? Mar 03, 2024 am 09:24 AM

Oracle数据库是一种常用的关系型数据库管理系统,许多用户都会遇到关于表空间的使用问题。在Oracle数据库中,一个用户可以拥有多个表空间,这样可以更好地管理数据存储和组织。本文将探讨一个用户如何在Oracle数据库中拥有多个表空间,并提供具体的代码示例。在Oracle数据库中,表空间是用来存储表、索引、视图等对象的逻辑结构。每个数据库都至少有一个表空间,

Linux系统中的用户密码存储机制解析 Linux系统中的用户密码存储机制解析 Mar 20, 2024 pm 04:27 PM

Linux系统中的用户密码存储机制解析在Linux系统中,用户密码的存储是非常重要的安全机制之一。本文将解析Linux系统中用户密码的存储机制,包括密码的加密存储、密码的验证过程以及如何安全地管理用户密码。同时,将通过具体的代码示例展示密码存储的实际操作过程。一、密码的加密存储在Linux系统中,用户密码并不是以明文的形式存储在系统中,而是经过加密后保存。L

win10右键菜单管理打不开怎么办 win10右键菜单管理打不开怎么办 Jan 04, 2024 pm 07:07 PM

我们在使用win10系统的时候,使用鼠标去右键桌面或者右键菜单的时候,发现菜单等都打不开,无法正常的去使用电脑了,这时候就需要恢复系统来解决问题。win10右键菜单管理打不开:1、首先打开我们的控制面板,然后点击。2、然后点击安全和维护下的。3、再点击右侧的来恢复系统即可。4、如果还是无法使用,是看是否是鼠标本身出了问题。5、如果确定鼠标没有问题的话,按下+,输入。6、执行完毕后,重启电脑即可。

Oracle用户登录不上,原因与解决方案 Oracle用户登录不上,原因与解决方案 Mar 02, 2024 pm 03:45 PM

标题:Oracle用户登录问题分析与解决方案在Oracle数据库管理中,用户登录是一个基础且重要的操作。然而,有时候用户可能会遇到无法登录的问题,这可能是由于多种原因导致的。本文将分析Oracle用户登录失败的常见原因,并提供相应的解决方案,同时附带具体的代码示例。一、Oracle用户登录失败的常见原因分析用户名或密码错误:用户输入的用户名或密码有可能是错误

See all articles