国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當前位置: 首頁 > news >正文

網(wǎng)站做視頻在線觀看網(wǎng)址網(wǎng)站開發(fā)合同

網(wǎng)站做視頻在線觀看網(wǎng)址,網(wǎng)站開發(fā)合同,上海大型網(wǎng)站建設(shè),wordpress 顯示多媒體原文鏈接 CSDN 的排版/樣式可能有問題,去我的博客查看原文系列吧,覺得有用的話,給我的庫點個star,關(guān)注一下吧 上一篇【Next.js 項目實戰(zhàn)系列】03-查看 Issue 修改 Issue 添加修改 Button? 本節(jié)代碼鏈接 安裝 Radix UI 的 Ra…

原文鏈接

CSDN 的排版/樣式可能有問題,去我的博客查看原文系列吧,覺得有用的話,給我的庫點個star,關(guān)注一下吧?

上一篇【Next.js 項目實戰(zhàn)系列】03-查看 Issue

修改 Issue

添加修改 Button?

本節(jié)代碼鏈接

安裝 Radix UI 的?Radix Ui Icons

npm i @radix-ui/react-icons
# /app/issues/[id]/page.tsx...const IssueDeatilPage = async ({ params }: Props) => {...return (// 添加一個 Grid 以分列顯示,設(shè)置 initial 為 1,在移動設(shè)備為每頁 1 欄,平板以上則 2 欄<Grid columns={{ initial: "1", md: "2" }} gap="5"><Box><Heading as="h2">{issue.title}</Heading>...</Box>{/*添加一個 Button 用于編輯*/}
+       <Box>
+         <Button>
+           <Pencil2Icon />
+           <Link href={`/issues/${issue.id}/edit`}>Edit Issue</Link>
+         </Button>
+       </Box></Grid>);};export default IssueDeatilPage;

Single Responsbility Principle?

本節(jié)代碼鏈接

Software entities should have a single responsibility

重構(gòu)?/app/issues/[id]/page.tsx?以應(yīng)用 SRP

  • page.tsx
  • IssueDetails.tsx
  • EditIssueButton.tsx
# /app/issues/[id]/page.tsximport prisma from "@/prisma/client";
import { Box, Grid } from "@radix-ui/themes";
import { notFound } from "next/navigation";
import EditIssueButton from "./EditIssueButton";
import IssueDetails from "./IssueDetails";interface Props {params: { id: string };
}
const IssueDeatilPage = async ({ params }: Props) => {const issue = await prisma.issue.findUnique({where: { id: parseInt(params.id) },});if (!issue) notFound();return (<Grid columns={{ initial: "1", md: "2" }} gap="5"><Box><IssueDetails issue={issue} /></Box><Box><EditIssueButton issueId={issue.id} /></Box></Grid>);
};
export default IssueDeatilPage;
# /app/issues/[id]/IssueDetails.tsximport { IssueStatusBadge } from "@/app/components";
import { Issue } from "@prisma/client";
import { Card, Flex, Heading, Text } from "@radix-ui/themes";
import ReactMarkdown from "react-markdown";const IssueDetails = ({ issue }: { issue: Issue }) => {return (<><Heading as="h2">{issue.title}</Heading><Flex gap="3" my="5"><IssueStatusBadge status={issue.status}></IssueStatusBadge><Text>{issue.createdAt.toDateString()}</Text></Flex><Card className="prose"><ReactMarkdown>{issue.description}</ReactMarkdown></Card></>);
};
export default IssueDetails;
# /app/issues/[id]/EditIssueButton.tsximport { Pencil2Icon } from "@radix-ui/react-icons";
import { Button } from "@radix-ui/themes";
import Link from "next/link";const EditIssueButton = ({ issueId }: { issueId: number }) => {return (<Button><Pencil2Icon /><Link href={`/issues/${issueId}/edit`}>Edit Issue</Link></Button>);
};
export default EditIssueButton;

修改 Issue?

頁面?

本節(jié)代碼鏈接

我們可以像這樣構(gòu)建文件結(jié)構(gòu),在?Issue?目錄下創(chuàng)建?_components?以放置該目錄下需要重復(fù)使用的組件,文件夾名前添加下劃線就可以把這個文件夾從路由中移除

