路由跳转
博客不能只有一个页面:首页看文章列表,点标题要能跳去详情页。"根据地址显示不同页面"就是路由。React 生态中最常用的是 react-router-dom。本章给博客加上首页与详情页两个路由,实现页面间的跳转。
安装与整体结构
在项目根目录执行命令安装依赖:
npm install react-router-dom
安装完成后,用 BrowserRouter 把整个应用包起来,再在 App 里用 Routes + Route 声明"地址 → 组件"的映射:
// main.jsx
import { BrowserRouter } from "react-router-dom";
import App from "./App";
createRoot(document.getElementById("root")).render(
<BrowserRouter>
<App />
</BrowserRouter>
);
// App.jsx
import { Routes, Route } from "react-router-dom";
import Home from "./pages/Home";
import PostDetail from "./pages/PostDetail";
export default function App() {
return (
<Routes>
<Route path="/" element={<Home />} />
<Route path="/post/:id" element={<PostDetail />} />
</Routes>
);
}
path 里带冒号的 :id 是动态参数,/post/1、/post/2 会匹配到同一个 PostDetail 组件。
用 Link 跳转
页面内跳转不要用 <a> 标签:<a> 会触发整页刷新,React 内存里的状态全部丢失。要用 Link,它只做"视图级"的切换:
import { Link } from "react-router-dom";
function ArticleCard({ post }) {
return (
<article>
<h2>
<Link to={`/post/${post.id}`}>{post.title}</Link>
</h2>
</article>
);
}
点击文章标题即可跳转到对应详情地址。
编程式跳转 useNavigate
Link 适合"点击即跳";而提交表单、倒计时结束等场景需要在代码里跳转,这时用 useNavigate:
import { useNavigate } from "react-router-dom";
function Home() {
const navigate = useNavigate();
return <button onClick={() => navigate("/post/1")}>阅读最新文章</button>;
}
navigate 就是"跳转函数",传入目标路径即可。
读取参数与 404 页
详情页要用 useParams 取出 :id;同时给 Routes 加一条 path="*" 的通配路由,兜住所有未匹配的地址:
import { useParams } from "react-router-dom";
function PostDetail() {
const { id } = useParams(); // 访问 /post/3 时 id 为 "3"
return <h1>正在查看文章 {id}</h1>;
}
<Route path="*" element={<h1>404,页面不存在</h1>} />
小结
路由 = BrowserRouter 包裹 + Route 声明映射 + Link/navigate 跳转 + useParams 取动态参数。下一步,让页面在渲染完成后自动去请求数据——这就要请出 useEffect 了。