React小记(四)_路由的基本使用

简介: React小记(四)_路由的基本使用

react-router V6
1、React-router 的三个版本
1、React-router 服务端使用
2、React-router-dom 浏览器端使用
3、React-router-native React-native 混合开发使用
1
2
3
2、基本使用
基本使用步骤如下:
1、选择路由模式 history/hash 包裹在想要使用路由的组件外面
包裹的好处是灵活,谁用包裹谁
2、使用 Routes 组件 --- 路由出口
3、使用 Route 组件 --- 写在 Routes 里面(用来包裹具体路由规则)
4、使用 NavLink/Link 组件 --- 路由链接
1
2
3
4
5
6
2.1 选择路由模式
// 1、用哪包哪



// 2、用谁包谁



1
2
3
4
5
6
7
8
2.2 定义路由组件
在 src 新建文件夹 pages 里面用来放 路由组件
1
import '../App.css';

function Page1() {
return (


Page1



);
}

export default Page1;
1
2
3
4
5
6
7
8
9
10
11
2.3 路由出口以及配置路由规则
import './App.css';
// 1、引入路由组件 以及 Routes, Route
import {Routes, Route} from 'react-router-dom';
import Page1 from './pages/page1';
import Page2 from './pages/page2';
import Page3 from './pages/page3';
import Page4 from './pages/page4';

function App() {
return (


路由的基本使用


{/ 2、注明路由出口 配置路由规则 /}

{/ path 这里 不要写成 './' /}
{/ 写法一: Component 里面直接写组件名 /}

{/ 写法二:element 里面写组件 /}
}>
}>
{/ path 这里 可以写成 字符串 也可以用{}包裹 /}
}>


);
}

export default App;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2.4 声明路由链接
1、NavLink 自带 active 类, 使用时需要在样式文件中添加 active 类
2、Link 普通的链接
1
2
// 引入
import {NavLink,Link} from 'react-router-dom';

// 使用 路由链接


{/ 1、NavLink 选中后自带 active 类 添加样式即可使用 /}
Page1
Page2
{/ 2、普通的链接 /}
Page3
Page4

// 添加 active 类
.active{
background-color: #61dafb;
border-radius: 20%;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
3、感受 react 全局插件 使用方式
1、与 vue 不同 ,react 中没有 vue.use 的方法
2、使用时,都是遵循 谁使用,包裹谁 的原则
1
2
4、嵌套路由 与 outLet
1、在当前 Route 组件下,在嵌套 Route 组件
2、使用 outLet 组件 在当前组件 注明 路由出口
3、在 当前组件 中 写路由链接 实现点击跳转
1
2
3
4.1 重新配置路由规则
// 引入子组件
import Son1 from './pages/page1Son/Son1';
import Son2 from './pages/page1Son/Son2';


}>
}>

1
2
3
4
5
6
7
8
4.2 使用 outLet 组件
import { Outlet } from 'react-router-dom';


子页面的位置


{/ 用于告诉 路由 子组件显示的位置 /}


1
2
3
4
5
6
7
4.3 实现点击跳转
import {Link} from 'react-router-dom';


son1
son2

1
2
3
4
5
6
5、动态路由 与 路由传参
1、动态路由就是配置路由时,路由规则的 path 是不固定的,往往携带着一些参数
2、react中常见的路由参数有以下几种
(1) params 参数 --类似于 get 请求
V5 this.props.match.params
V6 useParams
(2) query 参数 -- 类似于 get 请求
V5 this.props.location.search
V6 useSearchParams
(3) location信息 / state 参数 -- 参数通过 state 属性 传递(类似于 post 请求)
V5 this.props.location.state
V6 useLocation
1
2
3
4
5
6
7
8
9
10
11
5.1 params 参数
1、路由链接(携带参数):
Page2
2、注册路由(声明接收)--加占位符:
}>
3、接收参数:
V5 this.props.match.params
V6 const parms = useParams()
1
2
3
4
5
6
7
import '../App.css';
import {useParams} from 'react-router-dom';

function Page2() {
// 接收 params 参数
const parms = useParams()
return (


Page2


携带的params参数:{ parms.id}



);
}

