214

I have a summary page and a detail subpage. All of the routes are implemented with vue-router (v 0.7.x) using programmatic navigation like this:

this.$router.go({ path: "/link/to/page" })

However, when I route from the summary page to the subpage, I need to open the subpage in a new tab just as one would by adding _target="blank" to an <a> tag.

Is there a way to do this?

4
  • 6
    I dont think thats possible with vue router, you might extract and build your url and then use window.open(url, '_blank') Commented Oct 13, 2016 at 12:22
  • 3
    Yes, they officially say it's impossible. Thank you. Commented Oct 14, 2016 at 2:08
  • there is an answer below that works, you should accept that as the response on your question, don't you think? Commented Apr 4, 2018 at 15:06
  • 1
    i go over all the answers and only thing i did was adding target="_blank" to inside my router-link tag. but i am not sure if this is good practice or not. and I don't have any param Commented May 10, 2021 at 17:36

16 Answers 16

390

I think that you can do something like this:

const routeData = this.$router.resolve({name: 'routeName', query: {data: "someData"}});
window.open(routeData.href, '_blank');

It worked for me.

Update


For composition Api:

import { useRouter } from 'vue-router'
const router = useRouter();
const routeData = router.resolve({name: 'routeName', query: {data: "someData"}});
window.open(routeData.href, '_blank');
Sign up to request clarification or add additional context in comments.

7 Comments

This seems like the best way to me. You still use $router to build the url without having to mash together some hacky string, then use window to open the new tab. +1
Unfortunately this method get block by some default browser popup blocker
Note that location parameter uses path instead of name if you use query.
One problem with this is that window.open does not pass headers like tokens and others.
@Rafel, May i ask you to have a look at a Vue.JS question related with the source code in github of the book 'Full-Stack Vue.js 2 and Laravel 5' by Anthone Gore here stackoverflow.com/questions/59245577/… ? Particularly take a look at the EDIT: section of the OP ?
|
238

It seems like this is now possible in newer versions (Vue Router 3.0.1):

<router-link :to="{ name: 'fooRoute'}" target="_blank">
  Link Text
</router-link>

5 Comments

Doesnt seem to be that you can pass parameters though? just open the link itself. Correct?
@Gotts you can pass params and queryparams also. The code shall for doing that is given below <router-link :to="{ name: 'fooRoute',params:{param_var:'id_parameter'},query:{query_var:'query_params'}}" target="_blank"> Link Text </router-link>
Note that this is for the <router-link>, it doesn't work programmatically with this.$router.push().
adding target property in the router-link. This is awesome. The answer above by @Harish seem to work as well if we need the logic in the routes declarations.
<router-link :to="{ name: 'fooRoute', params: { id: 132 } }"> Link Text </router-link>
25

For those who are wondering the answer is no. See related issue on github.

Q: Can vue-router open link in new tab progammaticaly

A: No. use a normal link.

3 Comments

Now possible to add target="_blank" to a <router-link> tag in v3 stackoverflow.com/a/49654382/2678454
Found this very helpful instead of constructing the full URL and using window.open
A: Yes for Vue 3+, now its possible: stackoverflow.com/a/49654382/9950567
22

In case that you define your route like the one asked in the question (path: '/link/to/page'):

import Vue from 'vue'
import Router from 'vue-router'
import MyComponent from '@/components/MyComponent.vue';

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/link/to/page',
      component: MyComponent
    }
  ]
})

You can resolve the URL in your summary page and open your sub page as below:

<script>
export default {
  methods: {
    popup() {
      let route = this.$router.resolve({path: '/link/to/page'});
      // let route = this.$router.resolve('/link/to/page'); // This also works.
      window.open(route.href, '_blank');
    }
  }
};
</script>

Of course if you've given your route a name, you can resolve the URL by name:

routes: [
  {
    path: '/link/to/page',
    component: MyComponent,
    name: 'subPage'
  }
]

...

let route = this.$router.resolve({name: 'subPage'});

