Vue Router Layouts

User
import { createRouter, createWebHistory } from 'vue-router'
import NProgress from 'nprogress';
import 'nprogress/nprogress.css';
NProgress.configure({ showSpinner: false, speed: 500, minimum: 0.2 });
import HomeView from '../views/HomeView.vue'
import Youtubeiew from '@/views/Youtubeiew.vue'
import NewsView from '@/views/NewsView.vue'
import LoginView from '@/views/LoginView.vue'
import RegisterView from '@/views/RegisterView.vue'
import DashboardView from '@/views/User/DashboardView.vue'
import ProfileView from '@/views/User/ProfileView.vue'
import SettingsView from '@/views/User/SettingsView.vue'
import ForgetPasswordView from '@/views/ForgetPasswordView.vue'
import MainRoutes from './MainRoutes';
import PublicRoutes from './PublicRoutes';
import { useAuthStore } from '@/stores/auth';
const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),
routes: [
{
path: '/',
name: 'home',
component: HomeView,
},
{
path: '/news',
name: 'news',
component: NewsView,
},
{
path: '/youtube',
name: 'youtube',
component: Youtubeiew,
},

{
path: '/register',
name: 'register',
component: RegisterView,
},
{
path: '/forget-password',
name: 'forget-password',
component: ForgetPasswordView,
},
{
path: '/about',
name: 'about',
// route level code-splitting
// this generates a separate chunk (About.[hash].js) for this route
// which is lazy-loaded when the route is visited.
component: () => import('../views/AboutView.vue'),
},
{
path: '/profile',
name: 'profile',
component: ProfileView,
meta: { requiresAuth: true },
},
{
path: '/settings',
name: 'settings',
component: SettingsView,
meta: { requiresAuth: true },
},
PublicRoutes,
MainRoutes,
],

})
router.beforeEach((to, from, next) => {
const authStore = useAuthStore();
NProgress.start();
if (to.meta.requiresAuth && !authStore.token) {
next('/login'); // Redirect if not logged in
} else {
next();
}
});
router.afterEach(() => {
NProgress.done();
});
export default router
define route for different layout other

Assistant
To define routes with **different layouts** in Vue Router (e.g., `DefaultLayout`, `AuthLayout`, `AdminLayout`, etc.), you can use a **layout component as a wrapper** for child routes. Here's how to organize this cleanly in your router setup.

### ✅ 1. **Create Layout Components**
Example:
– `layouts/DefaultLayout.vue`
– `layouts/AuthLayout.vue`
– `layouts/AdminLayout.vue`

Each layout component should contain a “ to render nested pages.

### ✅ 2. **Update Your Routes Using Layout Wrappers**

Here's how to update your `router.js` to support multiple layouts:

import { createRouter, createWebHistory } from 'vue-router'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
NProgress.configure({ showSpinner: false, speed: 500, minimum: 0.2 })

import DefaultLayout from '@/layouts/DefaultLayout.vue'
import AuthLayout from '@/layouts/AuthLayout.vue'

import HomeView from '@/views/HomeView.vue'
import NewsView from '@/views/NewsView.vue'
import YoutubeView from '@/views/Youtubeiew.vue'
import LoginView from '@/views/LoginView.vue'
import RegisterView from '@/views/RegisterView.vue'
import ForgetPasswordView from '@/views/ForgetPasswordView.vue'
import ProfileView from '@/views/User/ProfileView.vue'
import SettingsView from '@/views/User/SettingsView.vue'
import DashboardView from '@/views/User/DashboardView.vue'

import PublicRoutes from './PublicRoutes'
import MainRoutes from './MainRoutes'

import { useAuthStore } from '@/stores/auth'

const routes = [
  {
    path: '/',
    component: DefaultLayout,
    children: [
      { path: '', name: 'home', component: HomeView },
      { path: 'news', name: 'news', component: NewsView },
      { path: 'youtube', name: 'youtube', component: YoutubeView },
      {
        path: 'about',
        name: 'about',
        component: () => import('@/views/AboutView.vue')
      },
      {
        path: 'profile',
        name: 'profile',
        component: ProfileView,
        meta: { requiresAuth: true }
      },
      {
        path: 'settings',
        name: 'settings',
        component: SettingsView,
        meta: { requiresAuth: true }
      },
      {
        path: 'dashboard',
        name: 'dashboard',
        component: DashboardView,
        meta: { requiresAuth: true }
      }
    ]
  },
  {
    path: '/',
    component: AuthLayout,
    children: [
      { path: 'login', name: 'login', component: LoginView },
      { path: 'register', name: 'register', component: RegisterView },
      { path: 'forget-password', name: 'forget-password', component: ForgetPasswordView }
    ]
  },
  PublicRoutes,
  MainRoutes
]

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes
})