export default Page2;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
5.2 query 参数
1、路由链接(携带参数):
Page3
2、注册路由(声明接收)--无需变动:
}>
3、接收参数:
V5 this.props.location.search
V6 const [query,setQuery] = useSearchParams()
1
2
3
4
5
6
7
import '../App.css';
import {useSearchParams} from 'react-router-dom'

function Page3() {
const [query,setQuery] = useSearchParams()
return (


Page3


{/ 1、query.get 获取参数 /}

接收到的query参数:name:{query.get('name')} age:{query.get('age')}


{/ 2、setQuery 修改参数 是替换 不是追加 /}


);
}

export default Page3;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
5.3 state 参数
【V5】
1、路由链接(携带参数):
详情
2、注册路由(无需声明,正常注册即可):

3、接收参数:
this.props.location.state
4、备注:刷新也可以保留住参数
【V6】
1、路由链接(携带参数):
Page4
2、注册路由(无需声明,正常注册即可):
}>
3、接收参数:
const { state, search} = useLocation()
4、备注:刷新也可以保留住参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import '../App.css';
import { useLocation } from 'react-router-dom'
import query from 'querystring'

function Page4() {
const { state, search} = useLocation()
return (


Page4


接收的state参数:name:{state.name}age{state.age}



也可以从这里取query参数:
{/ 这里取到的参数为字符串 需要借助第三方库解析成对象 然后取值 /}
name:{query.parse(search).name}
age:{query.parse(search).age}



);
}

export default Page4;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
6、重定向
【V5】
1.一般写在所有路由注册的最下方,当所有路由都无法匹配时,跳转到Redirect指定的路由
2.具体编码:





【V6】
使用 Navigate 组件

1
2
3
4
5
6
7
8
9
10
11
7、编程式路由导航
【V5】
借助【this.prosp.history】对象上的API对操作路由跳转、前进、后退
-this.prosp.history.push()
-this.prosp.history.replace()
-this.prosp.history.goBack()
-this.prosp.history.goForward()
-this.prosp.history.go()
【V6】
1、使用 useNavigate 创建跳转方法 ,然后跳转
2、如何传参
parms/query 参数 直接写在路径上
state 参数 写在 第二个参数上
1
2
3
4
5
6
7
8
9
10
11
12
【案例】实现从page2 跳转到 page1 并携带 state参数

// page2
import '../App.css';
import {useParams, useNavigate} from 'react-router-dom';

function Page2() {
// 接收 params 参数
const parms = useParams()

// 编程式路由
const nav = useNavigate()
return (
    <div className="App">
        <h3>Page2</h3>
        <p>携带的params参数:{parms.id}</p>
        <button onClick={() => {
            nav('/page1', {
                state: { demo: "测试编程式路由导航" }
            })
        }}>跳转到page1</button>
    </div>
);

}

export default Page2;

// page1
import '../App.css';
import {Link} from 'react-router-dom';
import { Outlet,useLocation } from 'react-router-dom';

function Page1() {
const { state } = useLocation()
console.log(state);
return (


Page1



son1
son2


子页面的位置



从page2携带过来的参数
class:{state.demo}


{/ 用于告诉 路由 子组件显示的位置 /}



);
}

export default Page1;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
8、路由懒加载
1、lazy Suspence 实际上是 react 的函数/组件 用的时候将内容包一下
2、react 其他函数 使用规则亦是如此
3、主要目的是用的组件才导入,对大型项目【打包】友好
1
2
3
// 1、路由表中引入方式变为 lazy
const Home = lazy(() => import('../pages/Home'))
const Login = lazy(()=>import('../pages/Login'))

// 2、使用路由组件的页面 展示时 引入 Suspence(组件)搭配使用
import {Suspense} from 'react'




1
2
3
4
5
6
7
8
9
10
9、路由表的使用
1、路由表 就是在外部再次创建一个数组文件 将配置信息填入
2、借助 useRoutes 根据路由表 渲染 路由出口
1
2
9.1 配置路由表
// route.js
import About from "../pages/About";
import Home from "../pages/Home";
import { Navigate } from "react-router-dom"

