Єдине сховище даних для Vue-компонентів на сторінках 1С-Бітрікс

Єдине сховище даних для Vue-компонентів на сторінках 1С-Бітрікс ### Коли на бітріксовій сторінці працюють два і більше Vue-компоненти, які повинні бачити спільні дані — стан кошика, поточний користувач, фільтри каталогу — потрібен єдиний стор? Без нього кожен компонент робить окремий AJAX-запи
Послуги, які ми пропонуємо
Показано 1 з 1Усі 1626 послуг
Єдине сховище даних для Vue-компонентів на сторінках 1С-Бітрікс
Простий
~1 день

Наші компетенції:

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1454
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Розробка веб-сайту для компанії ФІКСПЕР
    1017
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    760
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    879
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    803
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    1162

Єдине сховище даних для Vue-компонентів на сторінках 1С-Бітрікс

Коли на бітріксовій сторінці працюють два і більше Vue-компоненти, які повинні бачити спільні дані — стан кошика, поточний користувач, фільтри каталогу — потрібен єдиний стор?

Без нього кожен компонент робить окремий AJAX-запит до того самого ендпоінта. При 5+ компонентах кількість запитів зростає в геометричній прогресії: для типового каталогу з 10 000 товарів кожен компонент робить по 3 запити, разом 15 запитів тільки на завантаження. Дані розсинхронізуються, додавання товару до кошика в одному компоненті не оновлює лічильник у хедері. Такі проблеми швидко накопичуються. Ми займаємося цим більше 5 років — понад 60 проектів на Бітріксі. Вирішуємо грамотною архітектурою стору. Використовуємо PHP 8.1+, інфоблоки v2.0, ORM та сучасний frontend на Vue 3 з Pinia. Отримайте консультацію з архітектури стору для вашого проекту.

Чому Pinia — вибір для нових проектів на Vue 3?

Для нових проектів на Vue 3 — Pinia. Vuex 4 підтримується, але офіційно замінений Pinia. Ключові відмінності в контексті Бітрікса:

Критерій Pinia Vuex
Мутації Не потрібні — пряма зміна state Обов'язкові через mutations
TypeScript Відмінна підтримка, типи виводяться Потрібна ручна типізація
DevTools З коробки, повна інтеграція Через плагін, гірше працює з Vue 3
Бойлерплейт Мінімум: defineStore + actions Більше коду: state, getters, mutations, actions
Розмір ~1 KB ~9 KB
Підтримка Composition API Так Обмежена
Підтримка SSR Так Так, але складніше

Pinia швидше за Vuex у 9 разів за розміром бандла (1 KB vs 9 KB), що прискорює початкове завантаження сторінки. Vuex виправданий, якщо проект вже на Vue 2 з Vuex 3, або якщо команда добре знає Vuex і міграція недоцільна. В інших випадках Pinia знижує час розробки на 20-30%. Офіційна документація Vuex підтверджує, що Pinia — рекомендоване рішення для нових проектів.

Як ініціалізувати Pinia для кількох Vue-додатків на одній сторінці?

Коли кілька Vue-додатків монтуються на різні елементи сторінки (кошик у хедері та блок товару внизу — різні createApp()), вони не розділяють стор автоматично?

Рішення — singleton через window:

// store/index.js import { createPinia } from 'pinia'; const pinia = window.__pinia || (window.__pinia = createPinia()); export default pinia; // В кожному app.js import pinia from './store/index.js'; const app = createApp(Component); app.use(pinia); app.mount('#mount-point'); 

Обидва Vue-додатки використовують один і той самий екземпляр Pinia — стан кошика синхронний. Гарантуємо, що цей підхід працює навіть при 10+ одночасних компонентах на сторінці.

Реалізація стору кошика

