Как сделать категории для товаров в Nuxt?

Для создания категорий для товаров в Nuxt.js можно использовать несколько подходов, в зависимости от требований и дизайна вашего проекта. Рассмотрим несколько возможных вариантов.

1. Использование роутинга:
Самым простым и распространенным способом является использование роутинга для создания категорий товаров. В зависимости от вашей структуры данных, вы можете определить маршруты для каждой категории товаров. Например, если у вас есть категории "Одежда", "Обувь" и "Аксессуары", то в вашем файле nuxt.config.js можно добавить следующую конфигурацию:

   export default {
     // ...
     router: {
       extendRoutes(routes, resolve) {
         routes.push(
           {
             name: 'category-clothing',
             path: '/category/clothing',
             component: resolve(__dirname, 'pages/category/clothing.vue')
           },
           {
             name: 'category-shoes',
             path: '/category/shoes',
             component: resolve(__dirname, 'pages/category/shoes.vue')
           },
           {
             name: 'category-accessories',
             path: '/category/accessories',
             component: resolve(__dirname, 'pages/category/accessories.vue')
           }
         )
       }
     }
     // ...
   }

В этом примере мы добавляем три новых маршрута для каждой категории товаров. Каждый маршрут указывает на соответствующий файл компонента, который будет отображаться при переходе по данному маршруту.

Затем в соответствующих компонентах (clothing.vue, shoes.vue, accessories.vue) вы можете отображать список товаров из соответствующей категории, подставляя данные в шаблон страницы.

2. Использование динамических параметров в маршрутах:
Второй вариант - использование динамических параметров в маршрутах. В этом случае, вам необязательно указывать каждую категорию товаров вручную, вы можете определить общий маршрут /category/:categoryId, где categoryId будет параметром, передаваемым в компонент. Например:

   export default {
     // ...
     router: {
       extendRoutes(routes, resolve) {
         routes.push(
           {
             name: 'category',
             path: '/category/:categoryId',
             component: resolve(__dirname, 'pages/category.vue')
           }
         )
       }
     }
     // ...
   }

В этом случае компонент category.vue будет отображаться для любой категории товаров, и categoryId будет доступен в компоненте через this.$route.params.categoryId. Вы можете использовать его для загрузки и отображения соответствующих товаров.

Этот подход более гибкий, так как позволяет добавлять и удалять категории товаров динамически без необходимости изменения конфигурации роутера.

3. Использование компонентов и фильтров:
Третий вариант заключается в создании набора компонентов и фильтров для фильтрации и отображения товаров по категориям. Вы можете создать компонент CategoryFilter.vue, который будет отображать список категорий и реагировать на выбор пользователя. Например:

   <template>
     <ul>
       <li v-for="category in categories" :key="category.id" @click="selectCategory(category.id)">
         {{ category.name }}
       </li>
     </ul>
   </template>
   
   <script>
   export default {
     data() {
       return {
         categories: [
           { id: 1, name: 'Одежда' },
           { id: 2, name: 'Обувь' },
           { id: 3, name: 'Аксессуары' }
         ],
         selectedCategory: null
       }
     },
     methods: {
       selectCategory(categoryId) {
         this.selectedCategory = categoryId;
       }
     }
   }
   </script>

Затем вы можете создать компонент ProductList.vue, который будет принимать выбранную категорию и отображать соответствующие товары:

   <template>
     <div>
       <h2>Товары в категории {{ selectedCategory }}</h2>
       <ul>
         <li v-for="product in filteredProducts" :key="product.id">
           {{ product.name }}
         </li>
       </ul>
     </div>
   </template>
   
   <script>
   export default {
     props: {
       selectedCategory: {
         type: Number,
         required: true
       }
     },
     computed: {
       filteredProducts() {
         return this.products.filter(product => product.categoryId === this.selectedCategory);
       }
     }
   }
   </script>

В данном примере products представляет массив объектов с информацией о товарах, categoryId - это атрибут, указывающий категорию товара, и filteredProducts - это вычисляемое свойство, фильтрующее товары по выбранной категории.

Наконец, в главном компоненте вы можете использовать CategoryFilter и ProductList вместе для отображения списка категорий и соответствующих товаров:

   <template>
     <div>
       <category-filter @select-category="selectedCategory = $event" />
       <product-list :selected-category="selectedCategory" />
     </div>
   </template>
   
   <script>
   import CategoryFilter from '@/components/CategoryFilter.vue';
   import ProductList from '@/components/ProductList.vue';
   
   export default {
     components: {
       CategoryFilter,
       ProductList
     },
     data() {
       return {
         selectedCategory: null
       }
     }
   }
   </script>

В данном примере при выборе категории в CategoryFilter событие select-category будет передаваться в главный компонент, где selectedCategory будет обновлено, и затем это значение будет передано в ProductList в качестве пропса selected-category, что приведет к фильтрации и отображению соответствующих товаров.

Все эти подходы могут быть адаптированы и расширены в соответствии с требованиями вашего проекта. Выбор конкретного подхода будет зависеть от вашей архитектуры данных и дизайна пользовательского интерфейса.