Роутинг нескольких страниц на Vue-Router 4

Проблема с настройкой роутинга по страницам в vue-router, в layout есть 3 секции (Левый Sidebar, Основное содержимое, Правый Sidebar). И их содержимое должно зависеть от url по шаблону /{Основная страница} или /{Основная страница}/{Правый Sidebar} или /{Правый Sidebar}

например:

  1. Для url "/news/@user" должен отображать в посередине страницу новостей, а правый Sidebar аккаунт пользователя "user".
  2. Если url будет "/news", то только основное содержимое без Sidebar.
  3. Так же возможен url "/@user", основное сожержимое должно быть пустым, а правый Sidebar отображает аккаунт пользователя "user".

Перепробовал множество вариантов, но не один не сработал должным образом.

С левым Sidebar разобрался, объявляю его в layout.

[
   {
    path: "/",
    component: () => import("layouts/MainLayout"),
    children: [
      {
        path: "news",
        components: {
          default: () => import("pages/news"),
        },
      },
      {
        path: "recommendations",
        components: {
          default: () => import("pages/recommendations"),
        },
      },
      {
        path: "@:nickname",
        components: {
          rightBar: () => import("pages/account"),
        },
      },
   }
]

Усложняется это тем что на мобильной версии 3 секции должны накладываются друг на друга в таком порядке Левый Sidebar->Основное содержимое->Правый Sidebar. Буду благодарен любой помощи, заранее спасибо.


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

Автор решения: Maks

Роутер не должен разбираться в логике построения страницы. Его задача сопоставить путь шаблону, и выдать компонент (перед переходом что-то проверить, но это не к вопросу). У Вас не понятно, чем отличаются /{Основная страница} от /{Правый Sidebar}. Шаблон один и тот же. Вам видимо нужно что-то типа:

[
  {
    path: "/",
    component: () => import("layouts/MainLayout"),
    children: [
        {
          path: "",
          component: () => import("pages/chto-to.vue"),
        },
        {
          path: "recommendations",
          component: () => import("pages/recommendations"),
        },      
        {
          path: "@:nickname",
          component: () => import("pages/account"),      
        },
      ],
  },

  {
      path: "/news/",
      component: () => import("layouts/news"),
children: [
  {
    path: "",
    component: () => import("pages/chto-to-pro-novosti.vue"),
  },
  {
      path: "@:nickname",
      component: () => import("pages/account"),
      },    
    ],
  },
]

А с тем, должен ли показываться сайдбар или нет - пусть разбираются layout и page

→ Ссылка