React Router
单页面应用的路由原理差不多,都是基于浏览器的 history API 管理历史浏览记录,通过监听 history 对象的变化(onpopstate) 或 hash 的变化(hashchange),抹平两者的差异,统一路由的对象(history)和操作函数
React Router 各组件
Router
分为 BrowserRouter 和 HashRouter,这两个组件在 react-router-dom 中,但它们都基于 react-router 的 Router 组件。他们会维护一个路由状态 state,一旦发生路由变化,就会触发重新渲染 Router 组件,重新执行路由匹配逻辑,达到切换路由页面的效果
Route
这个组件只是挂载下真实的路由组件和路径信息等
Routes
Routes 组件会遍历 Route 组件,形成一个 routes 列表,然后统一处理路由匹配逻辑
NavLink
基于 Link 组件的加强版,Link 组件主要是对 a 标签的改造,会阻止 a 标签的默认跳转,以及加上路由跳转逻辑,这部分路由跳转逻辑会去修改 Router 组件的路由状态
路由守卫
常用场景比如路由鉴权
思路:在路由组件包装一个权限路由组件,可能需要递归处理,参考 https://zhuanlan.zhihu.com/p/555189442
路由拦截
比较多的场景是做跳转前确认
借助 useBlocker,参考 https://gist.github.com/chaance/2f3c14ec2351a175024f62fd6ba64aa6
路由懒加载
基于 ES6 的 动态 import 特性,webpack 在打包时会识别该语法并将其打包成一个 chunk,接着结合 React.lazy() (lazyComponent)和 Suspense 实现懒加载路由组件,当路由被匹配时才会加载对应的组件,而不是一次性加载所有路由组件,从而减少页面加载时间和网络带宽的消耗
原理参考