React Router DOM — использование только одного параметра в структуре URL

У меня есть приложение для электронной коммерции, в котором я пытаюсь структурировать URL-адрес, чтобы он принимал только один параметр -

<Route path = {process.env.PUBLIC_URL + "/:value"} component = {ShopProducts} />

Это значение может быть либо категорией, такой как «костюмы», либо подкатегорией, такой как «блейзеры», «брюки» и т. д.

В моей текущей структуре мой маршрут выглядит так:

<Route path = {process.env.PUBLIC_URL + "/:category/:sub-category"} component = {ShopProducts} />

И в моем компоненте ShopProducts я отправляю эти два параметра URL как одно ключевое слово для фильтрации продуктов. Например, если путь «/suits/blazers», в компоненте они становятся строкой запроса. ?category = "suits"&sub-category = "blazers" и, таким образом, он отправляет запрос GET, фильтруя продукты в конечной точке с помощью запроса.

Теперь моя проблема заключается в том, что если я заставлю маршрут принимать только один параметр, то есть подкатегорию, у меня не будет параметра категории для создания строки запроса. Например, если путь «/blazers», строка запроса будет выглядеть так: ?category=&sub-category = "blazers" и поэтому фильтрация не работает.

Вот как выглядят данные в моей конечной точке:

{
"id": 1,
"name": "Suits",
"slug": "suits",
"parent": null,
"sub_category": [
    {
        "id": 5,
        "name": "Blazers",
        "slug": "blazers",
        "parent": 1,
    },
    {
        "id": 6,
        "name": "Pants",
        "slug": "pants",
        "parent": 1,
    },
]

Я попытался сделать это с помощью функции onClick, которая сохраняет родительскую категорию в Redux, а затем фильтрует с использованием подкатегории, однако это решение не масштабируется, и если кто-то пытается получить доступ к URL-адресу напрямую (без onClick), он не не работает.

Как изменить маршрут, чтобы он принимал только одно значение, то есть подкатегорию, и через нее получал доступ к категории?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы можете взять параметр подкатегории и найти данные для родителя и получить основную категорию.

const getCategory = (data, subCategory) =>
  data.find((category) =>
    category.sub_category.some(
      (subCat) => subCat.slug.toLowerCase() === subCategory.toLowerCase()
    )
  )?.slug;

const data = [
  {
    id: 1,
    name: "Suits",
    slug: "suits",
    parent: null,
    sub_category: [
      {
        id: 5,
        name: "Blazers",
        slug: "blazers",
        parent: 1
      },
      {
        id: 6,
        name: "Pants",
        slug: "pants",
        parent: 1
      }
    ]
  },
  {
    id: 2,
    name: "Costumes",
    slug: "costumes",
    parent: null,
    sub_category: [
      {
        id: 3,
        name: "Clown",
        slug: "clown",
        parent: 2
      },
      {
        id: 4,
        name: "Police",
        slug: "police",
        parent: 2
      }
    ]
  }
];

const getCategory = (data, subCategory) =>
  data.find((category) =>
    category.sub_category.some(
      (subCat) => subCat.slug.toLowerCase() === subCategory.toLowerCase()
    )
  )?.slug;

console.info("blazers", getCategory(data, "blazers")); // blazers suits
console.info("pants", getCategory(data, "pants")); // pants suits
console.info("shoes", getCategory(data, "shoes")); // shoes undefined
console.info("police", getCategory(data, "police")); // police costumes
console.info("clown", getCategory(data, "clown")); // clown costumes

Теперь по заданному маршруту

<Route path = {`${process.env.PUBLIC_URL}/:subCategory`} component = {ShopProducts} />

компонент ShopProducts считывает параметр пути маршрута subCategory и вычисляет основной category.

const ShopProducts = () => {
  const { subCategory } = useParams();
  const category = getCategory(data, subCategory);

  ...
};

Спасибо! Я думаю, что этот ответ сработает. Тем не менее, я столкнулся с одной небольшой проблемой при его реализации, я поставил getCategory(), и он работает, но категория отображается как неопределенная при загрузке страницы - ?category=undefined&sub-category = "blazers". Если я изменю запрос только на ?sub-category = "blazers", а затем запишу в консоль getCategory(), тогда он сможет найти категорию. Как мне управлять тем, что при загрузке страницы он может найти категорию?

tav 21.01.2023 15:58

@tav Array.prototype.find возвращает undefined, если в искомом массиве не найдены совпадающие данные. Где вы объявляете данные поиска вашей категории?

Drew Reese 22.01.2023 00:47

Я разобрался в чем проблема, спасибо! Это была проблема с тернарными операторами.

tav 22.01.2023 08:27

@tav Хорошо, рад, что теперь это работает на тебя. Здоровья и удачи!

Drew Reese 22.01.2023 08:30

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