Динамическая маршрутизация в Next.js 13

У меня есть простая настройка для динамической маршрутизации с использованием Next 13. Вот мои настройки файла. У меня также есть компонент с массивом объектов. Моя цель — сопоставить массив и показать динамические данные на странице [slug] page.jsx. Aka /lion должен показывать данные для льва.

Мой вопрос: как получить правильный параметр или идентификатор для отображения правильных данных на динамическом маршруте?

//Within the [slug] page.jsx

{animals.map((animal, index) => (
    <div key = {index}>
      <Link href = {animal.Link}>
      <p>Name: {animal.Name}</p>
      <p>Info: {animal.Info}</p>
      </Link>
    </div>
  ))}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
50
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

В Next.js 13 динамическая маршрутизация немного отличается от предыдущих версий. Вместо использования подхода маршрутизации на основе файлов Next.js 13 представил новый способ обработки динамических маршрутов с использованием модулей next/link и next/router.

    import { useRouter } from 'next/router';
import Link from 'next/link';

const SlugPage = () => {
  const router = useRouter();
  const { slug } = router.query; // Access the slug parameter from the router

  // Assuming you have an array of animals
  const animals = [
    { Name: 'Lion', Info: 'The king of the jungle', Link: '/lion' },
    { Name: 'Tiger', Info: 'A majestic big cat', Link: '/tiger' },
    // Other animal objects
  ];

  // Filter the array based on the current slug
  const filteredAnimals = animals.filter(
    (animal) => animal.Link === `/${slug}`
  );

  return (
    <div>
      {filteredAnimals.map((animal, index) => (
        <div key = {index}>
          <Link href = {animal.Link}>
            <a>
              <p>Name: {animal.Name}</p>
              <p>Info: {animal.Info}</p>
            </a>
          </Link>
        </div>
      ))}
    </div>
  );
};

export default SlugPage;

Большое спасибо, что нашли время, чтобы помочь. Кажется, в Next 13 все немного изменилось. Я получаю эту ошибку: у вас есть серверный компонент, который импортирует next/router. Вместо этого используйте следующий/навигация.

AndrewLeonardi 07.07.2023 22:52

Я обновил код в соответствии с Next 13, дайте мне знать, сработало это или нет.

Chandan 08.07.2023 06:21

С помощью Next 13 вы можете получить параметры с помощью крючка useSearchParams, предоставленного рядом, для поиска по параметрам.

useSearchParams — это хук клиентского компонента, который позволяет вам прочитать строку запроса текущего URL.
useSearchParams возвращает доступную только для чтения версию URLSearchParams inter

пример:

'use client'

import { useSearchParams } from 'next/navigation'
 
export default function SearchBar() {
  const searchParams = useSearchParams()
 
  const search = searchParams.get('search')
 
  // URL -> `/dashboard?search=my-project`
  // `search` -> 'my-project'
  return <>Search: {search}</>
}

Обратите внимание, что useSearchParams — это хук клиентского компонента, поэтому вы должны быть в контексте клиентского компонента, который вам может понадобиться включить 'use client' в начало вашего файла.

Большое спасибо! Основная причина, по которой я работаю с Next.js, заключается в его преимуществах SEO. Можно ли добиться этого без использования «использовать клиент»?

AndrewLeonardi 09.07.2023 17:48

это не противоречит преимуществам SEO, некоторые компоненты должны работать на стороне клиента, если вы хотите использовать хуки, которые вы хотите просто получать данные на сервере.

Hatana 09.07.2023 17:55

@AndrewLeonardi, так как вы хотите показывать ссылки с помощью <Link>, вы должны быть в контексте клиентского компонента.

Hatana 09.07.2023 17:57
Ответ принят как подходящий

Я смог решить это. В приведенном ниже коде метод find ищет объект животного, где свойство Link соответствует значению /animals/${params.slug}.

Вот пример объекта в массиве:

  {
    "Name": "Lion",
    "Info": "Lions live to be 15 years old.",
    "Link": "/animals/lion"
  },

И вот как я динамически нахожу животное:

import { animals } from '@/components/AnimalData';
    
    export default function Animals({ params }) {
      const animal = animals.find(animal => animal.Link === `/animals/${params.slug}`);
    
      return (
        <div>
          {animal ? (
            <div>
              <p>Animal: {animal.Name}</p>
              <p>Info: {animal.Info}</p>
            </div>
          ) : (
            <p>Animal not found</p>
          )}
        </div>
      );
    }

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