本文档介绍使用 react-router 的单页面应用如何实现页面跳转。

组件跳转

通过 <Link /> 标签组件跳转,定义 to 属性完成路径跳转,等同于点击一个 <a /> 标签。

引入标签:

  1. import { Link } from 'react-router-dom';
  2. class Demo extends React.Component {
  3. render() {
  4. return (
  5. <div>
  6. <Link to="/courses?sort=name" />
  7. {/* 可以携带额外的数据 `state` 到路由中。 */}
  8. <Link
  9. to={{
  10. pathname: '/courses',
  11. search: '?sort=name',
  12. hash: '#the-hash',
  13. state: { fromDashboard: true },
  14. }}
  15. />
  16. </div>
  17. )
  18. }
  19. }

方法调用

一般在某些操作后跳转路由使用,例如权限验证,表单提交后等。

1. withRouter

如果调用方法的地方在 React 组件内部,可以直接在组件上添加 withRouter 的装饰器,然后组件内可以通过 props 获取到相关 API:

  1. import React from 'react';
  2. import { withRouter } from 'react-router-dom';
  3. @withRouter
  4. class ShowTheLocation extends React.Component {
  5. static propTypes = {
  6. match: PropTypes.object.isRequired,
  7. location: PropTypes.object.isRequired,
  8. history: PropTypes.object.isRequired,
  9. };
  10. handleHistoryPush = () => {
  11. const { history } = this.props;
  12. history.push('/new-path');
  13. };
  14. render() {
  15. const { location } = this.props;
  16. return (
  17. <div>
  18. <div>当前路径: {location.pathname}</div>
  19. <button onClick={this.handleHistoryPush}>点击跳转新页面</button>
  20. </div>
  21. );
  22. }
  23. }

2. history API

如果不满足第一种方法的使用条件,比如单独抽离的某个方法中,则需要单独使用 history 的三方包,一般情况下不推荐这种情况,实际业务里应该很少需要:

首先添加依赖:

  1. $ npm install --save history

然后在代码中使用:

  1. import { createBrowserHistory } from 'history';
  2. const history = createBrowserHistory();
  3. export default function checkAuth() {
  4. ajax('/api/checkAuth').then((res) => {
  5. if (res.data.noAuth) {
  6. history.push('/page/noAuth');
  7. }
  8. });
  9. };