└─issues│  IssueActions.tsx│  loading.tsx│  page.tsx│├─new│      loading.tsx│      page.tsx│├─[id]│  │  EditIssueButton.tsx│  │  IssueDetails.tsx│  │  loading.tsx│  │  page.tsx│  ││  └─Edit│          page.tsx│└─_componentsIssueForm.tsx

將之前的 new/page.tsx 封裝為一個組件,并添加一個可選參數(shù),以初始化

# /app/issues/_components/IssueForm.tsx...
+ import { Issue } from "@prisma/client";...// 添加一個可選參數(shù) issue 類型為之前 prisma 中的 Issue
- const IssueForm = () => {
+ const IssueForm = ({ issue }: { issue?: Issue }) => {...return (<div className="max-w-xl prose">...<TextField.Root><TextField.Input// 將該字段初始化為 issue.title (若傳入 issue)
+             defaultValue={issue?.title}placeholder="Title"{...register("title")}/></TextField.Root><ErrorMessage>{errors.title?.message}</ErrorMessage><Controller// 將該字段初始化為 issue.description (若傳入 issue)
+           defaultValue={issue?.description}name="description"control={control}render={({ field }) => (<SimpleMDE placeholder="Description" {...field} />)}/>...</div>);};export default IssueForm;

API?

本節(jié)代碼鏈接

# /app/api/issues/[id]/route.tsximport { issueSchema } from "@/app/validationSchema";
import { NextRequest, NextResponse } from "next/server";
import prisma from "@/prisma/client";export async function PATCH(request: NextRequest,{ params }: { params: { id: string } }
) {const body = await request.json();const validation = issueSchema.safeParse(body);if (!validation.success)return NextResponse.json(validation.error.format(), { status: 400 });const issue = await prisma.issue.findUnique({where: { id: parseInt(params.id) },});if (!issue)return NextResponse.json({ error: "Invalid Issue" }, { status: 404 });const updatedIssue = await prisma.issue.update({where: { id: issue.id },data: { title: body.title, description: body.description },});return NextResponse.json(updatedIssue, { status: 200 });
}

連接?

本節(jié)代碼鏈接

# /app/issues/_components/IssueForm.tsxconst IssueForm = ({ issue }: { issue?: Issue }) => {...return (...<formclassName="space-y-3"onSubmit={handleSubmit(async (data) => {try {setSubmitting(true);// 判斷是否傳入了 issue,若有傳入則是 Update,若無則是 new
+           if (issue) await axios.patch("/api/issues/" + issue.id, data);
-           await axios.post("/api/issues", data);
+           else await axios.post("/api/issues", data);router.push("/issues");} ...})}>...<Button disabled={isSubmitting}>
+         {issue ? "Update Issue" : "Submit New Issue"}{" "}{isSubmitting && <Spinner />}</Button></form>...);};export default IssueForm;

Caching?

本節(jié)代碼鏈接

NextJS Route Segment Config

  • Data Cache:
    • When we fetch data using fetch()
    • Stored in the file system
    • Permanent unitl we?redeploy
    • fetch(".",{cache: "no-store"})
    • fetch(".",{revalidata: 3600})
  • Full Route Cache
    • Used to store the output of statically renderd routes
  • Router Cache (Client-side Cache)
    • To store the payload of pages in browser
    • Lasts for a session
    • Gets refreshed when we reload

提升 Loading 體驗?

本節(jié)代碼鏈接

由于我們要在多個地方用到 IssueForm 的 Skeleton,我們可以將其封裝到一個組件里,然后在需要的地方調(diào)用。其次,對于靜態(tài)的頁面可以直接使用 loading.tsx,但是對于需要用到 dynamic 函數(shù)的頁面,應(yīng)該用另一種方法

  • IssueFormSkeleton.tsx
  • page.tsx
  • loading.tsx
