我们通过一个用户管理实例来学习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-demo
import {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>
<div className="container">
<nav className='nav navbar-default'>
<div className="container-fluid">
<a className="navbar-brand">用户管理</a>
</div>
<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>
<div>
{/*Switch是匹配*/}
{/*exact 我们匹配/斜杠时候,就匹配第一个*/}
<Switch>
<Route exact path="/" component={Home}/>
<Route path="/user" component={User}/>
<Protected path="/profile" component={Profile}/>
<Route path="/login" component={Login}/> </Switch>
</div>
</div>
</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 (
<div className='row'>
<div 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>
</div>
<div 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>
</div>
</div>
)
}
}

-  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}>
<div className="form-group">
<label htmlFor="username" className="control-label">
用户名
</label>
<input type="text" className="form-control" ref="username" placeholder="用户名"/>
</div>
<div className="form-group">
<label htmlFor="username" className="control-label">
密码
</label>
<input type="password" className="form-control" ref="password" placeholder="密码"/>
</div>
<div className="form-group"> <input type="submit" className="btn btn-danger" />
</div>
</form>
)
}
}

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

localStorage.setItem('USERS',JSON.stringify(users));
缓存完成后跳转到列表详情页面userList
this.props.history.push('/user/list')

-  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数据,然后渲染到页面上去
<Link to={`/user/detail/${user.id}`}>{user.username}</Link>

这里面我们跳转到个人信息详情里面,把每个人的用户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 (
<div>
<button
onClick={this.handleClick}
className="btn btn-primary">登录
</button>
</div>
)
}
}

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

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


												

通过一个用户管理实例学习路由react-router-dom知识的更多相关文章

  1. 一个用户管理的ci框架的小demo--转载

    一个ci框架的小demo 最近在学习ci框架,作为一个初学者,在啃完一遍官方文档并也跟着官方文档的例程(新闻发布系统)做了一遍,决定在将之前练习PHP与MySQL数据库的用户管理系统再用ci框架实现一 ...

  2. 使用Jquery+EasyUI进行框架项目开发案例解说之中的一个---员工管理源代码分享

    使用Jquery+EasyUI 进行框架项目开发案例解说之中的一个 员工管理源代码分享 在開始解说之前,我们先来看一下什么是Jquery EasyUI?jQuery EasyUI是一组基于jQuery ...

  3. 在线用户管理--ESFramework 4.0 进阶(05)

    无论我们采用何种通信框架来构建我们的分布式系统,在服务端进行用户管理都是非常重要的一个环节.然而用户管理是否应该隶属于通信框架了?这个并不一定,通常来说,用户管理是与具体应用紧密相关的,应该是由应用解 ...

  4. react router @4 和 vue路由 详解(七)react路由守卫

    完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 12.react路由守卫? a.在之前的版本中,React Router 也提供了类似的 ...

  5. react router @4 和 vue路由 详解(全)

    react router @4 和 vue路由 本文大纲: 1.vue路由基础和使用 2.react-router @4用法 3.什么是包容性路由?什么是排他性路由? 4.react路由有两个重要的属 ...

  6. 从 React Router 谈谈路由的那些事

    React Router 是专为 React 设计的路由解决方案,在使用 React 来开发 SPA (单页应用)项目时,都会需要路由功能,而 React Router 应该是目前使用率最高的. Re ...

  7. react router 4.0以上的路由应用

    thead>tr>th{padding:8px;line-height:1.4285714;border-top:1px solid #ddd}.table>thead>tr& ...

  8. React Router 4.0 ---- 嵌套路由和动态路由

    嵌套路由,从广义上来说,分为两种情况:一种是每个路由到的组件都有共有的内容,这时把共有的内容抽离成一个组件,变化的内容也是一个组件,两种组件组合嵌套,形成一个新的组件.另一种是子路由,路由到的组件内部 ...

  9. React Router 4.0 实现路由守卫

    在使用 Vue 或者 Angular 的时候,框架提供了路由守卫功能,用来在进入某个路有前进行一些校验工作,如果校验失败,就跳转到 404 或者登陆页面,比如 Vue 中的 beforeEnter 函 ...

随机推荐

  1. 【C#】枚举

    枚举 public static class CommonEnums { public enum people { /// <summary> ///男人 /// </summary ...

  2. wp跳转到评价界面代码

    wp跳转到评价界面代码(仅适用于wp8.0) MarketplaceReviewTask marketplaceReviewTask = new MarketplaceReviewTask(); ma ...

  3. 1. UI Tests简介

    (1) User Interface Testing UI Testing库主要提供了与App中的UI元素进行查找和交互的能力,这使得我们可以通过验证UI元素的状态来测试App是否正常运行.     ...

  4. placeholder字体样式及兼容

    样式修改css::-webkit-input-placeholder { /* WebKit browsers */ color: #fff!important;}:-moz-placeholder ...

  5. 用vue做一个酷炫的menu

    写在前面 最近看到一个非常酷炫的menu插件,一直想把它鼓捣成vue形式,谁让我是vue的死灰粉呢,如果这都不算爱

  6. iOS 利用UIWebView与JavaScript交互的最简单办法

    这里说的是针对iOS的!并且方法很简单!!并且验证可行的!!! 1, UIWebView调用 JavaScript 的函数: NSString* strValue = [webView stringB ...

  7. idea 下maven 导入本地jar,以及导入之后 java不能引用问题

    1.在当前的项目中新建立一个lib文件夹,将需要导入的jar放入其中. 2.配置pom.xml 文件 <!--导入本地jar--> <dependency> <group ...

  8. Struts2 前端与后台之间传值问题

    老是被前端与后台之间的传值给弄糊涂了,特此写一篇blog进行总结. 一. 前端向后台传值 (1)属性驱动 属性驱动是指在Action类里,包含表单里对应的字段(字段名称一样),同时设置对应的gette ...

  9. loadrunner11报错:Error -27780

    LR回放https协议脚本失败:[GENERAL_MSG_CAT_SSL_ERROR]connect to host "XXX" failed:[10054] Connection ...

  10. saltstack 源码安装

    面向对象编程(oop) 面向对象: 面向对象三大特性: 封装 继承 多肽封装: 封装就是将具体的客观事物封装成抽象的类.并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可行的进行信息隐藏继承 ...