Как создать динамический маршрут в gatsby

Я настроил проект gatsby, используя этот связь. Он работает правильно.

Теперь я знаю, как создать маршрут, определив компонент внутри папки pages. Но теперь у меня есть новая задача, мне нужно создать один динамический маршрут, чтобы я мог передать в нем свой id (прямо как reactjs).

<Route path: "/path/:id"/>

Как это сделать в гэтсби?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
26
0
18 374
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вы должны явно указать Гэтсби, что путь должен быть динамическим. Из документы:

// gatsby-node.js
// Implement the Gatsby API “onCreatePage”. This is
// called after every page is created.
exports.onCreatePage = async ({ page, actions }) => {
  const { createPage } = actions

  // page.matchPath is a special key that's used for matching pages
  // only on the client.
  if (page.path.match(/^/app/)) {
    page.matchPath = "/app/*"

    // Update the page.
    createPage(page)
  }
}

а затем вы можете использовать динамическую маршрутизацию в src/pages/app.js

import { Router } from "@reach/router"

const SomeSubPage = props => {
  return <div>Hi from SubPage with id: {props.id}</div>
}

const App = () => (
  <Layout>
    <Link to = "/app/1">First item</Link>{" "}
    <Link to = "/app/2">Second item</Link>{" "}

    <Router>
      // ...dynamic routes here
      <SomeSubPage path = "/app/:id" />
    </Router>
  </Layout>
)

export default App

Все, что идет к /app/*, теперь будет обрабатываться динамически. Вы должны найти свой идентификатор, как обычно, в реквизитах.

Взгляните на их пример аутентификации https://github.com/gatsbyjs/gatsby/tree/master/examples/simple-auth

Спасибо большое. Могу ли я удалить /app из моего маршрута?

Profer 19.04.2019 09:33

Да, конечно! Настройте конфигурацию в gatsby-node.js (page.path.match(...))

wiesson 19.04.2019 09:35

Я пробовал это. Но не знаю, как удалить /app и поставить только /. Не могли бы вы направить меня

Profer 19.04.2019 10:11

По моему скромному мнению, Гэтсби должен работать не так. Если вам нужна полностью динамическая страница, взгляните на create-react-app. Gatsby — это генератор статических сайтов, который генерирует страницы из статического контента. Он может обрабатывать динамический контент, но, если вы спросите меня, это не основная цель.

wiesson 19.04.2019 10:13

Gatsby — это больше, чем генератор статических сайтов, вы можете создавать приложения с его помощью так же, как вы делали это с CRA.

Smakosh 01.10.2019 13:30

Эй, у вас есть какой-нибудь репозиторий GitHub, чтобы просто узнать, как добавить внешние файлы CSS и js в проект gatsby?

sushildlh 21.03.2020 14:35

можно ли использовать параметры в createPage? например: createPage({путь: "/blog/:blogId/:slug", matchPath: "/blog/:blogId/:slug", компонент: path.resolve("src/components/layouts/BlogLayout.jsx"), })

Md Abdul Halim Rafi 23.05.2020 06:10

Не нужно трогать gatsby-node.js вообще. Просто нужно добавить файл с квадратными скобками в папку pages. Например, пользователи/[id].js.

Operator 07.11.2021 15:19

Вы можете использовать gatsby-plugin-create-client-paths. Он использует matchPath. Для получения дополнительной информации проверьте

  1. https://www.gatsbyjs.org/docs/gatsby-internals-terminology/#matchpath
  2. https://www.gatsbyjs.org/packages/gatsby-plugin-create-client-paths/

не совсем, я не думаю, что это дает гибкость динамических путей, просто упрощает добавление новых. См.: «Используйте этот плагин, чтобы упростить создание «гибридного» приложения Gatsby как со статически отображаемыми страницами, так и с «клиентскими путями».»

Alejandro Moreno 06.01.2020 18:28

Вы можете использовать квадратные скобки ([ ]) в пути к файлу, чтобы отметить любые динамические сегменты URL-адреса. Например, чтобы отредактировать пользователя, вам может понадобиться такой маршрут, как /user/:id, чтобы получить данные для любого идентификатора, переданного в URL-адрес.

src/pages/users/[id].js сгенерирует маршрут типа /users/:idsrc/pages/users/[id]/group/[groupId].js сгенерирует маршрут типа /users/:id/group/:groupId

Ссылка: https://www.gatsbyjs.com/docs/reference/routing/file-system-route-api#creating-client-only-routes

Почему это не принятый ответ?

Operator 07.11.2021 15:30

Этот ответ очень поздний, но для тех, кто в будущем столкнется с этой проблемой, у меня есть более простое решение.

В терминах Гэтсби это называется Сплат Маршрут.

Например, если вам нужна какая-то страница «domain.com/profile/[id]», где id может быть любым числом, которое будет использоваться для отображения различных данных внутри веб-сайта, вы должны назвать свою страницу как [...id ].

Теперь внутри страницы вы можете получить доступ к этому идентификатору как

const ProfilePage = (props) => <div>This page is for id number {props.params.id}</div>

Примечание: не пропустите 3 точки, это то, что означает splat-маршрут в gatsby.

Другие вопросы по теме