Vue Routing
up:: Vue ( Nuxt ⚐ has some built-in functions that make this even more convinient. )
Router configuration
import { createRouter, createWebHistory } from 'vue';
import TeamsList from '...';
const router = createRouter({
history: createWebHistory(),
routes: [
{ path: "/teams", component: TeamsList }
]
});
const app = createApp(App);
app.use(router)
Dynamic routes
const router = createRouter({
routes: [
{ path: "/teams/:teamId", // prefixed with colon
component: TeamMembers }
]
});
Get access in the created
Vue Instance Lifecycle:
created() {
// this.$route.path // see the whole path
// this.$route.params // get the parameters
this.$route.params.teamId // access a specific parameter
// search for a fitting id
const selectedTeam = this.teams.find((team) => team.id === teamId)
}
Using props
Gotcha
When navigating from a dynamic route to another dynamic route, the component doesn’t get reloaded. That is because we call the route in
created
. Vue doesn’t create and destroy the component, it is cached.
const router = createRouter({
routes: [
{ path: "/teams/:teamId", // prefixed with colon
component: TeamMembers,
prop: true }
]
});
This code above is not completed, but it starts something like this.
router-view
Let the template know where to render it:
<main>
<router-view></router-view>
</main>
router-link
Navigate (vue’s replacement of a href
essentially):
<router-link to="/teams">Teams</router-link>
Styling
router-link-active
: Applied to any item that fits part of the url.router-link-exact-active
: Applied when the whole url matches the whole path.
Navigate programmatically
(through Vue Methods) (Nuxt does this with Nuxt navigateTo)
methods: {
navigateToOtherSite() {
this.$router.push('/teams'); // takes us to '/teams'
this.$router.back(); // emulates the browser's back button
this.$router.forward(); // emulates the browser's forward button
}
}
Redirects
const router = createRouter({
routes: [
{ path: "/", redirect: '/teams' }
]
});
You can also add alias
on the other route. What is important to know is that the ** then.
Catch-all routes
const router = createRouter({
routes: [
// this one needs to come last, otherwise it overwrites everything else
{ path: "/:notFound(.*)", component: 'NotFound'}
]
});
Sublinks
You can also add a children
parameter to each list. That makes it a sub-path.
Then you need to add an extra router-view
in the parent component.
Query parameters
this.$route.query