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

Tan*_*ong 64 javascript vue.js vue-router

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

this.$router.go({ path: "/link/to/page" })
Run Code Online (Sandbox Code Playgroud)

但是,当我从摘要页面路由到子页面时,我需要在新选项卡中打开子页面,就像添加_target="blank"<a>标签一样.

有没有办法做到这一点?

小智 94

我认为你可以这样做:

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

它对我有用.谢谢.

  • 这对我来说似乎是最好的方式.您仍然使用$ router来构建URL而不必将一些hacky字符串混合在一起,然后使用窗口打开新选项卡.+1 (4认同)
  • 不幸的是,此方法被某些默认浏览器弹出窗口阻止程序阻止 (3认同)
  • 这是最完整的解决方案,如果您尝试访问的路径的URL以这种方式更改,则会让您受到检查.太好了! (2认同)

And*_*Mao 82

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

<router-link :to="{ name: 'fooRoute'}" target="_blank">
  Link Text
</router-link>
Run Code Online (Sandbox Code Playgroud)

  • @Gotts,您也可以传递参数和查询参数。执行此操作的代码如下所示 &lt;router-link :to="{ name: 'fooRoute',params:{param_var:'id_parameter'},query:{query_var:'query_params'}}" target="_blank" &gt; 链接文本&lt;/router-link&gt; (2认同)

小智 20

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

问:vue-router可以在新标签页中打开链接

答:没有.使用普通链接.

  • 谢谢,实际上问题是由我打开的. (9认同)
  • 现在可以在v3 /sf/answers/3475806771/将`target =“ _ blank”`添加到`&lt;router-link&gt;`标签中 (3认同)

Yuc*_*uci 9

如果您定义路线,就像问题中提到的那样(路径:'/ 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
    }
  ]
})
Run Code Online (Sandbox Code Playgroud)

您可以在摘要页面中解析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>
Run Code Online (Sandbox Code Playgroud)

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

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

...

let route = this.$router.resolve({name: 'subPage'});
Run Code Online (Sandbox Code Playgroud)

参考文献:


小智 7

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

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


Nas*_*han 7

这对我有用-

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

我修改了@Rafael_Andrs_Cspedes_Basterio 答案


rol*_*oli 6

如果你喜欢上相对路径只关心:/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()
}
Run Code Online (Sandbox Code Playgroud)

现在,每当我们处理绝对 URL 时,我们就有了一个解决方案。例如打开谷歌到一个新标签

this.$router.absUrl('https://www.google.com)
Run Code Online (Sandbox Code Playgroud)

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

在这里阅读更多

或这里


小智 5

我认为最好的方法是简单地使用:

window.open("yourURL", '_blank');
Run Code Online (Sandbox Code Playgroud)

* 飞走了 *

  • 距离不够远 (3认同)

Ali*_*han 5

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

import Router from 'vue-router'

Router.prototype.open = function (routeObject) {
  const {href} = this.resolve(routeObject)
  window.open(href, '_blank')
}
Run Code Online (Sandbox Code Playgroud)

在您的组件中:

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