// stores/cart.js import { defineStore } from 'pinia'; export const useCartStore = defineStore('cart', { state: () => ({ items: [], loading: false, initialized: false, }), getters: { totalCount: (state) => state.items.reduce((sum, i) => sum + i.quantity, 0), totalPrice: (state) => state.items.reduce((sum, i) => sum + i.price * i.quantity, 0), }, actions: { async init() { if (this.initialized) return; this.loading = true; const res = await fetch('/api/v1/cart/'); this.items = await res.json(); this.initialized = true; this.loading = false; }, async addItem(productId, quantity = 1) { const res = await fetch('/api/v1/cart/add/', { method: 'POST', headers: { 'X-Bitrix-Csrf-Token': window.BX_STATE.csrf }, body: JSON.stringify({ productId, quantity }), }); const updated = await res.json(); this.items = updated.items; }, }, }); 
Докладніше про CSRF-токен Кастомний контролер на стороні Бітрікса звертається до `\Bitrix\Sale\Basket::loadItemsForFUser()` і повертає JSON. CSRF-токен (`bitrix_sessid()`) передається з PHP у `window.BX_STATE.csrf`. Докладніше про CSRF в офіційній документації.

Стор користувача з даними з PHP

export const useUserStore = defineStore('user', { state: () => ({ id: window.BX_STATE?.userId || null, groups: window.BX_STATE?.userGroups || [], priceTypeId: window.BX_STATE?.priceTypeId || 1, }), getters: { isAuthorized: (state) => !!state.id, isWholesale: (state) => state.groups.includes(WHOLESALE_GROUP_ID), }, }); 

Дані користувача ініціалізуються з window.BX_STATE, який формується в PHP один раз при завантаженні сторінки. Жодних AJAX-запитів для отримання базової інформації про користувача — це прискорює завантаження на 100-200 мс.

Персистентність стану

Для даних, які потрібно зберігати між сторінками (наприклад, вибрані фільтри каталогу), використовуємо pinia-plugin-persistedstate:

pinia.use(piniaPluginPersistedstate); export const useFiltersStore = defineStore('filters', { state: () => ({ selectedBrands: [], priceRange: [0, 100000] }), persist: { storage: sessionStorage }, }); 

sessionStorage краще за localStorage для фільтрів — дані скидаються при закритті вкладки, не накопичуються застарілі значення. При роботі з каталогами в 5000+ товарів це критично.

Девтулзи та налагодження

Для налагодження Pinia стору використовуйте Vue DevTools — розширення браузера, яке показує стан усіх сторів у реальному часі. На production-збірці DevTools автоматично вимикаються. Також можна логувати мутації через $subscribe — це допомагає в складних сценаріях оновлення. Wikipedia детально описує можливості Vue DevTools для налагодження сторів.

Сценарії використання стору в інтернет-магазині

Сценарій Без стору Зі стором
Завантаження кошика 3-5 запитів на сторінку 1 запит, кешування
Оновлення лічильника Потрібна ручна подія Автоматичне через гетери
Фільтрація каталогу Перезавантаження сторінки Миттєвий відгук
Дані користувача AJAX на кожен компонент Один раз з PHP

Що входить у налаштування стору

Ми пропонуємо повний цикл робіт:

  • Аналіз поточної архітектури та виявлення вузьких місць
  • Проектування структури сторів (кошик, користувач, фільтри, сповіщення)
  • Реалізація singleton для кількох Vue-додатків
  • Інтеграція з PHP-контролерами Бітрікса (Basket API, дані користувача)
  • Налаштування персистентності для фільтрів та обраного
  • Покриття коду типами (TypeScript) для надійності
  • Тестування на реальних сценаріях (додавання до кошика, зміна користувача)
  • Документація з API сторів та передача доступів

Вартість і терміни

Типовий термін налаштування: для проекту без існуючого стору, з 2-3 компонентами, яким потрібні спільні дані (кошик, авторизація, сповіщення) — 1-2 робочі дні, включаючи налаштування персистентності та інтеграцію з PHP-контролерами Бітрікса. Вартість налаштування розраховується індивідуально залежно від складності. Більш складні сценарії (каталог з фільтрацією, багаторівневі права доступу) потребують індивідуальної оцінки.

Замовте налаштування стору — отримайте консультацію з архітектури для вашого проекту. Залиште заявку, і ми підберемо стек та налаштуємо єдиний стор за 1-2 дні. Досвід понад 5 років, гарантія на всі роботи. Зв'яжіться з нами для уточнення деталей вашого проекту.