References:

Comments

13

Somewhere in your project, typically main.js or router.js

import Router from 'vue-router'

Router.prototype.open = function (routeObject) {
  const {href} = this.resolve(routeObject)
  window.open(href, '_blank')
}

In your component:

<div @click="$router.open({name: 'User', params: {ID: 123}})">Open in new tab</div>

2 Comments

Not down-voting, but maybe it's nice for Vue3? Because console/logging this.$router.open returns undefined for me
This approach is discouraged as it mutates prototype. You can't log it, because it isn't part of the spec.
13

This worked for me-

let routeData = this.$router.resolve(
{
  path: '/resources/c-m-communities', 
  query: {'dataParameter': 'parameterValue'}
});
window.open(routeData.href, '_blank');

I modified @Rafael_Andrs_Cspedes_Basterio answer

Comments

12

Just write this code in your routing file :

{
  name: 'Google',
  path: '/google',
  beforeEnter() {                    
                window.open("http://www.google.com", 
                '_blank');
            }
}

Comments

9

I think the best way is to simply use:

window.open("yourURL", '_blank');

Comments

6

If you are interested ONLY on relative paths like: /dashboard, /about etc, See other answers.

If you want to open an absolute path like: https://www.google.com to a new tab, you have to know that Vue Router is NOT meant to handle those.

However, they seems to consider that as a feature-request. #1280. But until they do that,



Here is a little trick you can do to handle external links with vue-router.

  • Go to the router configuration (probably router.js) and add this code:
/* Vue Router is not meant to handle absolute urls. */
/* So whenever we want to deal with those, we can use this.$router.absUrl(url) */
Router.prototype.absUrl = function(url, newTab = true) {
  const link = document.createElement('a')
  link.href = url
  link.target = newTab ? '_blank' : ''
  if (newTab) link.rel = 'noopener noreferrer' // IMPORTANT to add this
  link.click()
}

Now, whenever we deal with absolute URLs we have a solution. For example to open google to a new tab

this.$router.absUrl('https://www.google.com)

Remember that whenever we open another page to a new tab we MUST use noopener noreferrer.

Read more here

or Here

1 Comment

works well for me on almost all devices except mobile phones, where the new window does not open!
3

The simplest way of doing this using an anchor tag would be this:

<a :href="$router.resolve({name: 'posts.show', params: {post: post.id}}).href" target="_blank">
    Open Post in new tab
</a>

Comments

2

Below code is to open a new tab with parameter.

With router link=

<router-link
                  :to="{ name: 'task_section',query: {reportId: item.task,}}"
                  target="_blank"> Link Text
              </router-link>

Now access to the sented data

this.$route.query.reportId

Comments

1

It can be achieved by creating a separate method for window redirect like this.

const openLinkInNewTab = (url) => {
  window.open(url, '_blank');
}

then use it on template like this

<a href="javascript:void(0)" @click="openLinkInNewTab('https://devsbuddy.com')">
    Open in new tab
</a>

Comments

1

you can use it in vue3 & typescript

import { useRouter } from "vue-router";
const router = useRouter();
let route = router.resolve({ name:'/link/to/page' , query: { param: 'param1' } });
window.open(route.fullPath, "_blank");

Comments

0

This works for me:

In HTML template: <a target="_blank" :href="url" @click.stop>your_name</a>

In mounted(): this.url = `${window.location.origin}/your_page_name`;

Comments

0

If you use Quasar, there is openURL function:

import { openURL } from 'quasar'

openURL(
  'http://...',
  undefined,
  {
    target: '_blank'
  }
)

Docs:

  1. https://quasar.dev/quasar-utils/other-utils/#openurl
  2. https://developer.mozilla.org/en-US/docs/Web/API/Window/open#target

Comments

-2

use following code for apache server

<IfModule mod_negotiation.c>
  Options -MultiViews
</IfModule>
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteRule ^index\.html$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.html [L]
</IfModule>

1 Comment

Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.