react入门12:React Router 获取数据详情

330 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第44天,点击查看活动详情


写在前面

本篇是react学习的第十二篇,介绍React Router 获取数据详情

React Router 编辑数据

建议从我的文章:react入门9,这样比较有连续性。该系列所有的代码都是跟着官网教程进行。

上篇文章我们讲了查询数据的逻辑,src\routes\root.jsx文件中添加了如下代码,NavLink会使我们在点击一条contact记录的时候路由跳转到contacts/${contact.id}to={contacts/${contact.id}}),这个页面可以称为一条数据的详情页面:

<NavLink
    to={`contacts/${contact.id}`}
    className={({ isActive, isPending }) =>
        isActive
            ? "active"
            : isPending
                ? "pending"
                : ""
    }
>
    {contact.first || contact.last ? (
        <>
            {contact.first} {contact.last}
        </>
    ) : (
        <i>No Name</i>
    )}{" "}
    {contact.favorite && <span></span>}
</NavLink>

现在我们的代码中还没有详情页面,所以我们新增src\routes\Contact.jsx文件,文件代码如下,在该文件下调用了getContact()接口获取一条contact记录的详情信息,同样也是在loader加载器中调用接口,通过useLoaderData()方法获取接口返回的数据:

import { Form, useLoaderData } from "react-router-dom";
import { getContact } from "../contacts";

export async function loader({ params }) {
  return getContact(params.contactId);
}

export default function Contact() {
  const contact = useLoaderData();

  return (
    <div id="contact">
      <div>
        <img
          key={contact.avatar}
          src={contact.avatar || null}
        />
      </div>

      <div>
        <h1>
          {contact.first || contact.last ? (
            <>
              {contact.first} {contact.last}
            </>
          ) : (
            <i>No Name</i>
          )}{" "}
          <Favorite contact={contact} />
        </h1>

        {contact.twitter && (
          <p>
            <a
              target="_blank"
              href={`https://twitter.com/${contact.twitter}`}
            >
              {contact.twitter}
            </a>
          </p>
        )}

        {contact.notes && <p>{contact.notes}</p>}

        <div>
          <Form action="edit">
            <button type="submit">Edit</button>
          </Form>
          <Form
            method="post"
            action="destroy"
            onSubmit={(event) => {
              if (
                !confirm(
                  "Please confirm you want to delete this record."
                )
              ) {
                event.preventDefault();
              }
            }}
          >
            <button type="submit">Delete</button>
          </Form>
        </div>
      </div>
    </div>
  );
}

function Favorite({ contact }) {
  // yes, this is a `let` for later
  let favorite = contact.favorite;
  return (
    <Form method="post">
      <button
        name="favorite"
        value={favorite ? "false" : "true"}
        aria-label={
          favorite
            ? "Remove from favorites"
            : "Add to favorites"
        }
      >
        {favorite ? "★" : "☆"}
      </button>
    </Form>
  );
}

同时将contacts/${contact.id}添加到路由中,打开src\main.jsx文件,修改代码如下,可以看到,增加了一个path为contacts/:contactId的路由,同时配置了loader为上面routes/contact中定义的loader:

// 其他代码
import Contact, { loader as contactLoader } from "./routes/contact"; // 增加的代码

const router = createBrowserRouter([
  {
    path: "/",
    element: <Root />,
    loader: rootLoader,
    action: rootAction,
    children: [
      {
        path: "contacts/:contactId",
        element: <Contact />,
        loader: contactLoader,
      },
      {
        path: "contacts/:contactId/edit",
        element: <EditContact />,
        loader: contactLoader,
        action: editAction,
      },
    ],
  },
]);
// 其他代码

此时我们再打开项目http://127.0.0.1:5173/ ,点击一条contact记录(No Name),右边会显示这条记录的详细信息:

image.png

同时点击Edit按钮,页面会跳转到contacts/:contactId/edit页面,可以进行信息的编辑,我们可以尝试信息填写和保存,都可以进行,因为我们在上篇文章已经将src\routes\edit.jsx的代码写好了,下一篇文章我们就来分析一下src\routes\edit.jsx代码的逻辑

写在最后

以上就是React Router 获取数据详情所有代码和说明