withRouter使用
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使用的更多相关文章
- [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 ...
- react 路由导航栏 withRouter
codesandbox https://codesandbox.io/s/9l6prnyxjy app.js import React, { Component, Fragment } from &q ...
- React-异步组件及withRouter路由方法的使用
所有组件的代码都打包在bundle.js里,加载首页的时候,把其它页面的代码也加载了,影响首页加载速度.我们希望访问首页的时候只加载首页,访问详情页的时候再去加载详情页的代码.异步组件可以帮我们实现, ...
- react中withRouter解决props返回为空
利用 react + antd 框架书写导航栏时,遇到了几个坑,分别是一级菜单和二级菜单在点击的情况下,高亮没有任何问题,但是再点击浏览器返回按钮时,却就乱套了. 1. 二级菜单中,我们可以通过 pr ...
- React-Router ---withRouter
import React from 'react' import { withRouter } from 'react-router' const Hello = (props) => { re ...
- react: typescript integrate withRouter
define interface: export interface INav { nav: string } export interface IModuleItem { state?: strin ...
- 浅谈connect,withRouter,history,useState,useEffect
1.connect in umi connect 可以链接不同的组件,从而在这个组件中使用其他组件的参数,常用于获取redux中存取的值. 2.withRouter in umi withRouter ...
- React-Router示例(重定向与withRouter)
1.withRouter作用:把不是通过路由切换过来的组件中,将react-router 的 history.location.match 三个对象传入props对象上 默认情况下必须是经过路由匹 ...
- react中异步组件以及withRouter的使用
什么是异步组件?简单来说就是异步加载一个组件,正常情况浏览器加载的是我们打包好的bundle.js文件,那么这个文件是集合了所有js是代码,然而我们首屏加载并不需要一次性加载所有的组件,这会造成性能的 ...
随机推荐
- 【递推】ZSC1072: 数学、不容易系列之二—— LELE的RPG难题
思路如下: f(n) = 1, ... , n-2 , n-1, n 前n-2个已涂好后,涂第n-1个即有2种情况: n-1的色与n-2和1的色都不相同,那么n就是剩下的那个色,没有选择. 即就是f( ...
- Nginx使用教程(八):使用Nginx缓存之Memcached缓存
使用Memcache <br\>Memcache是一个通用的内存缓存系统. 它通常用于加速缓慢的数据访问. NGINXmemcached模块提供各种指令,可以配置为直接访问Memcache ...
- js证书批量生成与打包下载
前边有提到最近的一个证书生成保存下载打印的需求. 之前实现的是一个单个操作的页面,现在把实现的批量效果和进度效果的代码展示出来. html <button class="btn btn ...
- spring boot 的maven设置阿里云仓库
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> ...
- 《程序员的自我修养》读书笔记——系统调用、API
系统调用 程序运行的时候,本身是没有权限访问多少系统资源的.系统资源有限,如果操作系统不进行控制,那么各个程序难免会产生冲突.线程操作系统都将可能产生冲突的系统资源保护起来,阻止程序直接访问. ...
- SQLite中的WAL机制详细介绍-与回滚日志原理
一.什么是WAL? WAL的全称是Write Ahead Logging,它是很多数据库中用于实现原子事务的一种机制,SQLite在3.7.0版本引入了该特性. 二.WAL如何工作? 在引入WAL机制 ...
- LDAP概念和原理
LDAP概念和原理介绍 相信对于许多的朋友来说,可能听说过LDAP,但是实际中对LDAP的了解和具体的原理可能还比较模糊,今天就从“什么是LDAP”.“LDAP的主要产品”.“LDAP的基本模型”.“ ...
- Python:Day51 web框架
from wsgiref.simple_server import make_server def application(environ, start_response): start_respon ...
- memcache讲解和在.net中初使用
memcache讲解和在.net中初使用 2017年10月17日 22:51:36 等待临界 阅读数:503 前言 传统数据库面临的问题 数据库死锁 磁盘IO 正文 了解memcache 原理 基 ...
- mysql之grant权限说明
mysql中给一个用户授权如select,insert,update,delete等其中的一个或者多个权限,主要使用grant命令,格式为: 给没有用户授权 grant 权限 on 数据库对象 to ...