Creating Dynamic Routes in Your Vue.js App with Vue Router

This tutorial will walk you through the process of creating dynamic routes step by step with Vue router and using vue navigation guards.

By Tim Trott | (Java|Type)Script / jQuery | March 11, 2024
1,520 words, estimated reading time 6 minutes.

Dynamic routes may bring your Vue.js project to a whole new level of capability and engagement. You may build a more personalised and engaging user experience by allowing users to travel to different pages based on dynamic criteria. In this guide, we'll walk you through the process of adding dynamic routes to your Vue.js app, offering step-by-step guidance to help you easily integrate this powerful feature.

Understanding Dynamic Routes in Vue.js

Vue.js's dynamic routes are an important feature that allows you to generate dynamic and customised URLs for your app. You can use dynamic routes to dynamically produce content on your pages by passing parameters in the URL. This gives up a world of options for personalising and interacting with your users. We'll explain the concept of dynamic routes in Vue.js and show you how to use them in your own app in this tutorial. This step-by-step guide will help you learn dynamic routes and push your project to the next level, whether you're a novice or an experienced Vue.js developer.

Setting Up Dynamic Routes in Your Vue.js App with Vue Router

Before you can begin generating dynamic routes in your Vue.js project, you must first install and configure it.

First, ensure that Vue Router is installed in your project. You may do this by typing npm install vue-router into your terminal. After installing Vue Router, you must import it into your main.js file and utilise it as a plugin. This allows you to access the router functionality from anywhere in your app.

javascript
import Vue from 'vue';
import App from './App.vue';
import VueRouter from 'vue-router';

Vue.use(VueRouter);

const router = new VueRouter({
  routes: [], / Your routes will be defined here
});

new Vue({
  el: '#app',
  router,
  render: h => h(App),
});

Following that, you must define your routes. Create an array of route objects in your router.js file, each representing a separate route in your project. Each route object should have a path property that describes the URL for that route, as well as a component property that indicates which component should be rendered when that route is requested. Additional features, such as metadata or dynamic parameters, can be added to your route objects. After you've defined your routes, you'll need to build a router instance and pass your routes as a configuration option.

javascript
const router = new VueRouter({
  routes: [
    { path: '/user/:id', component: UserProfile },
  ],
});

In this example, :id is a route parameter, and it can have any value. When the route matches, the value of :id can be accessed within your component using this.$route.params.id.

Finally, add the component to your main App.vue file to mount the router instance to your app. After you've accomplished these steps, you're ready to begin constructing dynamic routes in your Vue.js project.

Creating Dynamic Route Components with Vue Router

After you've completed the necessary configuration for dynamic routes in your Vue.js project, you can begin building the route components. For each dynamic route you want to construct, you'll need to develop a new Vue component. You can define the route's behaviour and content within each component.

To begin creating a dynamic route component, import the required dependencies at the top of your code. This contains Vue as well as any other components or libraries that you may require. Next, create your component's template, which will control how it is rendered on the page. To achieve the necessary layout and functionality, you can utilise HTML, CSS, and Vue directives.

After you've defined your template, you can add any necessary data, methods, or calculated properties to your component. This enables you to dynamically adjust your component's content or behaviour based on user interactions or other factors.

Finally, you must export your component for it to be used in your router setup. This is usually accomplished by adding a line of code at the bottom of your project that says something like "export default MyComponent".

You can now add your dynamic route component to your router setup. Locate the route object that corresponds to the dynamic route you wish to create in your router.js file. Replace the component property with the name of your newly formed component. You may also add any necessary additional attributes or parameters to the route object.

You can save your files and test your app once you've finished these steps for each dynamic route you want to construct. When a user navigates to one of your dynamic routes, the relevant component is rendered, displaying the content and functionality you specify.

html
<template>
  <div>
    <h1>User Profile</h1>
    User ID: {{ $route.params.id }}


  </div>
</template>

<script>
export default {
  name: 'UserProfile',
};
</script>

Passing Parameters to Dynamic Routes with Vue Router

You may wish to send parameters to dynamic routes in your Vue.js project in addition to generating them. This enables you to tailor the content or behaviour of your components to certain parameters.

