react路由介绍

在react中有两种路由模式,分别是 hash history ,为了方便大家理解,我们先来了解下这两个路由

两者区别

外观

使用hash模式下的URL,网络路径中会有一个#号进行拼接,而history没有带 #

兼容性

hash能够兼容到IE8,history只能够兼容到IE10

运行原理

hash是通过window.onhashchange的方式进行监听变化,从而实现无刷新跳转,每次hash变化都会触发网页跳转,也就是浏览器的前进和后退,虽然hash会改变URL,但是不会触发页面重新加载。简而言之所有页面的跳转都是在客户端进行的,跳转的过程不算是一次http请求,所以这种模式对SEO优化是很不友好的。

history模式在对当前页面进行刷新时,此时浏览器会重新发起请求。history是利用H5的 history中新增的两个API pushState()replaceState() 和一个事件onpopstate来监听URL变化,history每次刷新都会重新请求服务器,需要服务端来允许地址是否可访问,如果没有设置的话,会导致404页面。

如果对项目没有特殊要求,可以直接使用hash模式开发,如果需要SEO优化那么一定要选history

react路由使用

了解了hashhistory基础介绍之后,我们接着引入react项目下token失效之后怎么跳转到登录页面

hash模式路由跳转处理

首先路由模块是引入HashRouter==> hash模式的

  1. import { HashRouter as Router, Route, Switch, Redirect } from 'react-router-dom';
  2. import Login from '@/pages/login';
  3. import BlogMenu from '@/pages/layout';
  4. import Register from '@/pages/register';
  5. import NotFound from '@/pages/404';
  6. <Router>
  7. <Switch>
  8. <Route path="/api/login" component={Login}></Route>
  9. <Route path="/api/register" component={Register}></Route>
  10. <Route
  11. path="/"
  12. render={() =>
  13. localStorage.getItem('token') ? (
  14. <BlogMenu />
  15. ) : (
  16. <Redirect to="/api/login"></Redirect>
  17. )
  18. }
  19. ></Route>
  20. <Route path="*" component={NotFound}></Route>
  21. </Switch>
  22. </Router>

utils -> http.js 请求文件中进行验证的处理

  1. case 401:
  2. // token
  3. console.log('服务器认证失败');
  4. localStorage.removeItem('token');
  5. // 退出登录
  6. window.location.href = '#/api/login';
  7. break;

使用原生的window方法,强制跳转到 login 页面,这种方式在hash模式下没有问题,在history下跳转时会出现白屏的情况

history模式路由跳转处理

utils 文件夹中新建一个history.js文件,引入history并导出

  1. import { createBrowserHistory } from 'history';
  2. export default createBrowserHistory();

hash模式路由进行修改,找到路由文件,将 HashRouter as Router修改为Router,然后引入history文件,在标签<Router>中引入history

  1. import { Router, Route, Switch, Redirect } from 'react-router-dom';
  2. import Login from '@/pages/login';
  3. import BlogMenu from '@/pages/layout';
  4. import Register from '@/pages/register';
  5. import NotFound from '@/pages/404';
  6. import history from '@/utils/history';
  7. <Router history={history}>
  8. <Switch>
  9. <Route path="/api/login" component={Login}></Route>
  10. <Route path="/api/register" component={Register}></Route>
  11. <Route
  12. path="/"
  13. render={() =>
  14. localStorage.getItem('token') ? (
  15. <BlogMenu />
  16. ) : (
  17. <Redirect to="/api/login"></Redirect>
  18. )
  19. }
  20. ></Route>
  21. <Route path="*" component={NotFound}></Route>
  22. </Switch>
  23. </Router>

utils -> http.js 请求文件中引入history文件,进行路由的跳转

  1. import history from './history';
  2. history.push('/api/login')

参考链接:
react 中token失效Router路由跳回login页面的(history出现白屏)解决方案
hash和history的区别