router.beforeEach((to, from, next) => {
  const authStore = useAuthStore()
  NProgress.start()
  if (to.meta.requiresAuth && !authStore.token) {
    next('/login')
  } else {
    next()
  }
})

router.afterEach(() => {
  NProgress.done()
})

export default router

### ✅ 3. **Inside Layout Components (e.g., `DefaultLayout.vue`)**

<template>
  <div>
    <Navbar />
    <main>
      <router-view />
    </main>
    <Footer />
  </div>
</template>

Would you like help generating the layout components (`DefaultLayout`, `AuthLayout`, etc.) or organizing `PublicRoutes` and `MainRoutes` with layout too?

User
import { createRouter, createWebHistory } from 'vue-router'
import NProgress from 'nprogress';
import 'nprogress/nprogress.css';
NProgress.configure({ showSpinner: false, speed: 500, minimum: 0.2 });
import DefaultVuetify from '@/layouts/DefaultVuetify.vue';
import HomeView from '../views/HomeView.vue'
import Youtubeiew from '@/views/Youtubeiew.vue'
import NewsView from '@/views/NewsView.vue'
import LoginView from '@/views/LoginView.vue'
import RegisterView from '@/views/RegisterView.vue'
import DashboardView from '@/views/User/DashboardView.vue'
import ProfileView from '@/views/User/ProfileView.vue'
import SettingsView from '@/views/User/SettingsView.vue'
import ForgetPasswordView from '@/views/ForgetPasswordView.vue'
import MainRoutes from './MainRoutes';
import PublicRoutes from './PublicRoutes';
import { useAuthStore } from '@/stores/auth';
const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),
routes: [
{
path: '/',
name: 'Frontsite',
component: DefaultVuetify,
meta: { requiresAuth: false },
children: [
{
path: '/',
name: 'home',
component: HomeView,
},
{
path: '/news',
name: 'news',
component: NewsView,
},
{
path: '/youtube',
name: 'youtube',
component: Youtubeiew,
},
]
},
// {
// path: '/about',
// name: 'about',
// // route level code-splitting
// // this generates a separate chunk (About.[hash].js) for this route
// // which is lazy-loaded when the route is visited.
// component: () => import('../views/AboutView.vue'),
// },
// {
// path: '/profile',
// name: 'profile',
// component: ProfileView,
// meta: { requiresAuth: true },
// },
// {
// path: '/settings',
// name: 'settings',
// component: SettingsView,
// meta: { requiresAuth: true },
// },
PublicRoutes,
MainRoutes,
],

})
router.beforeEach((to, from, next) => {
const authStore = useAuthStore();
NProgress.start();
if (to.meta.requiresAuth && !authStore.token) {
next('/login'); // Redirect if not logged in
} else {
next();
}
});
router.afterEach(() => {
NProgress.done();
});
export default router
now home page content not showing just layout header is showing

Assistant
If only your **layout header is showing** and not the actual **`HomeView` page content**, the issue is most likely with the “ not being placed correctly inside your layout file: `DefaultVuetify.vue`.

### ✅ Fix: Ensure “ is present in `DefaultVuetify.vue`

Your `DefaultVuetify.vue` layout should look something like this:

<template>
  <v-app>
    <DefaultHeader />
    
    <v-main>
      <router-view /> <!-- This is essential to render the child page content -->
    </v-main>

    <DefaultFooter />
  </v-app>
</template>

<script setup>
// Import your header and footer components here
import DefaultHeader from '@/components/DefaultHeader.vue'
import DefaultFooter from '@/components/DefaultFooter.vue'
</script>

### ✅ Explanation

Since you’re nesting routes like this:

{
  path: '/',
  name: 'Frontsite',
  component: DefaultVuetify,
  children: [
    {
      path: '/',
      name: 'home',
      component: HomeView,
    }
  ]
}

Vue Router will render `DefaultVuetify.vue`, and **inside that layout**, it will inject the `HomeView` content at the “.

If you forgot to add “ inside the layout, the page-specific content will not render—only the layout (e.g., header) will show.

Let me know if you'd like me to generate a basic layout component for `DefaultVuetify.vue`.

Leave a Comment

Your email address will not be published. Required fields are marked *