You can use the colon syntax in your route setup to pass arguments to a dynamic route. If you have a dynamic route for specific blog articles, for example, you can declare it as "/user/:id". The $route.params object may then be used to access the "id" argument in your component. You can also use computed properties or methods to dynamically adjust your component's content or behaviour based on the parameter value.

Optional Parameters

You can also define optional route parameters by using the ? modifier.

javascript
const router = new VueRouter({
  routes: [
    { path: '/user/:id?', component: UserProfile },
  ],
});

In this case, the id parameter is optional, and the route will match both /user and /user/123.

Catch-All Parameters

You can define catch-all routes using an asterisk (*). These routes match any path not matched by previous routes. For example:

javascript
const router = new VueRouter({
  routes: [
    { path: '/user/:id', component: UserProfile },
    { path: '*', component: NotFound },
  ],
});

In this example, the NotFound component will be displayed for any route that doesn't match the /user/:id pattern.

Handling Dynamic Route Changes and Navigation Guards

To provide a good user experience while working with dynamic routes in your Vue.js app, handle route changes and create navigation guards.

Using beforeRouteUpdate to Fetch Data

You can use the beforeRouteUpdate hook in your component to manage dynamic route changes. This hook is triggered anytime the route parameters change, allowing you to acquire fresh data or make any necessary changes.

For example, if you have a dynamic route for individual blog articles, you may use the "beforeRouteUpdate" hook in your component to fetch the updated blog post. When the user navigates between different blog articles, the content is always up to date.

html
<template>
  <div>
    <h1>{{ item.name }}</h1>
    <!-- Display the fetched data -->
  </div>
</template>

<script>
import { ref, onBeforeRouteUpdate } from 'vue';
import { useRoute } from 'vue-router';
import axios from 'axios';

export default {
  setup() {
    const item = ref({});
    const route = useRoute();

    const fetchData = () => {
      const itemId = route.params.itemId;

      / Make an API request to fetch data based on itemId
      / Example using Axios
      axios.get(`/api/items/${itemId}`)
        .then((response) => {
          item.value = response.data;
        })
        .catch((error) => {
          / Handle the error
          console.error(error);
        });
    };

    / Fetch data when the route updates
    onBeforeRouteUpdate((to, from, next) => {
      fetchData();
      next();
    });

    / Initial data fetch when the component is created
    fetchData();

    return {
      item,
    };
  },
};
</script>

Using beforeEnter To Check If User Can Access Page

In addition to dealing with dynamic route changes, navigation guards can be used to restrict access to specific routes. Before going to a route, navigation guards allow you to execute checks, such as determining whether the user is authenticated or whether certain conditions are met.

For example, before giving access to a protected route, you can use the "beforeEnter" navigation guard to check if the user is signed in. You can send the user to a login page or display an error message if they are not authenticated.

javascript
/ router.js
import { createRouter, createWebHistory } from 'vue-router';

const routes = [
  {
    path: '/public',
    name: 'public',
    component: () => import('./views/Public.vue'),
  },
  {
    path: '/private',
    name: 'private',
    component: () => import('./views/Private.vue'),
    beforeEnter: (to, from, next) => {
      / Add your access control logic here
      const isAuthenticated = /* Your authentication check */;
      if (isAuthenticated) {
        next(); / Allow access
      } else {
        next('/login'); / Redirect to login or another route
      }
    },
  },
];

const router = createRouter({
  history: createWebHistory(),
  routes,
});

export default router;

Programmatic Navigation Using Vue Router

You can navigate to dynamic routes programmatically using this.$router.push or this.$router.replace. For example, this will redirect the user to a new page:

javascript
/ Inside a method or event handler
this.$router.push({ path: '/user/123' });

You can ensure that your Vue.js app provides a seamless and secure user experience by handling dynamic route changes and using navigation guards. These strategies will help you grasp dynamic routes and create a robust user interface whether you are constructing a simple blog or a major web application.

Was this article helpful to you?
 

Related ArticlesThese articles may also be of interest to you

CommentsShare your thoughts in the comments below

If you enjoyed reading this article, or it helped you in some way, all I ask in return is you leave a comment below or share this page with your friends. Thank you.

There are no comments yet. Why not get the discussion started?

We respect your privacy, and will not make your email public. Learn how your comment data is processed.