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是代码,然而我们首屏加载并不需要一次性加载所有的组件,这会造成性能的 ...
随机推荐
- 贪心 C - Polycarp's New Job
Polycarp has recently got himself a new job. He now earns so much that his old wallet can't even sto ...
- chrome postman插件手动安装
注:转自 http://blog.csdn.net/u010246789/article/details/51481134 1.下载postman插件,可以自己到网上下载,也可以点击http://do ...
- 为什么swift是面向协议的编程--对面向对象机制的改进
主要目标是提供抽象能力和解决值类型的多态问题 Actually, Abrahams says, those are all attributes of types, and classes are j ...
- 利用os.system 截取终端日志输出 存为txt
# -*- coding: utf- -*- import os os.system(r"python %s/add_test.py > terminal_record.txt&quo ...
- [TJOI2018]碱基序列
嘟嘟嘟 现在看到字符串就想到SAM,所以很担心kmp啥的会不会忘了-- 这题感觉挺暴力的:首先当然要把\(s\)建成SAM,然后令\(dp[i][j]\)表示到第\(i\)组时,SAM上节点\(j\) ...
- Linux 平台下 RMAN 全备 和 增量备份 shell 脚本
转:http://blog.csdn.net/tianlesoftware/article/details/5740630 全备脚本 以 nocatalog 模式为例: Shell 脚本: ##### ...
- 通过 PHP,可以把文件上传到服务器。
创建一个文件上传表单 允许用户从表单上传文件是非常有用的. 请看下面这个供上传文件的 HTML 表单: <html> <body> <form action=" ...
- Linux:Day6(上) egrep、条件测试
egrep及扩展的正则表达式: egrep = grep -E 扩展正则表达式的元字符: 或者:a | b 练习: 1.显示当前系统root.centos或user1用户的默认shell和UID: 2 ...
- 【vue】使用el-table时,实现批量选中效果
简单demo ①页面: <template> <el-table ref="multipleTable" :data="tableData3" ...
- 接口测试,获取登录后的cookies
参见: http://www.cnblogs.com/testwang/p/6023394.html