React Router 入门教程:构建联系人管理系统

React Router 入门教程:构建联系人管理系统

react-router react-router 项目地址: https://gitcode.com/gh_mirrors/rea/react-router

前言

React Router 是 React 生态中最流行的路由解决方案之一。本教程将带你从零开始,使用 React Router 构建一个功能完整的联系人管理系统。通过这个项目,你将学习到 React Router 的核心概念和实用技巧。

项目初始化

在开始之前,我们需要搭建基本的 React 项目结构。这里推荐使用 Vite 作为构建工具,因为它提供了极快的开发体验。

npm create vite@latest contacts-app -- --template react
cd contacts-app
npm install react-router-dom localforage match-sorter sort-by
npm run dev

安装完成后,我们需要准备一些基础文件:

  • 创建 src/routes 目录存放路由组件
  • 添加联系人数据模块 src/contacts.js
  • 设置基础样式 src/index.css

基础路由配置

1. 创建根路由

首先在 main.jsx 中配置基本的路由结构:

import { createBrowserRouter, RouterProvider } from "react-router-dom";
import Root from "./routes/root";
import ErrorPage from "./error-page";

const router = createBrowserRouter([
  {
    path: "/",
    element: <Root />,
    errorElement: <ErrorPage />,
  }
]);

ReactDOM.createRoot(document.getElementById("root")).render(
  <React.StrictMode>
    <RouterProvider router={router} />
  </React.StrictMode>
);

2. 构建根布局组件

创建 src/routes/root.jsx 作为应用的布局框架:

import { Outlet, Link } from "react-router-dom";

export default function Root() {
  return (
    <>
      <div id="sidebar">
        <h1>React Router Contacts</h1>
        {/* 导航和搜索表单 */}
      </div>
      <div id="detail">
        <Outlet />
      </div>
    </>
  );
}

<Outlet> 是 React Router 提供的占位组件,用于渲染子路由内容。

错误处理

良好的错误处理是用户体验的重要组成部分。React Router 提供了 errorElement 属性来定制错误页面。

// src/error-page.jsx
import { useRouteError } from "react-router-dom";

export default function ErrorPage() {
  const error = useRouteError();
  return (
    <div id="error-page">
      <h1>Oops!</h1>
      <p>Sorry, an unexpected error has occurred.</p>
      <p><i>{error.statusText || error.message}</i></p>
    </div>
  );
}

嵌套路由与动态路由

1. 创建联系人详情页

// src/routes/contact.jsx
export default function Contact() {
  // 联系人详情UI
  return (
    <div id="contact">
      {/* 联系人信息展示 */}
    </div>
  );
}

2. 配置嵌套路由

// main.jsx
const router = createBrowserRouter([
  {
    path: "/",
    element: <Root />,
    errorElement: <ErrorPage />,
    children: [
      {
        path: "contacts/:contactId",
        element: <Contact />,
      }
    ]
  }
]);

数据加载

React Router 提供了优雅的数据加载方案,通过 loader 函数和 useLoaderData hook 实现。

1. 定义数据加载器

// src/routes/root.jsx
import { getContacts } from "../contacts";

export async function loader() {
  const contacts = await getContacts();
  return { contacts };
}

2. 使用加载的数据

export default function Root() {
  const { contacts } = useLoaderData();
  return (
    <nav>
      {contacts.map(contact => (
        <Link to={`contacts/${contact.id}`} key={contact.id}>
          {contact.first} {contact.last}
        </Link>
      ))}
    </nav>
  );
}

数据变更与表单处理

React Router 提供了与 HTML 表单相似但更强大的数据变更机制。

1. 创建联系人

// src/routes/root.jsx
import { Form } from "react-router-dom";

export async function action() {
  const contact = await createContact();
  return { contact };
}

// 在组件中使用
<Form method="post">
  <button type="submit">New</button>
</Form>

2. 更新联系人

// src/routes/contact.jsx
<Form method="post" action="edit">
  <button type="submit">Edit</button>
</Form>

优化用户体验

1. 客户端导航

使用 <Link> 替代 <a> 标签实现无刷新导航:

<Link to={`contacts/${contact.id}`}>
  {contact.first} {contact.last}
</Link>

2. 加载状态处理

React Router 提供了 useNavigation hook 来处理导航状态:

const navigation = useNavigation();
const busy = navigation.state === "submitting";
<button type="submit" disabled={busy}>
  {busy ? "Saving..." : "Save"}
</button>

总结

通过本教程,我们构建了一个完整的联系人管理系统,涵盖了 React Router 的核心功能:

  1. 基础路由配置
  2. 嵌套路由结构
  3. 动态路由参数
  4. 数据加载与渲染
  5. 表单提交与数据变更
  6. 错误处理
  7. 客户端导航优化

React Router 的强大之处在于它深度集成了 React 的渲染模型,同时保持了与 Web 平台标准的一致性。这种设计使得构建复杂单页应用变得简单而直观。

希望本教程能帮助你快速掌握 React Router 的核心概念,为构建更复杂的应用打下坚实基础。

react-router react-router 项目地址: https://gitcode.com/gh_mirrors/rea/react-router

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秦贝仁Lincoln

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值