Для Dynami c пример маршрутов posts/[id].js
getStaticPaths
необходимо определить список путей, чтобы nextjs
предварительно отображал все указанные пути во время сборки.
Функция getStaticPaths
необходимо вернуть объект со свойством paths
, которое представляет собой массив с параметрами маршрута и свойством fallback
, которое будет истинным или ложным. Если для fallback
установлено значение false для любого пути, который не возвращается из функции, getStaticPaths
не будет предварительно отрисован, что приведет к странице 404
.
Если вы знаете все пути, которые вы необходимо выполнить рендеринг заранее, вы можете установить fallback
в false. Вот пример ..
// getStaticPaths for /category/[slug] where slug can only be -
// either 'category-slug-1', 'category-slug-2' or 'category-slug-3'
export const getStaticPaths = async () => {
return {
paths: [
{ params: { slug: 'category-slug-1'} },
{ params: { slug: 'category-slug-2'} },
{ params: { slug: 'category-slug-3'} }
],
fallback: false // fallback is set to false because we already know the slugs ahead of time
}
}
Допустим, у вас есть маршрут /posts/[id].js
и идентификаторы, поступающие из базы данных, и новые сообщения создается каждый день. В этом случае вы можете вернуть уже существующие пути для предварительного рендеринга некоторых страниц. и установите fallback
на true
и по запросу следующий js будет обслуживать резервную версию страницы вместо отображения 404
страницы для путей, которые не возвращаются из функции getStaticPaths
, а затем в фоновом режиме , следующий js вызовет getStaticProps
для запрошенного пути и предоставит данные как JSON, которые будут использоваться для отображения страницы в браузере.
Вот пример:
export const getStaticPaths = async () => {
const posts = await // your database query or fetch to remote API
// generate the paths
const paths = posts.map(post =>
{
params: { id: post.id } // keep in mind if post.id is a number you need to stringify post.id
}
)
return {
paths,
fallback: true
}
}
PS - При использовании fallback
, установленного на true
, вам нужно отобразить какой-то запасной компонент в вашем NextPage
компоненте, иначе, когда вы попытаетесь получить доступ к данным из реквизита, он выдаст ошибку, например cannot read property ...x of undefined
Вы можете отобразить резервный вариант следующим образом:
// in your page component
import {useRouter} from 'next/router';
const router = useRouter()
if (router.isFallback) {
return <div>loading...</div>
}