返回介绍

5.5 详情页页面的实现

发布于 2024-01-20 01:12:17 字数 1895 浏览 0 评论 0 收藏 0

和首页一样,详情页也包含数据请求、UI 组件和样式代码三个文件。

数据请求代码文件的命名和首页一样,都是 fetch.ts。与首页不同的是,详情页我们需要从上下文(服务端渲染场景)或 URL 中(浏览器场景)获取到文章 ID,然后根据文章 ID 获取文章详情数据。代码如下:

import { RouteComponentProps } from "react-router";
export default async (ctx) => {
  let data;
  if (__isBrowser__) {
  const id = (ctx as RouteComponentProps<{ id: string }>).match.params.id;
  data = await (await window.fetch(`/api/detail/${id}`)).json()
  } else {
  const id = /detail\/(.*)(\?|\/)?/.exec(ctx.req.path)[1];
  data = await ctx.apiDeatilservice.index(id);
  }

  return {
  detailData: data,
  };
};

详情页的 UI 组件名称为 render$id.tsx 的文件, $id 表示该组件的参数是 id,这样访问 /detail/ 这个路由(id 是变量)时,就会匹配到 web/pages/detail/render$id.tsx 这个页面了。

render$id.tsx 详细代码如下:

import React, { useContext } from "react";
import { IContext, SProps } from "ssr-types";
import { Data } from "@/interface";
import Navbar from "@/components/navbar";
import Content from "@/components/content";
import Title from "@/components/title";
import Tip from "@/components/tip";
import styles from "./index.less";
export default (props: SProps) => {
  const { state } = useContext<IContext<Data>>(window.STORE_CONTEXT);
  return (
  <div>
  <Navbar {...props}></Navbar>
  <div className={styles.container}>
  <Title>{state?.detailData?.title}</Title>
  <Tip
    date={state?.detailData?.date}
    wordCount={state?.detailData?.wordCount}
    readingTime={state?.detailData?.readingTime}
  />
  <Content>{state?.detailData?.content}</Content>
  </div>
  </div>
  );
};

详情页的 UI 组件由四部分组成。

  • Navbar:导航条。
  • Title:文章标题。
  • Tip:文章发布时间、字数等提示。
  • Content:文章内容。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文