Navigation guards are a powerful feature in Vue Router that allow you to control the navigation flow of your application. They enable you to perform checks or actions before a route is entered, after a route is entered, or when navigating away from a route. This is particularly useful for tasks such as authentication, authorization, and data fetching.
Types of Navigation Guards
Vue Router provides several types of navigation guards:
- Global Guards: These are applied to every route in the application.
- Per-Route Guards: These are defined directly in the route configuration.
- In-Component Guards: These are defined within the component itself.
Global Guards
Global guards are registered using the router.beforeEach, router.beforeResolve, and router.afterEach methods.
beforeEach: This guard is called before every navigation.beforeResolve: This guard is called afterbeforeEachand before the route is confirmed.afterEach: This guard is called after every navigation is confirmed.
Example: Global beforeEach Guard
const router = new VueRouter({
routes: [
{ path: '/home', component: Home },
{ path: '/about', component: About },
{ path: '/dashboard', component: Dashboard }
]
});
router.beforeEach((to, from, next) => {
console.log('Navigating to:', to.path);
console.log('Navigating from:', from.path);
// Perform some check
if (to.path === '/dashboard' && !isAuthenticated()) {
next('/home'); // Redirect to home if not authenticated
} else {
next(); // Proceed to the route
}
});
function isAuthenticated() {
// Replace with real authentication check
return false;
}
new Vue({
router,
render: h => h(App)
}).$mount('#app');Per-Route Guards
Per-route guards are defined directly in the route configuration using the beforeEnter property.
Example: Per-Route beforeEnter Guard
const routes = [
{
path: '/dashboard',
component: Dashboard,
beforeEnter: (to, from, next) => {
if (!isAuthenticated()) {
next('/home'); // Redirect to home if not authenticated
} else {
next(); // Proceed to the route
}
}
}
];
const router = new VueRouter({
routes
});
new Vue({
router,
render: h => h(App)
}).$mount('#app');In-Component Guards
In-component guards are defined within the component itself using the beforeRouteEnter, beforeRouteUpdate, and beforeRouteLeave lifecycle hooks.
beforeRouteEnter: Called before the route that renders this component is confirmed.beforeRouteUpdate: Called when the route that renders this component has changed, but the component is reused.beforeRouteLeave: Called when the route that renders this component is about to be navigated away from.
Example: In-Component Guard
const Dashboard = {
template: '<div>Dashboard</div>',
beforeRouteEnter(to, from, next) {
if (!isAuthenticated()) {
next('/home'); // Redirect to home if not authenticated
} else {
next(); // Proceed to the route
}
},
beforeRouteLeave(to, from, next) {
const answer = window.confirm('Do you really want to leave? You have unsaved changes!');
if (answer) {
next(); // Proceed to the route
} else {
next(false); // Cancel the navigation
}
}
};
const router = new VueRouter({
routes: [
{ path: '/home', component: Home },
{ path: '/dashboard', component: Dashboard }
]
});
new Vue({
router,
render: h => h(App)
}).$mount('#app');Practical Exercise
Exercise: Implementing a Navigation Guard
- Objective: Create a Vue application with a navigation guard that prevents access to a protected route unless the user is authenticated.
- Steps:
- Set up a Vue application with Vue Router.
- Create two routes:
/homeand/dashboard. - Implement a global
beforeEachguard that checks if the user is authenticated before allowing access to the/dashboardroute. - If the user is not authenticated, redirect them to the
/homeroute.
Solution
// main.js
import Vue from 'vue';
import VueRouter from 'vue-router';
import App from './App.vue';
import Home from './components/Home.vue';
import Dashboard from './components/Dashboard.vue';
Vue.config.productionTip = false;
Vue.use(VueRouter);
const routes = [
{ path: '/home', component: Home },
{ path: '/dashboard', component: Dashboard }
];
const router = new VueRouter({
routes
});
router.beforeEach((to, from, next) => {
if (to.path === '/dashboard' && !isAuthenticated()) {
next('/home'); // Redirect to home if not authenticated
} else {
next(); // Proceed to the route
}
});
function isAuthenticated() {
// Replace with real authentication check
return false;
}
new Vue({
router,
render: h => h(App)
}).$mount('#app');<!-- App.vue -->
<template>
<div id="app">
<router-link to="/home">Home</router-link>
<router-link to="/dashboard">Dashboard</router-link>
<router-view></router-view>
</div>
</template>
<script>
export default {
name: 'App'
};
</script><!-- Home.vue -->
<template>
<div>
<h1>Home</h1>
</div>
</template>
<script>
export default {
name: 'Home'
};
</script><!-- Dashboard.vue -->
<template>
<div>
<h1>Dashboard</h1>
</div>
</template>
<script>
export default {
name: 'Dashboard'
};
</script>Summary
In this section, we explored the concept of navigation guards in Vue Router. We learned about the different types of guards: global guards, per-route guards, and in-component guards. We also implemented practical examples to understand how to use these guards to control the navigation flow in a Vue.js application. Navigation guards are essential for tasks such as authentication and authorization, ensuring that users can only access certain routes under specific conditions.
Vue.js Course
Module 1: Introduction to Vue.js
- What is Vue.js?
- Setting Up the Development Environment
- Creating Your First Vue Application
- Understanding the Vue Instance
Module 2: Vue.js Basics
- Template Syntax
- Data Binding
- Computed Properties and Watchers
- Class and Style Bindings
- Conditional Rendering
- List Rendering
Module 3: Vue.js Components
- Introduction to Components
- Props and Custom Events
- Slots
- Dynamic and Async Components
- Component Communication
Module 4: Vue Router
Module 5: State Management with Vuex
- Introduction to Vuex
- State, Getters, Mutations, and Actions
- Modules in Vuex
- Using Vuex in Components
- Advanced Vuex Patterns
Module 6: Vue.js Directives
Module 7: Vue.js Plugins
Module 8: Testing in Vue.js
Module 9: Advanced Vue.js Concepts
- Render Functions and JSX
- Server-Side Rendering (SSR) with Nuxt.js
- Vue 3 Composition API
- Performance Optimization
