在React中使用react-router-dom路由

简介: 使用React构建的单页面应用,要想实现页面间的跳转,首先想到的就是使用路由。在React中,常用的有两个包可以实现这个需求,那就是react-router和react-router-dom。本文主要针对react-router-dom进行说明。

安装

首先进入项目目录,使用npm安装react-router-dom:

npminstallreact-router-dom--save-dev// 也可以使用cnpm代替npm命令

基本操作

我们新建两个页面,分别命名为“home”和“detail”。在页面中编写如下代码

home.js:

importReactfrom'react';
exportdefaultclassHomeextendsReact.Component {
render() {
return (
<div><a>去detail</a></div>        )
    }
}

detail.js:

importReactfrom'react';
exportdefaultclassHomeextendsReact.Component {
render() {
return (
<div><a>回到home</a></div>        )
    }
}

再新建一个路由组件,命名为“Router.js”,并编写如下代码:

importReactfrom'react';
import {HashRouter, Route, Switch} from'react-router-dom';
importHomefrom'../home';
importDetailfrom'../detail';
constBasicRoute= () => (
<HashRouter><Switch><Routeexactpath="/"component={Home}/><Routeexactpath="/detail"component={Detail}/></Switch></HashRouter>);
exportdefaultBasicRoute;

如上代码定义了一个纯路由组件,将两个页面组件Home和Detail使用Route组件包裹,外面套用Switch作路由匹配,当路由组件检测到地址栏与Route的path匹配时,就会自动加载响应的页面。


在入口文件中——这里指定的是index.js——编写如下代码:

importReactfrom'react';
importReactDOMfrom'react-dom';
importRouterfrom'./router/router';
ReactDOM.render(
<Router/>,
document.getElementById('root')
);

相当于向页面返回了一个路由组件。先运行项目看一下效果,在地址栏输入“http://localhost:3000/#/”:

image.png

输入“http://localhost:3000/#/detail”:

image.png


通过a标签跳转

可以看到其实路由已经开始工作了,接下来再来做页面间的跳转。在home.js和detail.js中,代码修改如下

home.js:

importReactfrom'react';
exportdefaultclassHomeextendsReact.Component {
render() {
return (
<div><ahref='#/detail'>去detail</a></div>    )
  }
}

detail.js:

importReactfrom'react';
exportdefaultclassHomeextendsReact.Component {
render() {
return (
<div><ahref='#/'>回到home</a></div>        )
    }
}

重新编译打包运行,在浏览器地址栏输入“http://localhost:3000/”。以上是使用a标签的href进行页面间跳转,此外react-router-dom还提供了通过函数的方式跳转页面。


通过函数跳转

首先需要修改router.js中的两处代码:

...import {HashRouter, Route, Switch, hashHistory} from'react-router-dom';
...<HashRouterhistory={hashHistory}>...

在home.js中:

importReactfrom'react';


exportdefaultclassHomeextendsReact.Component {
constructor(props) {
super(props);
    }
render() {
return (
<div><ahref='#/detail'>去detail</a><buttononClick={() =>this.props.history.push('detail')}>通过函数跳转</button></div>        )
    }
}

在a标签下面添加一个按钮并加上onClick事件,通过this.props.history.push这个函数跳转到detail页面。在路由组件中加入的代码就是将history这个对象注册到组件的props中去,就可以在子组件中通过props调用history的push方法跳转页面。

很多场景下,我们还需要在页面跳转的同时传递参数,在react-router-dom中,同样提供了两种方式进行传参。

url传参

在router.js中,修改如下代码:

...<Routeexactpath="/detail/:id"component={Detail}/>...

然后修改detail.js,使用this.props.match.params获取url传过来的参数:

...componentDidMount() {
console.log(this.props.match.params);
}
...

在地址栏输入“http://localhost:3000/#/detail/3”,打开控制台:

image.png

可以看到传过去的id=3已经被获取到了。react-router-dom就是通过“/:”去匹配url传递的参数。


隐式传参

此外还可以通过push函数隐式传参。修改home.js代码如下:

importReactfrom'react';
exportdefaultclassHomeextendsReact.Component {
constructor(props) {
super(props);
    }
render() {
return (
<div><ahref='#/detail/3'>去detail</a><buttononClick={() =>this.props.history.push({
pathname: '/detail',
state: {
id: 3                        }
                })}>通过函数跳转</button></div>        )
    }
}

在detail.js中,就可以使用this.props.history.location.state获取home传过来的参数:

componentDidMount() {
//console.log(this.props.match.params);console.log(this.props.history.location.state);
}

跳转后打开控制台可以看到参数被打印:

image.png


其他函数

replace

有些场景下,重复使用push或a标签跳转会产生死循环,为了避免这种情况出现,react-router-dom提供了replace。在可能会出现死循环的地方使用replace来跳转:

this.props.history.replace('/detail');

goBack

场景中需要返回上级页面的时候使用:

this.props.history.goBack();

嵌套路由

