Vue Router Layouts
March 20, 2025 · AI Conversations
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
—
### ✅ 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?
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
—
### ✅ 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`.