Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

330
Views
Vuetify : How to configure VueRouter to open link on a new tab?

I have a navbar with a menu that users can click on. Some links will need to open up a new tab. This is what I have and I couldn't get it to work.

<template>
    <nav>
        <v-app-bar text app color="blue">
            <v-app-bar-nav-icon class="white--text" @click="drawer = !drawer"></v-app-bar-nav-icon>
            <v-app-bar-title class="text-uppercase white--text">
                <span class="font-weight-light">Logo</span>
                <span>Global</span>
            </v-app-bar-title>
        </v-app-bar>

        <v-navigation-drawer v-model="drawer" app class="grey lighten-1">
            <v-list>
                <img class="ml-5 mb-3" src="../assets/Logo-Blue.png" width="70" />

                <v-list-item v-for="link in links" :key="link.text" router :to="link.route" @click="go(link)">
                    <v-list-item-action>
                        <v-icon>{{ link.icon }}</v-icon>
                    </v-list-item-action>
                    <v-list-item-content>
                        <v-list-item-title> {{ link.text }} </v-list-item-title>
                    </v-list-item-content>
                </v-list-item>
            </v-list>
        </v-navigation-drawer>
    </nav>
</template>
<script>
export default {
    data() {
        return {
            drawer: true,
            links: [
                { icon: 'home', text: 'Dashboard', route: '/dashboard', newTab: false },
                { icon: 'leaderboard', text: 'Stats', route: 'www.google.com ', newTab: true },
            ]
        }
    },
    methods: {
        go(link) {
            console.log('go run ...')
            console.log(link)
            console.log(process.env.APP_URL)

            if (!link.newTab) {
                this.$router.push({ path: link.route })
            } else {
                window.open(link.route)
            }
        }
    }
}
</script>

src/router/index.js

const router = new VueRouter({
    mode: 'history',
    base: process.env.BASE_URL,
    routes
})

export default router

Did I do sth wrong ?

Open up a new tab seems to work, but it kept prepending my localhost URL.

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

Don't use a click-handler with the v-list-item, since that defeats the underlying anchor tag generated for the routing, and has accessibility implications. Stick with the v-list-item's props that are built in for routing:

  • href: To create an external link with <v-list-item>, use the href prop. Internal links should use to instead.

  • target: To open a new window upon clicking the link, use the target="_blank" prop.

A v-list-item that links to an external URL would use the href prop like this:

<v-list-item href="https://google.com">Google</v-list-item>

And one that opens a new tab would use the target="_blank" prop:

<v-list-item target="_blank" href="https://google.com">Google</v-list-item>

Internal links use the to prop instead of href:

<v-list-item to="/dashboard">Dashboard</v-list-item>

And they could be opened in a new tab with target="_blank" as well:

<v-list-item target="_blank" to="/dashboard">Dashboard</v-list-item>

Solution

In your case, you have an array of items that need to bind the previously mentioned props conditionally. That's best done using v-bind with an object (where the object's key-value pairs are bound as component props) that is computed based on each item's properties:

  1. Compute a new array of links (named computedLinks) that has a new prop to bind (named linkProps):
export default {
  computed: {
    computedLinks() {
      return this.links.map(link => {
        const isExternalLink = url => /^((https?:)?\/\/)/.test(url)
        const linkProps = {
          [isExternalLink(link.route) ? 'href' : 'to']: link.route,
        }
        if (link.newTab) {
          linkProps.target = '_blank'
        }
        return {
          ...link,
          linkProps,
        }
      })
    },
  },
}
  1. Update the template to use computedLinks, and bind each link's linkProps to its corresponding v-list-item:
<v-list-item v-for="link in computedLinks" :key="link.text" v-bind="link.linkProps">
                                   👆                                        👆

demo

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!