(默认最新6.3, 如需使用5.x, 在模块名后加@5)
npm install react-router-dom --save // 6.0
或
npm install react-router-dom@5 --save // 5.0
(注: 哈希模式用 HashRouter ,历史模式用 BrowserRouter)
import { HashRouter } from 'react-router-dom'
ReactDOM.render(
);
import { Switch, Route } from "react-router-dom"; // 5.0
或
import { Routes, Route } from "react-router-dom"; // 6.0
export default function MyRouter(){ // 5.0
return(
)
}
或
export default function MyRouter(){ // 6.0
return(
} />
)
}
import RouterView from './router/index';
import {Link} from 'react-router-dom'
首页/Link>
注意: 使用router6.0实现的路由跳转, 不会向组件中传入路由信息
路由控制跳转的组件中(一般是views目录下的页面组件),props会自动添加以下三个字段(根组件和components中的组件没有路由信息)
history:注意用于路由跳转和路由监听
location:主要显示路由信息,可用于路由传值
match:主要用于路由传值,也可展示路由信息
跳转个人中心
url路径拼接传值
接收:
{decodeURI(this.props.location.search)}
动态路由(友好url)传值
接收:
{this.props.match.params.name}
自定义对象传值
接收:
{this.props.location.data && this.props.location.data.name}
若有需求:点击图片跳转到个人中心页,并传入新闻标题
1,路由跳转不传值时,直接使用this.props.history.push(“/user”)
2,路由跳转并传值,方法如下:
this.props.history.push('/user?title='+title)
目标组件(用户页)通过 decodeURI(props.location.search) 接收:
路由url拼接传值: {decodeURI(props.location.search)}
this.props.history.push('/user/'+title)
添加个人页的动态路由用于传值:
目标组件通过 props.match.params 接收
动态路由传值: {props.match.params.title}
this.props.history.push({
pathname: "/user",
data: { title }
})
目标组件通过 props.location 接收
自定义对象传值: {props.location.data && props.location.data.title}
为防止报错可以加条件判断,使用 && 判断或使用 三目运算
这里使用&&判断,前面有值就显示&&后面的值,前面的没值就显示空
(1) url路径传值
(2) 动态路由传值
(3) 自定义对象传值
总结:建议使用 动态路由传值
var cancel = props.history.listen((route, type)=>{
console.log("User路由监听", route.pathname, type);
})
在用户页局部监听路由,props.history.listen() 函数添加路由监听,类似事件监听的addEvevtLististener,可以重复监听
导致的结果就是,每次跳转到这一页都会添加新的监听,路由跳转的过程中,监听函数会越来越多,造成性能浪费甚至bug
解决方案:
(1) 在页面卸载时取消监听
// 模拟10秒后,组件销毁并取消监听
setTimeout(()=>{
cancel()
}, 10000)
(2) 在全局根组件App.js中监听路由
import { withRouter } from 'react-router-dom';
export default withRouter(App);
componentDidMount() {
console.log(this.props)
this.props.history.listen(path=>{
console.log("全局路由监听" + path.pathname)
})
}