E-commerce платформа требует структурированного подхода к организации компонентов, состояния приложения и маршрутизации. Основу приложения составляет Vue.js, который обеспечивает реактивность и компонентный подход, позволяя строить масштабируемый фронтенд.
Компоненты в Vue делятся на представленческие и контейнерные. Представленческие компоненты отвечают за отображение данных, не управляя бизнес-логикой, тогда как контейнерные компоненты обрабатывают состояние, делают запросы к API и управляют дочерними компонентами.
Пример структуры каталогов:
src/
├─ components/
│ ├─ ProductCard.vue
│ ├─ CartItem.vue
│ └─ NavigationBar.vue
├─ views/
│ ├─ Home.vue
│ ├─ ProductPage.vue
│ └─ Cart.vue
├─ store/
│ └─ index.js
├─ router/
│ └─ index.js
└─ services/
└─ api.js
Для управления глобальным состоянием используется Vuex, что особенно важно для корзины покупок и состояния пользователя. Vuex позволяет централизовать данные, что упрощает синхронизацию состояния между компонентами.
Пример структуры Vuex-модуля для корзины:
export const cartModule = {
state: () => ({
items: [],
totalPrice: 0
}),
mutations: {
addItem(state, product) {
const existing = state.items.find(item => item.id === product.id);
if (existing) {
existing.quantity += 1;
} else {
state.items.push({ ...product, quantity: 1 });
}
state.totalPrice += product.price;
},
removeItem(state, productId) {
const index = state.items.findIndex(item => item.id === productId);
if (index !== -1) {
state.totalPrice -= state.items[index].price * state.items[index].quantity;
state.items.splice(index, 1);
}
}
},
getters: {
itemCount: state => state.items.reduce((sum, item) => sum + item.quantity, 0),
totalPrice: state => state.totalPrice
}
};
Для многостраничной структуры используется Vue
Router. Каждая страница — отдельный компонент в папке
views, маршруты связывают URL с компонентами:
import { createRouter, createWebHistory } from 'vue-router';
import Home from '../views/Home.vue';
import ProductPage from '../views/ProductPage.vue';
import Cart from '../views/Cart.vue';
const routes = [
{ path: '/', component: Home },
{ path: '/product/:id', component: ProductPage, props: true },
{ path: '/cart', component: Cart }
];
export const router = createRouter({
history: createWebHistory(),
routes
});
Маршруты с параметрами позволяют динамически подгружать информацию о товарах. Для защиты приватных страниц (например, страницы оплаты) используется навигационный guard:
router.beforeEach((to, from, next) => {
const isAuthenticated = false; // пример проверки
if (to.meta.requiresAuth && !isAuthenticated) {
next('/');
} else {
next();
}
});
Для получения данных о товарах и заказах создается слой сервиса. Это обеспечивает разделение логики и упрощает тестирование.
import axios from 'axios';
const apiClient = axios.create({
baseURL: 'https://api.example.com',
headers: {
'Content-Type': 'application/json'
}
});
export const getProducts = () => apiClient.get('/products');
export const getProductById = id => apiClient.get(`/products/${id}`);
export const createOrder = orderData => apiClient.post('/orders', orderData);
Асинхронные вызовы интегрируются с компонентами через
async/await и реактивные свойства:
export default {
data() {
return {
products: [],
loading: true
};
},
async created() {
try {
const response = await getProducts();
this.products = response.data;
} finally {
this.loading = false;
}
}
};
Для каталога товаров используется v-for с ключами, а
также условные директивы v-if для состояния загрузки и
ошибок:
<div v-if="loading">Загрузка...</div>
<div v-else>
<ProductCard v-for="product in products" :key="product.id" :product="product"/>
</div>
Формы заказа и добавление товаров в корзину используют
v-model для двусторонней привязки данных:
<input type="number" v-model.number="quantity" min="1"/>
<button @click="addToCart(product, quantity)">В корзину</button>
Метод addToCart взаимодействует с Vuex-модулем, обновляя
глобальное состояние.
Для крупных платформ важна оптимизация:
const ProductPage = () => import('../views/ProductPage.vue');
Для реализации оплаты и уведомлений создаются отдельные сервисы:
Unit-тесты пишутся с использованием Vue Test Utils и Jest. Основные цели:
Пример теста для ProductCard:
import { mount } from '@vue/test-utils';
import ProductCard from '@/components/ProductCard.vue';
test('отображает название и цену', () => {
const product = { id: 1, name: 'Товар', price: 100 };
const wrapper = mount(ProductCard, { props: { product } });
expect(wrapper.text()).toContain('Товар');
expect(wrapper.text()).toContain('100');
});
Использование Vue.js в E-commerce позволяет создавать динамичные, отзывчивые и масштабируемые приложения. Комбинация компонентной структуры, Vuex, Vue Router и слоя сервисов обеспечивает удобство разработки и поддержку крупных проектов. Эффективная архитектура, продуманная маршрутизация и управление состоянием являются ключевыми элементами для успешного функционирования платформы.