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是代码,然而我们首屏加载并不需要一次性加载所有的组件,这会造成性能的 ...
随机推荐
- python3编写网络爬虫17-验证码识别
一.验证码识别 1.图形验证码的识别 识别图形验证码需要 tesserocr 库 OCR技术识别(光学字符识别,是指通过扫描字符,然后通过其形状将其翻译成电子文本的过程.)例如 中国知网注册页面 ht ...
- 加一的golang实现
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储一个数字. 你可以假设除了整数 0 之外,这个整数不会以零开头. 输入: [,,] ...
- 【Linux常见问题】SecureCRT 终端连接密钥交换失败错误
SecureCRT 终端软件连接linux操作系统,出现如下错误: 英文描述:Key exchange failed. No compatible key exchange method. The s ...
- keepalived 安装篇-官方文档
官方安装文档 http://www.keepalived.org/doc/installing_keepalived.html Installing Keepalived Install keepal ...
- GoldenGate OGG-01032 There Is a Problem in Network Communication Error in Writing to Rmt Remote Trail Rmttrail (Doc ID 1446621.1)
GoldenGate OGG-01032 There Is a Problem in Network Communication Error in Writing to Rmt Remote Trai ...
- Spring配置文件中条件判断标签
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.Prop ...
- Redis 实现安全队列
Redis的列表数据结构可以让我们方便的实现消息队列 例如用 LPUSH(BLPUSH)把消息入队,用 RPOP(BRPOP)获取消息 绝大部分的情况下,这些操作都是没问题的,但并不能保证绝对安全 当 ...
- Java NIO1:浅谈I/O模型
一.什么是同步?什么是异步? 同步和异步的概念出来已经很久了,网上有关同步和异步的说法也有很多.以下是我个人的理解: 同步就是:如果有多个任务或者事件要发生,这些任务或者事件必须逐个地进行,一个事件或 ...
- BZOJ3601 一个人的数论 莫比乌斯反演、高斯消元/拉格朗日插值
传送门 题面图片真是大到离谱-- 题目要求的是 \(\begin{align*}\sum\limits_{i=1}^N i^d[gcd(i,n) == 1] &= \sum\limits_{i ...
- 2018年12月份GitHub上最热门的Java开源项目
来自:开源最前线(ID:OpenSourceTop) 链接:https://www.itcodemonkey.com/article/12747.html 又到了公布 GitHub 上热门项目的时候啦 ...