通过一个用户管理实例学习react-router-dom
我们通过一个用户管理实例来学习react-router-dom
这个实例包括9个小组件
App.js 引入组件
Home.js 首页组件
User.js 用户管理组件
- UserList.js 用户列表组件
- UserAdd.js 用户添加组件
- UserDetail.js 用户详情组件
Profile.js 个人中心组件
Login.js 用户登录组件
Protected.js 处理登录的组件(我们模拟登录的)
我们先建立一个App组件,作为我们项目引入的组件
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:'red'} return ( <Router> <p className="container"> <nav className='nav navbar-default'> <p className="container-fluid"> <a className="navbar-brand">用户管理</a> </p> <ul className="nav"> <li className='navbar-nav'><NavLink exact activeStyle={activeStyle} to="/">首页</NavLink></li> <li className='navbar-nav'><NavLink activeStyle={activeStyle} to="/user">用户管理</NavLink></li> <li className='navbar-nav'><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
import React, {Component} from 'react'import {Link,Route,NavLink} from 'react-router-dom'import UsersList from './UsersList'import UsersAdd from './UsersAdd'import UserDetail from "./UserDetail"; export default class User extends Component { render() { let activeStyle={color:'red'} return ( <p className='row'> <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 用户添加组件
import React, {Component} from 'react'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('USERS')||"[]"); users.push(user); localStorage.setItem('USERS',JSON.stringify(users)); this.props.history.push('/user/list') } 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> ) } }
我们将用户添进去的数据,在页面缓存,方便我们用户列表页渲染
<span style="font-size: 14pt;">localStorage.setItem('USERS',JSON.stringify(users));</span><br/><span style="font-size: 14pt;">缓存完成后跳转到列表详情页面userList</span><br/><span style="font-size: 14pt;">this.props.history.push('/user/list')</span>
- UserList.js 用户列表组件
import React, {Component} from 'react'import {Link} from 'react-router-dom'export default class UsersList extends Component { constructor(){ super(); this.state={users:[]} } componentWillMount(){ let users = JSON.parse(localStorage.getItem('USERS') || "[]"); 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 组件
import React, {Component} from 'react'export default class UserDetail extends Component { render() { // let user=this.props.location.state.user let users = JSON.parse(localStorage.getItem('USERS')||"[]"); 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相同的那一项
然后渲染到页面上去
,然后我们判断登录,如果没有登录,就去登录,登录后才能看用户管理
import React from 'react'; import {Route, Redirect} from 'react-router-dom';//函数组件//把属性对象中的Component属性取出来赋给comp,把其它属性取出来赋给other对象//再把other对象的全部属性取出来赋给Route// component=组件// render函数 当路由匹配的时候,渲染的是render方法的返回值export default function ({component: _comp, ...rest}) { return <Route {...rest} render={ props => localStorage.getItem('login') ? <_comp/> : <Redirect to={{pathname: '/login', state: {from: props.location.pathname}}}/> }/> return null; }
如果没有登录,我们就进入登录组件,其实我们模拟登录就是设置了一个缓存login为true,模拟权限,真实项目中,我们通过后台接口来限制,路由跳转
import React, {Component} from 'react'; export default class Login extends Component { handleClick = ()=>{ localStorage.setItem('login','true'); 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中文网其他相关文章!

热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

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

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

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

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

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

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

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

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

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

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