You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Vuetify v-btn结合Vue Router实现新窗口打开链接?

解决Vuetify v-btn结合路由跳转无法在新标签页打开的问题

这个问题我之前也碰到过,Vue Router的<router-link>能正常识别target="_blank",但Vuetify的v-btn用:to绑定路由时,不会自动把target属性传递给内部封装的router-link组件,所以导致新标签页打开的功能失效。这里有几个实用的解决办法:

方法一:手动触发路由跳转并打开新标签页

这种方式绕过Vuetify的封装,直接通过点击事件处理跳转,兼容性最好:

在模板中:

<v-btn icon @click="openRouteInNewTab('fooRoute')">
  <v-icon>window</v-icon>
</v-btn>

然后在组件的methods中添加对应的方法:

openRouteInNewTab(routeName) {
  // 解析路由对应的完整URL
  const routeUrl = this.$router.resolve({ name: routeName }).href;
  // 打开新标签页
  window.open(routeUrl, '_blank');
}

提示:如果需要传递路由参数,直接在resolve的参数里加上params或者query即可,比如{ name: 'fooRoute', params: { id: 123 } }

方法二:用router-link结合Vuetify按钮样式

既然<router-link>支持target="_blank",我们可以直接用它,然后给它加上v-btn的样式类,实现和v-btn一样的视觉效果:

<router-link 
  :to="{ name: 'fooRoute'}" 
  target="_blank" 
  rel="noopener noreferrer"
  class="v-btn v-btn--icon v-theme--light"
>
  <v-icon>window</v-icon>
</router-link>

注意:rel="noopener noreferrer"是安全最佳实践,防止新标签页通过window.opener访问原页面的权限;样式类可以根据你的主题和按钮类型调整,比如需要填充按钮就加v-btn--contained等

方法三:扩展Vuetify的v-btn组件(进阶)

如果你项目中很多地方需要这个功能,可以封装一个自定义的按钮组件,自动处理target和路由跳转:

<template>
  <v-btn 
    v-bind="$attrs" 
    :icon="icon"
    @click="handleClick"
  >
    <slot></slot>
  </v-btn>
</template>

<script>
export default {
  props: ['to', 'target', 'icon'],
  methods: {
    handleClick() {
      if (this.to && this.target === '_blank') {
        const routeUrl = this.$router.resolve(this.to).href;
        window.open(routeUrl, '_blank');
      } else {
        // 正常路由跳转
        this.$router.push(this.to);
      }
    }
  }
}
</script>

之后就可以像原生v-btn一样使用:

<custom-btn icon :to="{ name: 'fooRoute'}" target="_blank">
  <v-icon>window</v-icon>
</custom-btn>

内容的提问来源于stack exchange,提问作者Andrew Mao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:46:23