认识react-router
目前前端流行的三大框架, 都有自己的路由实现:
- Angular的ngRouter
- React的ReactRouter
- Vue的vue-route
目前使用的是 React Router6.x 版本;
安装React Router
安装时,我们选择react-router-dom;react-router会包含一些react-native的内容,web开发并不需要;
导入组件并使用
- BrowserRouter:使用history模式;
- HashRouter:使用hash模式;
路由映射配置
-
Routes:包裹所有的Route,在其中匹配一个路由
Router5.x使用的是Switch组件
-
Route:Route用于路径的匹配;
路由配置和跳转
使用Link和NavLink组件。
通常路径的跳转是使用Link组件,最终会被渲染成a元素;
to属性:Link中最重要的属性,用于设置跳转到的路径;
NavLink是在Link基础之上增加了一些样式属性;
如果我们需要再路径选中时,对应的a元素变为红,我们就要使用NavLink组件来替代Link组件。
在默认匹配成功时,NavLink就会添加上一个动态的active class,所以我们可以直接编写样式;
当热,我们也可以通过参数进行样式修改
- style:传入函数,函数接受一个对象,包含isActive属性
- className:传入函数,函数接受一个对象,包含isActive属性
Navigate导航
Navigate用于路由的重定向,当这个组件出现时,就会执行跳转到对应的to路径中。
Not Found页面配置
路由的嵌套
假设Home1和Home2是Home的子页面
<Outlet />
组件用于在父路由元素中作为子路由的占位元素,类似于vue的<router-view />
。
手动路由的跳转
目前我们实现的跳转主要是通过Link或者NavLink进行跳转的,实际上我们也可以通过JavaScript代码进行跳转。
如果我们希望通过JavaScript代码逻辑进行跳转(比如点击了一个button),那么就需要获取到navigate对象。在Router6.x版本之后,我们需要通过useNavigate的Hook获取到navigate对象进行操作;
::: tip
hook只能在个函数式组件中使用,因此在类组件中我们无法使用useNavigate
:::
如果我們需要在类组件中使用,那我们需要自己编写一个高阶组件
在组件中使用
路由参数传递
传递参数有二种方式:
-
动态路由的方式;
动态路由的概念指的是路由中的路径并不会固定。我们可以使用useParams
获取参数
明显useParams
是hook,因此无法再类组件中使用,因此需要修改withRouter
函数
如果我们将path在Route匹配时写成/About/:id,那么 /About/abc、/About/123都可以匹配到该Route,并且进行显示。
获取参数
-
search传递参数;
获取查询字符串有两种方式。
-
useLocation
首先修改withRouter
函数
打印location对象
路由的配置方式使用
目前我们所有的路由定义都是直接使用Route组件,并且添加属性来完成的,但是这样的方式会让路由变得非常混乱,我们希望将所有的路由配置放到一个地方进行集中管理。
在早期的时候,Router并且没有提供相关的API,我们需要借助于react-router-config完成;
在Router6.x中,我们可以使用useRoutes
完成相关的配置。
配置routes
懒加载
不直接导入,使用React.lazy
导入,routes数组保持不变
如果我们对某些组件进行了异步加载(懒加载),那么需要使用Suspense进行包裹: