React react-router-dom
一月 24, 2021
React 路由 react-router-dom
- 安装
1 | $ yarn add react-router-dom |
选择路由模式
- 目录 src/index.tsx 中写
1
2
3
4
5
6
7
8
9
10
11
12
13// 设置路由模式
// react-router-dom提供两种路由模式 HashRouter / BrowserRouter
import { BrowserRouter } from "react-router-dom";
ReactDOM.render(
<BrowserRouter>
{" "}
// 用标签包裹起来
<React.StrictMode>
<App />
</React.StrictMode>
</BrowserRouter>,
document.getElementById("root")
);
- 目录 src/index.tsx 中写
创建路由组件
- src/router/index.tsx 组件用于路由渲染区域
- src/components/tab/index.tsx 组件用于导航区域
- src/App.tsx 引入这两个组件
1
2
3
4
5
6
7
8
9
10
11
12
13
14import React from "react";
import Tab from "./components/tab";
import RouterComp from "./router";
export default function App() {
return (
<div>
{/* 导航区域 */}
<Tab />
{/* 路由区域 */}
<RouterComp />
</div>
);
}
打造路由表
- 在 router 文件下创建 routes.ts 用于书写路由表
- 在 src 文件夹下创建 pages,用于存放路由组件
1 | // 路由表 渲染导航区域 |
React.lazy
用于懒加载组件的
Tab 区域
- 需要从 react-router-dom 引入 NavLink
- 引入 routes,通过 routes 数据遍历渲染
1 | import React from "react"; |
NavLink
- to 属性,用于路径跳转
- activeClassName 属性,激活时使用的类名
路由渲染区域
- 从 react-router-dom 引入 Route
- 从 react 引入 Suspense
1 | import React, { Suspense } from "react"; // Suspense和lazy一起用 |
Route
类似于 vue 中的 router-view,里面有 path,component 属性
Switch
一次只渲染一个 Route
React.Suspense
转场组件,和 lazy 一起用,解决中间转场空白期
重定向
1 | <Redirect from="/" to="/home" exact /> |
Redirect 重定向组件
- from 当前路由路径
- to 目标路由路径
- exact 路径完全匹配
- 它是单标签,不需要包裹路由,放在 Switch 下方
二级路由
- 在路由表里增加子路由并在 pages 打造路由实例
1 | // routes.ts |
- 上述子路由在 Home 路由中,所以要在 Home 组件渲染路由
- 子路由导航区域
- 子路由渲染区域
1 | import React from "react"; |
声明式跳转/命令式跳转(编程式导航)
声明式跳转
- Link 中的 to
- NavLink 中的 to
- a 标签(但它会刷新)
编程式导航
- 函数组件使用钩子函数 useHistory
- 实例化 history.push/replace/goBack
1 | import React from "react"; |
- 类组件
- 通过属性 this.props.history.goBack
1 | import React, { Component } from "react"; |
动态路由
- 动态传参
- 通过 Link 里面 to 可以写对象 pathname/search/state/hash
- 动态接参
- 通过 useLocation,实例化后有个 location.search 可以得到?之后的字符串,通过 qs.parse 转换成对象并解构出参数
查看评论