Несколько компонентов vuejs 3 в монолитном проекте

Есть e-commerce проект на php symfony. Решил реализовать часть элементов (форма добавления товара, фильтры, корзина, страница оформления заказа) с помощью vuejs3, но не хочу переписывать весь проект под SPA. Использую для сборки webpack (Encore).

Сейчас реализован только компонент добавления товара в корзину со страницы товара. В нужном месте html-страницы товара, вставляется div и к нему монтируется приложение vuejs

<body>
<div class="menu"></div>
<div class="left-column">..</div>
<div class="right-column">
    ...
    <div id="vue-app"></div> <!-- Сюда монтируем vuejs -->
    ...
</div>
</body>

и в js

import { createApp } from "vue";
import BuyForm from 'BuyForm.vue'

createApp(BuyForm).mount('#vue-app');

А теперь я хочу чтобы на странице могло быть несколько компонентов vuejs, например корзина в шапке. И они взаимодействовали между собой (при необходимости).

У меня два варианта:

  1. Каким-то образом подсунуть html (который рендерит php) в некий корневой компонент (как <template> может быть) и затем добавлять в него другие компоненты, в те места которые мне надо (корзина, форма, фильтр) и т.д.)
<body>
<div id="app">                      <!-- Существующий html сохранить и примонтировать сюда корневой компонент vue -->
    <div class="menu">
        <cart-component />          <!-- Компонент с корзиной -->
    </div>
    <div class="left-column">..</div>
    <div class="right-column">
        ...
        <add-to-cart-component />    <!-- Компонент добавление товара в корзину -->
        ...
    </div>
</div>
</body>
  1. Создавать отдельные экземпляры приложений и монтировать их в свои div
<body>
<div>
    <div class="menu">
        <div id="vue-cart"></div>       <!-- Сюда монтируем Cart.vue -->
    </div>
    <div class="left-column">..</div>
    <div class="right-column">
        ...
        <div id="vue-buy-form"></div>   <!-- Сюда монтируем BuyForm.vue -->
        ...
    </div>
</div>

</body>

и в js

import { createApp } from "vue";
import BuyForm from 'BuyForm.vue'
import Cart from 'Cart.vue'

createApp(BuyForm).mount('#vue-buy-form');
createApp(Cart).mount('#vue-cart');

И взаимодействие между BuyForm и Cart реализовать через что-то "третье", например Vuex (не изучал еще, заработает ли это).

Подскажите в какую сторону лучше двигаться? Или может быть третий вариант =)


Ответы (0 шт):