vue-router可以在新标签页中打开链接吗?


97

我有一个摘要页面和一个详细子页面。使用vue-router(v 0.7.x)使用​​如下所示的程序导航实现所有路由:

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

然而,当从摘要页面的子页面我的路线,我需要通过添加打开一个新的选项卡中的子页,就像一个会_target="blank"以一个<a>标签。

有没有办法做到这一点?


3
我认为vue路由器无法做到这一点,您可以提取并构建url,然后使用window.open(url,'_blank')
Deepak

1
是的,他们正式表示这是不可能的。谢谢。
唐炯

在下面有一个可行的答案,您应该接受它作为对问题的回答,不是吗?
安德烈斯·菲利普

Answers:


169

我认为您可以执行以下操作:

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

它为我工作。谢谢。


4
这对我来说似乎是最好的方法。您仍然可以使用$ router来构建url,而不必将一些hacky字符串混在一起,然后使用window打开新选项卡。+1
约翰·史密斯

2
这是最完整的解决方案,如果您尝试访问的路由的URL以此方式更改使您始终处于检查状态。真好!
Nitzankin '18年

3
不幸的是这种方法,通过一些默认的浏览器弹出窗口拦截器获取块
光子

这是IMO的最佳答案
kaleazy

1
@Rafel,请允许我看看Anthone Gore的书“ Full-Stack Vue.js 2和Laravel 5”的github中与源代码相关的Vue.JS问题,这里stackoverflow.com/questions/59245577 /…?特别看看OP的EDIT:部分。
Istiaque Ahmed

123

现在似乎可以在较新的版本(Vue Router 3.0.1)中实现:

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

似乎不是您可以传递参数吗?只需打开链接本身。正确?
戈茨

@Gotts还可以传递参数和queryparams。在<router-link:to =“ {name:'fooRoute',params:{param_var:'id_parameter'},query:{query_var:'query_params'}}” target =“ _ blank” >链接文本</ router-link>
Pushkar Shirodkar

请注意,这是针对<router-link>的,不适用于this.$router.push()
jplindstrom

22

对于那些想知道答案的人,答案是否定的。请参阅github上的相关问题

问:vue-router是否可以在新标签页中以编程方式打开链接

答:不可以,请使用普通链接。


12
谢谢,实际上问题是由我提出的。
唐炯

5
现在可以在v3中添加target="_blank"<router-link>标签stackoverflow.com/a/49654382/2678454
感谢

发现这非常有帮助,而不是构建完整的URL并使用window.open
Sainath SR

14

如果您像问题中所问的那样定义路线(路径:“ / 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
    }
  ]
})

您可以在摘要页面中解析URL,然后打开子页面,如下所示:

<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>

当然,如果您给路由指定了名称,则可以按名称解析URL:

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

...

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

参考文献:


11

项目中的某个位置,通常是main.js或router.js

import Router from 'vue-router'

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

在您的组件中:

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

不能拒绝投票,但也许对Vue3很好?因为控制台/记录this。$ router.open对我返回未定义
Dexygen '19

不鼓励使用这种方法来改变原型。您无法记录它,因为它不是规范的一部分。
adi518


4

只需在您的路由文件中编写以下代码:

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

4

这对我有用-

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

我修改了@Rafael_Andrs_Cspedes_Basterio答案


3

如果你喜欢上相对路径只关心:/dashboard/about等等,见其他的答案。

如果您想打开一个绝对路径,例如:https://www.google.com到新选项卡,则必须知道Vue Router并非要处理这些路径。

但是,他们似乎将其视为功能要求。#1280。但是直到他们这样做



这是您可以使用vue-router处理外部链接的一些技巧。

  • 转到路由器配置(可能为router.js)并添加以下代码:
/* 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()
}

现在,每当我们处理绝对URL时,我们都有解决方案。例如将google打开到新标签页

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

请记住,每当我们打开另一个页面到新选项卡时,都必须使用noopener noreferrer

在这里阅读更多

或这里


对于我而言,在除打开新窗口不会打开的手机以外的几乎所有设备上,我都能很好地工作!
javascript110899

0

这对我有用:

在HTML模板中: <a target="_blank" :href="url" @click.stop>your_name</a>

在mount()中: this.url = `${window.location.origin}/your_page_name`;


0

使用定位标记执行此操作的最简单方法是:

<a :href="$router.resolve({name: 'posts.show', params: {post: post.id}}).href" target="_blank">
    Open Post in new tab
</a>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.