export default [
{
path: "/home",
element:
},
{
path: "/about",
element:
},
{
// 路由的重定向 当访问某个路径时 替换成另外一个路径
path: "/",
element:
},
]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
9.2 借助 useRoutes 根据路由表 渲染 路由出口
import { Link, useRoutes } from "react-router-dom"
import routes from "./routes"

function App() {
// 1、借助 useRoutes 根据路由表 渲染 路由出口 -- element
let element = useRoutes(routes)

return (


我是App组件



首页
关于




{/ 2、路由表 渲染的 路由出口 /}
{element}


)
}

export default App
```js

相关文章
|
3月前
|
前端开发 JavaScript
React项目路由懒加载lazy、Suspense,使第一次打开项目页面变快
本文介绍了在React项目中实现路由懒加载的方法,使用React提供的`lazy`和`Suspense`来优化项目首次加载的速度。通过将路由组件改为懒加载的方式,可以显著减少初始包的大小,从而加快首次加载速度。文章还展示了如何使用`Suspense`组件包裹`Switch`来实现懒加载过程中的fallback效果,并提供了使用前后的加载时间对比,说明了懒加载对性能的提升作用。
263 2
React项目路由懒加载lazy、Suspense,使第一次打开项目页面变快
|
1月前
|
前端开发 API UED
React 路由守卫 Guarded Routes
【10月更文挑战第26天】本文介绍了 React 中的路由守卫(Guarded Routes),使用 `react-router-dom` 实现权限验证、登录验证和数据预加载等场景。通过创建 `AuthContext` 管理认证状态,实现 `PrivateRoute` 组件进行路由保护,并在 `App.js` 中使用。文章还讨论了常见问题和易错点,提供了处理异步操作的示例,帮助开发者提升应用的安全性和用户体验。
57 1
|
1月前
|
前端开发 安全 网络安全
React——路由Route
React——路由Route
36 2
React——路由Route
|
2月前
|
资源调度 前端开发 测试技术
React Router 路由管理
【10月更文挑战第10天】本文介绍了 React Router,一个在 React 应用中管理路由的强大工具。内容涵盖基本概念、安装与使用方法、常见问题及解决方案,如路由嵌套、动态路由和路由守卫等,并提供代码示例。通过学习本文,开发者可以更高效地使用 React Router,提升应用的导航体验和安全性。
335 19
|
2月前
|
前端开发 网络架构
React 路由
10月更文挑战第11天
41 2
|
2月前
|
前端开发 JavaScript 网络架构
实现动态路由与状态管理的SPA——使用React Router与Redux
【10月更文挑战第1天】实现动态路由与状态管理的SPA——使用React Router与Redux
49 1
|
3月前
|
前端开发 Python
React技术栈-React路由插件之自定义组件标签
关于React技术栈中React路由插件自定义组件标签的教程。
66 4
React技术栈-React路由插件之自定义组件标签
|
3月前
|
移动开发 前端开发 应用服务中间件
React两种路由模式的实现原理
React两种路由模式的实现原理
118 3
|
3月前
|
前端开发 程序员 API
React技术栈-React路由插件之react-router的基本使用
这篇博客介绍了React路由插件react-router的基本使用,包括其概念、API、以及如何通过实战案例在React应用中实现SPA(单页Web应用)的路由管理。
92 9
|
4月前
|
前端开发 测试技术 开发者
React Router的神奇之处:如何用导航与路由管理让你的复杂SPA飞起来?
【8月更文挑战第31天】本文全面解析了React Router——一款用于React应用的路由与导航管理库。通过定义不同路径并依据URL渲染组件,React Router支持路径匹配、参数路由及嵌套路由等多种模式。文章详细介绍了其基本与高级用法,如使用`Link`组件导航、`Switch`组件进行路径匹配及`NavLink`自定义活动链接样式。此外,还探讨了懒加载、代码分割等性能优化技巧,并提供了简单示例代码,帮助读者快速上手。遵循本文最佳实践,开发者能够更高效地利用React Router构建复杂的单页面应用。
88 0