如何在使用NextJS中的链接导航时将唯一ID发送到下一页

ohtdti5x  于 2022-10-15  发布在  React
关注(0)|答案(2)|浏览(136)

当用户导航时,我尝试将id发送到下一页。
我有一个主页,在那里我正在获取一个数据数组,并使用.map在一种基于卡片的UI中显示它。
现在,当用户单击卡时,他们将被导航到显示该卡的详细信息的下一页。
假设主页在这里-localhost:3000
用户点击ID为234的卡片
它们将导航到下一页,如下所示:
下一页为as-localhost:3000/user/234
现在,我想显示ID为234的那张卡的信息。为此,我确实需要发出FETCH请求,例如FETCH(https://userdatabase/234)
上面的234肯定是一个动态id,我怎么才能让这个fetch请求在每次点击新卡时都知道要更改这个id?或者换句话说,这个页面是如何“知道”卡的ID的?
现在,我正在使用一种变通办法,如下所示:
1.当用户在第二页时,URL如下:localhost:3000/user/386
1.在NextJS中使用useRouter获取此id,如下所示:

import {useRouter} from 'next/router'
`const router = useRouter()`

fetch(`localhost:3000/user/${router?.query?.user})

我知道从URL获取id并进行新的任务根本不理想,这会导致第二页出现陈旧的缓存问题。
我如何以更好的方式解决这个问题?
非常感谢你的阅读。

h6my8fg2

h6my8fg21#

您需要创建一个动态路由:Next.js Docs
针对您的情况,创建一个文件pages/user/[id].js

1.客户端

使用此代码片断访问ID:

import { useRouter } from 'next/router'

const Component = () => {
  const router = useRouter()
  const { id } = router.query

  return <p>{id}</p>
}

export default Component

2.服务器端

您可以使用data fetching functions中的任何一个
用于SSR的代码片段:

export async function getServerSideProps({ params }) {

  const { id } = params
  // fetch data from database with id

  return {
    props: {},  // will be passed to the page component as props
  }
}

有关作为上下文传递给数据获取函数的内容的更多信息:上下文参数

wsewodh2

wsewodh22#

id添加到useEffect()的依赖项数组中。大致是这样的:

import { useState, useEffect } from "react";
import { useRouter } from 'next/router';

function Page() {
  const router = useRouter();
  const [page, changePage] = useState();
  // `query` can only be fully parsed client-side
  // so `isReady` flag is needed 
  const { query, isReady } = router;
  const { id } = query;
  // also need to parse the query value to undefined or string
  const parsedID = id === undefined
    ? undefined
    : Array.isArray(id)
    ? id[0]
    : id;

  useEffect(() => {
    // refuse to run the effect if query is not ready
    // or ID is undefined
    if (!isReady || !parsedID ) {
      return;
    }

    // this looks ugly
    // but pure promise syntax is even uglier
    // and `useEffect()` doesn't accept async functions
    (async () => {
      // errors are assumed to be handled in the `_app` component
      // so no error-handling logic here
      const response = await fetch(`localhost:3000/user/${parsedID}`);
      const newPage = await response.json();
      changePage(newPage);
    })()

  }, [isReady, parsedID]);

  return (
    <>
      {!page
        // show loading placeholder until the page is fetched
        ? <div>Loading...</div>
        // pass the `page` value to whatever component you need
        : ...
      }
    </>
  )
}

export default Page;

相关问题