import React from 'react';
import {Switch,NavLink,Route,Redirect,withRouter} from 'react-router-dom';
import Detail from './Detail';
import Login from './Login'
import User from './User';
import MyRoute from './MyRoute'
class Header extends React.Component{
constructor(props){
super(props);
}
render(){
return(
<div>
<NavLink to='/login'>我是登录页</NavLink>
<br/>
<NavLink to="/detail/1">我是分页一</NavLink>
<br/>
<NavLink to="/user">我是用户页</NavLink>
<br/>
<Switch>
<Redirect from='/' to="/login" exact />
<Route path='/login' component={Login}/>
            //权限路由 使用
<Route path='/detail/:id?' render={
(props)=>{
return sessionStorage.getItem('user')?
<Route component={Detail} {...props}/>:<Redirect to='/login'/>
}
}/>
            //权限路由使用
<Route path='/user' render={
(props)=>{
return sessionStorage.getItem('user')?
<Route component={User} {...props}/>:<Redirect to='/login'/>
}
}/>
</Switch>
</div>
)
}
} export default withRouter(Header);

这样使用很麻烦,所以封装组件进行复用

import React from 'react';
import {Route,Redirect} from 'react-router-dom'; class MyRoute extends React.Component{
constructor(props){
super(props);
}
render() {
console.log(this.props)
  //利用组件传值的特性封装成组件利用组件进行封装
let {path,component:Com} = this.props;
return (
<Route path={path} render={
(props)=>{
return sessionStorage.getItem('user') ?
<Com {...props}/> :<Redirect to="/login" />
}
}/>
)
}
} export default MyRoute;

login.js

import React from 'react';

class Detail extends React.Component{
constructor(props){
super(props);
this.login = this.login.bind(this);
console.log(this.props);
};
login(){
let username = this.node.value;
if(username==='admin'){
sessionStorage.setItem('user','admin');
}
this.props.history.push('/user')
      //编程式导航类似vue 在使用withRouter以后
};
render(){
return (
<div>
            //简易的写法
<input type="text" ref={node=>this.node=node}/>
<button onClick={this.login}>登录</button>
</div>
)
}
} export default Detail;

user.js

import React from 'react';

class User extends React.Component{
quit(){
sessionStorage.clear();
      //清除session并导航到登录页面
this.props.history.push('/login');
}
render() {
console.log(this.props);
return (
<div>
<input type="button" value="退出" onClick={this.quit.bind(this)}/>
</div>
)
} }; export default User;

这是简化demo以后的代码

import React from 'react';
import {Switch,NavLink,Route,Redirect,withRouter} from 'react-router-dom';
import Detail from './Detail';
import Login from './Login'
import User from './User';
import MyRoute from './MyRoute'
class Header extends React.Component{
constructor(props){
super(props);
}
render(){
return(
<div>
<NavLink to='/login'>我是登录页</NavLink>
<br/>
<NavLink to="/detail/1">我是分页一</NavLink>
<br/>
<NavLink to="/user">我是用户页</NavLink>
<br/>
<Switch>
<Redirect from='/' to="/login" exact />
<Route path='/login' component={Login}/>
            //使用了封装的组件 该组件利用组件传值的特性
<MyRoute path='/detail/:id?' component={Detail} />
<MyRoute path='/user' component={User}/>
</Switch>
</div>
)
}
} export default withRouter(Header);

withRouter使用的更多相关文章

  1. [Redux] Using withRouter() to Inject the Params into Connected Components

    We will learn how to use withRouter() to inject params provided by React Router into connected compo ...

  2. react 路由导航栏 withRouter

    codesandbox https://codesandbox.io/s/9l6prnyxjy app.js import React, { Component, Fragment } from &q ...

  3. React-异步组件及withRouter路由方法的使用

    所有组件的代码都打包在bundle.js里,加载首页的时候,把其它页面的代码也加载了,影响首页加载速度.我们希望访问首页的时候只加载首页,访问详情页的时候再去加载详情页的代码.异步组件可以帮我们实现, ...

  4. react中withRouter解决props返回为空

    利用 react + antd 框架书写导航栏时,遇到了几个坑,分别是一级菜单和二级菜单在点击的情况下,高亮没有任何问题,但是再点击浏览器返回按钮时,却就乱套了. 1. 二级菜单中,我们可以通过 pr ...

  5. React-Router ---withRouter

    import React from 'react' import { withRouter } from 'react-router' const Hello = (props) => { re ...

  6. react: typescript integrate withRouter

    define interface: export interface INav { nav: string } export interface IModuleItem { state?: strin ...

  7. 浅谈connect,withRouter,history,useState,useEffect

    1.connect in umi connect 可以链接不同的组件,从而在这个组件中使用其他组件的参数,常用于获取redux中存取的值. 2.withRouter in umi withRouter ...

  8. React-Router示例(重定向与withRouter)

    1.withRouter作用:把不是通过路由切换过来的组件中,将react-router 的 history.location.match 三个对象传入props对象上   默认情况下必须是经过路由匹 ...

  9. react中异步组件以及withRouter的使用

    什么是异步组件?简单来说就是异步加载一个组件,正常情况浏览器加载的是我们打包好的bundle.js文件,那么这个文件是集合了所有js是代码,然而我们首屏加载并不需要一次性加载所有的组件,这会造成性能的 ...

随机推荐

  1. CISCO 动态路由(RIP)

    RIP(路由信息协议):是一种内部网关协议(IGP),是一种动态路由选择协议,基于距离矢量算法(DistanceVectorAlgorithms),使用“跳数”(即metric)来衡量到达目标地址的路 ...

  2. IOC的底层实现

  3. mysql 数据备份与数据导入到出

    一.数据备份 #1. 物理备份: 直接复制数据库文件,适用于大型数据库环境.但不能恢复到异构系统中如Windows. #2. 逻辑备份: 备份的是建表.建库.插入等操作所执行SQL语句,适用于中小型数 ...

  4. Java面试知识点之线程篇(三)

    前言:这里继续对java线程相关知识点进行总结,不能间断. 1.yield()方法 yield()的作用是让步.它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执 ...

  5. Java锁的种类以及辨析(二):自旋锁的其他种类

    作者:山鸡 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) .这些已经写好提供的锁为我们开发提供了便利,但是锁的具 ...

  6. Python 特殊函数解析(lambda 函数,map 函数,filter 函数,reduce 函数)

    写在之前 今天给大家介绍几个比较特殊的函数,他们具有函数式编程的特点,有人将它们视为 Python 可进行 「函数式编程」 的见证,至于什么是函数式编程,不是本篇文章的重点,感兴趣的可以去了解一下.老 ...

  7. linux普通用户提权操作

    [root@test1 ~]# vim /etc/sudoers ## Allow root to run any commands anywhere root ALL=(ALL) ALLzhouyu ...

  8. 【转】vmware的macos中apple ID一直登陆不上解决 ---(伪造smbios设备信息)

    伪造smbios设备信息 原文网址:http://www.insanelymac.com/forum/topic/292170-how-to-spoof-real-mac-in-vmware/page ...

  9. 【转】实践HTTP206状态:部分内容和范围请求

    原文:http://www.cyberciti.biz/cloud-computing/http-status-code-206-commad-line-test/ HTTP 2xx范围内的状态码表明 ...

  10. WiFi-ESP8266入门http(1)-建立服务器,直接发送网

    #include <ESP8266WiFi.h> /*** 该工程可以在2.4.0版本esp8266库中运行,没在更高版本库中进行测试 ***/ const char *ssid = &q ...