文档地址
http://www.reactrouter.cn/docs/getting-started/tutorial
version
V6.x
前端路由指的是一种将浏览器URL与特定页面或视图关联起来的技术。在传统的Web开发中,当用户点击链接或者输入URL时,服务器会接收到请求并返回相应的HTML页面。而在前端路由中,当用户点击链接或者输入URL时,浏览器会根据路由规则对URL进行解析,并使用JavaScript控制页面的展示。
前端路由通常使用JavaScript库来实现,比如React Router、Vue Router等。它们允许开发者定义路由规则,并根据这些规则来显示不同的组件或页面。例如,当用户点击一个链接时,前端路由会将URL解析为一个路由路径,然后根据路径匹配相应的组件或页面并显示在页面上,而不需要向服务器发起请求。
前端路由可以提高Web应用的性能和用户体验,因为它允许应用实现快速的页面切换和动态的内容加载,同时减少了服务器的负载。
// 注意:我们用的是6.x的版本
npm install react-router-dom
HashRouter使用URL的哈希部分(即#后面的部分)来匹配路由,它不会向服务器发送请求。例如,URL可以是http://example.com/#/about。HashRouter兼容性比较好,哪怕浏览器不支持HTML5 History API也可以正常使用。
BrowserRouter使用HTML5 History API来匹配路由,使用 HTML5 的 pushState 和 replaceState API 来实现路由的切换。它可以隐藏URL中的#符号,使URL更加友好。例如,URL可以是http://example.com/about
MemoryRouter是一个不依赖于浏览器历史记录的路由器。它将URL存储在内存中,而不是浏览器历史记录中,适用于测试或在不支持HTML5 History API的环境中使用
StaticRouter是一个用于服务器端渲染的路由器。它将请求的URL作为参数传递给组件,并将组件的输出发送回客户端。这样就可以在服务器端生成动态HTML,然后将其发送到浏览器。
NativeRouter是用于React Native应用的路由器,它使用Native导航而不是HTML导航来匹配路由
用于创建一个路由容器,使得我们可以在浏览器中使用路由。它包裹整个应用程序,并提供了一个路由的上下文环境。
用于将一个路由路径与一个组件进行映射。当浏览器 URL 与 Route 组件所定义的路径匹配时,该组件就会被渲染到页面上
属性名 | 类型 | 默认值 | 描述 |
---|---|---|---|
path | string | 用于匹配 URL 的路径。 | |
element | ReactNode | 指定路由匹配成功后要渲染的组件。 | |
caseSensitive | boolean | false | 指定路径匹配时是否区分大小写。 |
sensitive | boolean | false | 指定路径匹配时是否严格匹配大小写和斜杠。 |
location | string | object | 指定要匹配的位置。 | |
navigate | boolean | true | 当路由匹配成功后是否进行页面导航。 |
elementProps | object | 传递给渲染组件的属性对象。 | |
preload | function | 用于预加载组件。 | |
caseSensitive | boolean | false | 指定路径匹配时是否区分大小写。 |
sensitive | boolean | false | 指定路径匹配时是否严格匹配大小写和斜杠。 |
redirectTo | string | 当路由匹配成功后要重定向到的路径。 | |
redirectPath | string | 当路由匹配成功后要重定向到的路径。 | |
replace | boolean | false | 当页面导航时是否使用 replace 而非 push。 |
caseSensitive | boolean | false | 指定路径匹配时是否区分大小写。 |
sensitive | boolean | false | 指定路径匹配时是否严格匹配大小写和斜杠。 |
preventDefault | boolean | false | 是否阻止默认的页面导航行为。 |
when | boolean | func | true | 指定条件是否匹配,用于控制是否进行页面导航。 |
className | string | 为路由渲染的元素指定 CSS 类名。 | |
style | object | 为路由渲染的元素指定样式对象。 | |
title | string | 页面标题,用于在路由变化时更新页面标题。 | |
meta | any |
import { Route, Routes } from 'react-router-dom';
function App() {
return (
);
}
Routes 组件是 React Router v6 中的一个组件,它的作用是用于定义应用程序的路由规则。与 React Router v5 中的 组件类似,Routes 组件包含多个 子组件,用于指定不同的路径和对应的组件。
Routes 组件可以让我们更加灵活地定义路由规则。与 React Router v5 中的 组件只能按顺序匹配第一个符合条件的路由不同,Routes 组件可以匹配多个路由,并根据 path 属性的优先级选择最匹配的路由。例如,如果同时定义了 /users/:id 和 /users/new 两个路由规则,当访问 /users/new 时,React Router v6 会选择匹配优先级更高的 /users/new 路由,而不是直接匹配第一个符合条件的路由
import { Route, Routes } from 'react-router-dom';
function App() {
return (
);
}
用于创建一个链接,使得用户可以通过点击链接来访问应用程序的不同路由路径。它会生成一个 标签,并根据传入的 to 属性生成正确的 href 属性。
import { Link } from 'react-router-dom';
function Home() {
return (
-
A页面
-
B页面
);
}
与 类似,也用于创建一个链接,但它会在当前路由匹配成功时添加一个指定的类名,以便样式上的区分。
import { NavLink } from 'react-router-dom';
/**
当点击链接的时候会自动激活activeClassName属性的className
*/
function Navbar() {
return (
);
}
用于重定向用户到另一个路由路径。当用户访问当前路径时,会自动跳转到指定的路径。
在使用Redirect组件时,您需要在路由配置中使用它而不是在组件中使用它。例如,如果您想在用户访问/home时重定向到/dashboard,则可以像这样设置路由
import { Route, Routes, Redirect } from 'react-router-dom';
import Dashboard from './Dashboard';
function App() {
return (
} />
} />
);
}
用于在用户离开当前页面之前提示用户。可以用来防止用户在填写表单时误操作导致数据丢失。
用于在组件中进行导航、跳转等操作,与 useHistory 功能类似,但提供了更丰富的 API,例如可以使用命名路由进行跳转。
所谓的命名理由就是Route组件上定义的name属性,然后在跳转的时候直接穿name即可。
用于获取 URL 中的参数,例如 /users/:id 中的 id
用于访问当前页面的位置信息,包括 URL 中的路径、查询参数、哈希等。
用于获取当前页面的匹配信息,例如路由规则中的路径、参数等,与 useRouteMatch 功能类似
用于在父组件中呈现子路由组件,可以将子路由组件放在特定位置。也就是展示嵌套路由。
import { useOutlet } from 'react-router-dom';
function App() {
const outlet = useOutlet();
return (
这是应用程序的头部
{/* 在这里渲染子路由组件 */}
{outlet}
这是应用程序的底部
);
}
路由定义嵌套路由
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
function App() {
return (
} />
} />
}>
{/* 子路由 */}
} />
} />
);
}
根据规则动态渲染路由。
注意:
在使用 useRoutes 钩子函数时,需要将其作为根组件渲染,而不是将其作为子组件嵌套在其他组件中。这是因为 useRoutes 钩子函数需要访问 react-router-dom 的上下文,从而能够进行路由匹配和导航操作。
import { useRoutes } from 'react-router-dom';
function App() {
const routes = useRoutes([
{ path: '/', element: },
{ path: '/about', element: },
{ path: '/contact', element: },
{ path: '/users/:id', element: },
]);
return {routes};
}
/**
* 从react-router-dom中 引用HashRouter 是一个组件
* 如果需要别的模式那就引入其他模式
*
*/
import React from "react";
import { HashRouter, Route, Routes } from "react-router-dom";
import APage from "./learn-router/a";
import BPage from "./learn-router/b";
import CPage from "./learn-router/c";
export default function RouterComponent() {
return (
// 首先确定什么模式,那么最上层组件就是用这个模式
} />
} />
}>
);
}
import React from "react";
import ReactDOM from "react-dom/client";
import RouterComponent from "./rotuerComponent";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
);
http://localhost:3000/
http://localhost:3000/#/b
http://localhost:3000/#/c