写react中时总会跟vue对比,vue中有keep-alive做缓存页面,也有相应的api激活(activated)和停用(deactivated)。
react中我们用react-router-dom做路由时怎么缓存页面呢?
我想的是在Route中一个exact属性,当exact为false时下
< Route path="/login" component={A} />
< Route exact path="/login/:id" component={B} />
如果进入B页面时A页面也会显示,只要我页面在B页面时隐藏A页面,在返回A页面时在显示就可以了
重点就在componentWillReceiveProps函数中进行显示隐藏
import * as React from ‘react’;
import{ Route } from ‘react-router-dom’;
interface RoutesProps {
component:any,
path:any,
[random:string]:any
}
interface RoutesState {
[random: string]: any;
}
export default class Routes extends React.PureComponent<RoutesProps,RoutesState>{
constructor(props:any) {
super(props);
this.state={
isShow:true
}
}
componentWillReceiveProps(){
if(this.props.path == window.location.pathname){//对比路由
let myClass = this.props.component.WrappedComponent
let fun = new myClass(React)//获取模块
fun && fun.returnQuery && fun.returnQuery()//激活模块中查询函数(returnQuery可以自己命名)
this.setState({isShow:true})
}else{
this.setState({isShow:false})
}
}
render(){
return < div style={{display:this.state.isShow?‘block’:‘none’}}>
< Route {…this.props} />
</ div>
}
}
你的模块有使用react-redux可以直接使用复制使用,
没有的话就在componentWillReceiveProps中就去除WrappedComponent
componentWillReceiveProps(){
if(this.props.path == window.location.pathname){//对比路由
let myClass = this.props.component
let fun = new myClass(React)//获取模块
fun && fun.returnQuery && fun.returnQuery()//激活模块中查询函数(returnQuery可以自己命名)
this.setState({isShow:true})
}else{
this.setState({isShow:false})
}
}
这样就可以了