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. 【C编程基础】make命令和makefile文件

    1.关于程序的编译和链接 一般来说,无论是C.C++首先要把源文件编译成中间目标文件即 Object File(windows为.obj文件,unix为.o文件),这个动作叫做编译(compile). ...

  2. Kafka consumer group位移0ffset重设

    本文阐述如何使用Kafka自带的kafka-consumer-groups.sh脚本随意设置消费者组(consumer group)的位移.需要特别强调的是, 这是0.11.0.0版本提供的新功能且只 ...

  3. 冒泡排序 最好O(n)平均O(n^2) 选择排序O(n2) 插入排序O(n2)

    LOWB 三人组 分清有序区跟无序区 冒泡排序 思路: 首先,列表每两个相邻的数,如果前边的比后边的大,那么交换和两个数.... 冒泡排序优化 如果一趟没有发生任何交换 那么证明列表已经是有序的了 i ...

  4. ElasticSearch(三):Java操作ElasticSearch索引之CRUD

    package com.gxy.ESChap01; import java.net.InetAddress; import java.util.HashMap; import java.util.Ma ...

  5. 查看linux内存使用情况

    查看内存使用情况 free -m total used free shared buffers cached Mem: -/+ buffers/cache: Swap: used=total-free ...

  6. (1)ESP8266微信门铃

    http://rayuu.com/2017/11/13/esp8266-wechat-doorbell/(留做参考) 就是当门铃按键按下,微信会收到消息提醒. 若在家就算了,没在家会受到远程提示. 自 ...

  7. ssm框架整合+Ajax异步验证

    SSM框架是目前企业比较常用的框架之一,它的灵活性.安全性相对于SSH有一定的优势.说到这,谈谈SSM和SSH的不同点,这也是企业常考初级程序员的面试题之一.说到这两套框架的不同,主要是持久层框架Hi ...

  8. Luogu2398 GCD SUM

    Luogu2398 GCD SUM 求 \(\displaystyle\sum_{i=1}^n\sum_{j=1}^n\gcd(i,j)\) \(n\leq10^5\) 数论 先常规化式子(大雾 \[ ...

  9. 初学Python—列表和元组

    一.什么是列表 列表是一系列数据的集合 二.列表的引用 首先定义一个列表 names=["alex","bob","alice"," ...

  10. Wireshark抓包分析TCP 3次握手、4次挥手过程

    Wireshark简介 更多有关Wireshark的教程.软件下载等,请见:http://www.52im.net/thread-259-1-1.html,本文只作简要介绍. 1Wireshark 是 ...