当前位置: 首页 > news >正文

网站运营刚做时的工作内容seo推广方式是什么呢

网站运营刚做时的工作内容,seo推广方式是什么呢,做时时彩网站犯法吗,信誉好的徐州网站建设原文链接 CSDN 的排版/样式可能有问题,去我的博客查看原文系列吧,觉得有用的话,给我的库点个star,关注一下吧 上一篇【Next.js 项目实战系列】03-查看 Issue 修改 Issue 添加修改 Button​ 本节代码链接 安装 Radix UI 的 Ra…

原文链接

CSDN 的排版/样式可能有问题,去我的博客查看原文系列吧,觉得有用的话,给我的库点个star,关注一下吧 

上一篇【Next.js 项目实战系列】03-查看 Issue

修改 Issue

添加修改 Button​

本节代码链接

安装 Radix UI 的 Radix Ui Icons

npm i @radix-ui/react-icons
# /app/issues/[id]/page.tsx...const IssueDeatilPage = async ({ params }: Props) => {...return (// 添加一个 Grid 以分列显示,设置 initial 为 1,在移动设备为每页 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​

本节代码链接

Software entities should have a single responsibility

重构 /app/issues/[id]/page.tsx 以应用 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​

页面​

本节代码链接

我们可以像这样构建文件结构,在 Issue 目录下创建 _components 以放置该目录下需要重复使用的组件,文件夹名前添加下划线就可以把这个文件夹从路由中移除

└─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 封装为一个组件,并添加一个可选参数,以初始化

# /app/issues/_components/IssueForm.tsx...
+ import { Issue } from "@prisma/client";...// 添加一个可选参数 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​

本节代码链接

# /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 });
}

连接​

本节代码链接

# /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​

本节代码链接

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 体验​

本节代码链接

由于我们要在多个地方用到 IssueForm 的 Skeleton,我们可以将其封装到一个组件里,然后在需要的地方调用。其次,对于静态的页面可以直接使用 loading.tsx,但是对于需要用到 dynamic 函数的页面,应该用另一种方法

  • 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,关注一下吧  

下一篇讲删除 Issue

下一篇【Next.js 项目实战系列】05-删除 Issue

http://www.jinmujx.cn/news/109720.html

相关文章:

  • 网站建设说明书怎么推广网址
  • 武汉网站制作报价网络推广平台代理
  • wordpress 取消评论审核优化防疫措施
  • 动画做a视频在线观看网站鸿科经纬教网店运营推广
  • 二级院系网站建设情况互联网服务平台
  • 做销售在哪个网站找客户端大冶seo网站优化排名推荐
  • 青岛专业网站建设哪家好百度网址大全下载到桌面
  • 做物流行业网站的开发公司b站24小时自助下单平台网站
  • 建设高端网站需要多少钱关键词搜索优化公司
  • 哪个网站代做ppt便宜seo页面优化公司
  • wordpress 安装问题什么叫优化
  • 如何查找高权重网站googleseo优化
  • wordpress 个人照片北京网站优化培训
  • 最新网站架构网络广告策划书范文
  • 苏州工业园区图片新的seo网站优化排名 网站
  • wordpress主题中文seo是如何优化
  • 用帝国cms系统怎么做网站佛山seo外包平台
  • 网站建设财务怎么入账太原网络推广价格
  • 黄江镇网站建设百度统计app下载
  • 网站还建设 域名可以备案吗大数据智能营销
  • html5响应式网站模板营销软文代写
  • 购物网站开发uml图重庆seo优化公司
  • 如何给公司注册网站本周时事新闻概要10条
  • 用wordpress做外贸网站营销平台有哪些
  • 网站域名的选择方法百度查询关键词排名工具
  • 用phpcms建站的网站360推广登录入口官网
  • 创建网站需要哪些工作怎样做百度推广
  • 施工企业管理什么是seo关键词
  • 碗网站宁波网络营销有哪些
  • 建立网站大概需要多少钱网店推广常用的方法