Prepare for a backend job by mastering computer science fundamentals

How to Rerender a Vue Route When Path Parameters Change

By Lane Wagner on Jul 7, 2020

In single-page apps that use the Vue Router, it’s common to create a path parameter that changes the behavior of a route. Often a problem occurs however when a user alters the path manually in the address bar. Manually changing the URL does not rerender the view! This can cause unexpected behavior because mounted() hooks don’t fire and nested components don’t reload.

How to Fix It

The solution is to use another Vue hook, beforeRouteUpdate(). Let’s take the example of the boot.dev Playground. The last parameter in the Playground’s path is the code language, js or go. If the boilerplate code were only fetched using a mounted() hook, then when a user changed the path parameter the boilerplate code wouldn’t reload.

The reason that it does reload is that the boot.dev SPA also has the following beforeRouteUpdate() hook:

beforeRouteUpdate (to, from, next) {
  this.lang = to.params.lang;
  this.setCode();
  next();
}

According to the docs, the hook receives three parameters:

In the case of the boot.dev Playground, we are just doing the same operation that the mounted() hook does: we check the language and fetch the boiler plate.

What If I Want All Routes To Update?

If this is a common problem in your app, you can set your entire router-view to re-render when its path changes by providing a key property:

<router-view :key="$route.fullPath" />

With the above, you won’t need to use the beforeRouteUpdate() hook, and can directly access the now-reactive this.$route.params.myVar property. The only problem with this method is that every path in that router will update in the case of a path change. You may not want all that needless re-rendering, but that’s a decision for you to make.

Become a backend engineer by building real projects

Related Reading