嵌套路由的适用场景还是比较多的,接下来就来介绍一下实现方法。

首先定义父级组件MainLayout

importReactfrom'react';
import'./MainLayout.scss';
const { Header, Sider, Content } =Layout;
exportdefaultclassMainLayoutextendsReact.Component {
render() {
return (
<divclassName='main-layout'>父组件</div>        );
    }
}

定义子组件Home:

importReact, {useState} from'react';
import {Modal, Select} from"antd";
import {connect} from'react-redux';
import {addCount} from'../../servers/home';
functionHome(props) {
const [visible, setVisible] =useState(false);
const {countNum: {count}, dispatch} =props;
return (
<div>子组件</div>    )
}
exportdefaultHome;

将它们添加进路由router.js,并且关联父子关系:

importReactfrom'react';
import {HashRouter, Route, Switch} from"react-router-dom";
importHomefrom'../pages/Home/Home';
importMainLayoutfrom'../layout/MainLayout';
constBasicRouter= () => (
<HashRouter><Switch><Routepath="/index"component={
<MainLayout><Routeexactpath="/"component={Home}/><Routeexactpath="/index"component={Home}/><Routepath="/index/home"component={Home}/></MainLayout>             }/></Switch></HashRouter>);
exportdefaultBasicRouter;

在MainLayout中,修改如下代码:

importReactfrom'react';
import'./MainLayout.scss';
const { Header, Sider, Content } =Layout;
exportdefaultclassMainLayoutextendsReact.Component {
render() {
return (
<divclassName='main-layout'>                {this.props.children}
</div>        );
    }
}

如此,一个嵌套路由就完成了。

总结

这篇文章基本上涵盖了大部分react-router-dom的用法,此后发现有什么遗漏会再继续补充。

相关文章
|
3月前
|
前端开发 JavaScript
React项目路由懒加载lazy、Suspense,使第一次打开项目页面变快
本文介绍了在React项目中实现路由懒加载的方法,使用React提供的`lazy`和`Suspense`来优化项目首次加载的速度。通过将路由组件改为懒加载的方式,可以显著减少初始包的大小,从而加快首次加载速度。文章还展示了如何使用`Suspense`组件包裹`Switch`来实现懒加载过程中的fallback效果,并提供了使用前后的加载时间对比,说明了懒加载对性能的提升作用。
243 2
React项目路由懒加载lazy、Suspense,使第一次打开项目页面变快
|
1月前
|
前端开发 API UED
React 路由守卫 Guarded Routes
【10月更文挑战第26天】本文介绍了 React 中的路由守卫(Guarded Routes),使用 `react-router-dom` 实现权限验证、登录验证和数据预加载等场景。通过创建 `AuthContext` 管理认证状态,实现 `PrivateRoute` 组件进行路由保护,并在 `App.js` 中使用。文章还讨论了常见问题和易错点,提供了处理异步操作的示例,帮助开发者提升应用的安全性和用户体验。
53 1
|
1月前
|
前端开发 安全 网络安全
React——路由Route
React——路由Route
35 2
React——路由Route
|
2月前
|
资源调度 前端开发 测试技术
React Router 路由管理
【10月更文挑战第10天】本文介绍了 React Router,一个在 React 应用中管理路由的强大工具。内容涵盖基本概念、安装与使用方法、常见问题及解决方案,如路由嵌套、动态路由和路由守卫等,并提供代码示例。通过学习本文,开发者可以更高效地使用 React Router,提升应用的导航体验和安全性。
311 19
|
2月前
|
前端开发 网络架构
React 路由
10月更文挑战第11天
37 2
|
2月前
|
JavaScript 前端开发 算法
React 虚拟 DOM 深度解析
【10月更文挑战第5天】本文深入解析了 React 虚拟 DOM 的工作原理,包括其基础概念、优点与缺点,以及 Diff 算法的关键点。同时,分享了常见问题及解决方法,并介绍了作者在代码/项目上的成就和经验,如大型电商平台的前端重构和开源贡献。
65 3
|
2月前
|
前端开发 JavaScript 网络架构
实现动态路由与状态管理的SPA——使用React Router与Redux
【10月更文挑战第1天】实现动态路由与状态管理的SPA——使用React Router与Redux
46 1
|
3月前
|
XML JavaScript 前端开发
学习react基础(1)_虚拟dom、diff算法、函数和class创建组件
本文介绍了React的核心概念,包括虚拟DOM、Diff算法以及如何通过函数和类创建React组件。
36 3
|
3月前
|
JavaScript 前端开发
react字符串转为dom标签,类似于Vue中的v-html
本文介绍了在React中将字符串转换为DOM标签的方法,类似于Vue中的`v-html`指令,通过使用`dangerouslySetInnerHTML`属性实现。
108 0
react字符串转为dom标签,类似于Vue中的v-html
|
3月前
|
移动开发 前端开发 应用服务中间件
React两种路由模式的实现原理
React两种路由模式的实现原理
106 3