# /app/issues/_components/IssueFormSkeleton.tsximport { Skeleton } from "@/app/components";
import { Box } from "@radix-ui/themes";const IssueFormSkeleton = () => {return (<Box className="max-w-xl"><Skeleton height="2rem" /><Skeleton height="20rem" /></Box>);
};
export default IssueFormSkeleton;
# /app/issues/[id]/edit/page.tsximport prisma from "@/prisma/client";
import dynamic from "next/dynamic";
import { notFound } from "next/navigation";
import IssueFormSkeleton from "./loading";const IssueForm = dynamic(() => import("@/app/issues/_components/IssueForm"), {ssr: false,loading: () => <IssueFormSkeleton />,
});interface Props {params: { id: string };
}const EditIssuePage = async ({ params }: Props) => {const issue = await prisma.issue.findUnique({where: { id: parseInt(params.id) },});if (!issue) notFound();return <IssueForm issue={issue} />;
};
export default EditIssuePage;
# /app/issues/[id]/edit/loading.tsximport IssueFormSkeleton from "@/app/issues/_components/IssueFormSkeleton";
export default IssueFormSkeleton;

CSDN 的排版/樣式可能有問題,去我的博客查看原文系列吧,覺得有用的話,給我的庫點個star,關(guān)注一下吧??

下一篇講刪除 Issue

下一篇【Next.js 項目實戰(zhàn)系列】05-刪除 Issue

http://aloenet.com.cn/news/31129.html

相關(guān)文章:

  • 陽江招聘網(wǎng)站哪個靠譜松原頭條新聞今日新聞最新
  • 廊坊網(wǎng)站建設(shè)技術(shù)外包百度平臺聯(lián)系方式
  • 網(wǎng)站頁腳信息網(wǎng)站播放視頻速度優(yōu)化
  • 電子商務(wù)網(wǎng)站建設(shè)預(yù)算微信公眾平臺開發(fā)
  • 公司網(wǎng)站購物平臺建設(shè)百度網(wǎng)盤網(wǎng)頁登錄入口
  • 網(wǎng)站a記錄的是做cname營銷方案怎么寫?
  • 免費的創(chuàng)建個人網(wǎng)站武漢大學人民醫(yī)院光谷院區(qū)
  • php做網(wǎng)站主要怎么布局百度明星人氣排行榜
  • 美容產(chǎn)品網(wǎng)站建設(shè)多少錢seo診斷網(wǎng)站
  • 手機h5頁面制作教程關(guān)鍵詞seo排名怎么選
  • 東京購物商城百度整站優(yōu)化
  • 技術(shù)支持 鄭州做網(wǎng)站企業(yè)網(wǎng)搭建
  • 旅游網(wǎng)站的導(dǎo)航怎么做陜西網(wǎng)站設(shè)計
  • 南寧網(wǎng)站建設(shè)醉懂網(wǎng)絡(luò)外鏈官網(wǎng)
  • 企業(yè)網(wǎng)站建設(shè)服務(wù)公司搜索引擎優(yōu)化工具
  • 北京建站推廣全網(wǎng)推廣公司
  • b2c網(wǎng)站怎么做google關(guān)鍵詞搜索技巧
  • 網(wǎng)站平臺免費游戲推廣員每天做什么
  • 學校網(wǎng)站建設(shè)調(diào)研報告天津疫情最新情況
  • 做網(wǎng)站平臺營銷網(wǎng)站建站公司
  • 哪些網(wǎng)站專門做細胞的好的搜索引擎推薦
  • wordpress評論框加游戲優(yōu)化大師官方下載
  • 中英網(wǎng)站開發(fā)青島官網(wǎng)seo方法
  • 網(wǎng)站測試頁面怎么做網(wǎng)站推廣途徑和推廣要點
  • 天津門戶網(wǎng)站開發(fā)國家免費技能培訓官網(wǎng)
  • 睢縣網(wǎng)站建設(shè)如何創(chuàng)建一個app平臺
  • 新公司注冊在哪個網(wǎng)站全國31省市疫情最新消息今天
  • 做網(wǎng)站用什么工具百度推廣四川成都地區(qū)服務(wù)中心
  • 做網(wǎng)站要學java嗎網(wǎng)站seo 工具
  • 新公司注冊工商核名系統(tǒng)網(wǎng)站優(yōu)化外包