vue-router 在新的标签页打开链接/路由

devtools/2024/9/21 11:20:21/

前言

分别讨论调用API及使用RouterLink组件两种场景下如何在新的标签页中打开链接/路由

调用 API

vue-router 的路由实例除了常见的 push, replace, go 等接口,还提供了一个很好用的接口 resolve,可用于解析路由,第一个参数类型与 push/replace 一致。

import { useRouter } from 'vue-router'const router = useRouter()function handleGoEditReport({ no }) {const target = router.resolve({name: 'ReportDetail',params: { rid: no },})window.open(target.href, '_blank')
}

与 push 的使用差别不大

RouterLink 组件

vue-router 的 RouterLink 组件是在当前页面内跳转路由,有些场景下会要求在新标签页中打开。

RouterLink 组件实际上还是渲染成 <a> 标签,参考源码

RouterLink renderer 源码片段:

// ...
setup(props, { slots }) {// ...return () => {const children = slots.default && slots.default(link)return props.custom? children: h('a',{'aria-current': link.isExactActive? props.ariaCurrentValue: null,href: link.href,// this would override user added attrs but Vue will still add// the listener, so we end up triggering bothonClick: link.navigate,class: elClass.value,},children)}
},
// ...

未设置 target,该组件属性中也没有关于 target 的属性(源码)。

下面提供几个方案

1. 直接设置 target 属性

由于 RouterLink 默认只有一个 <a> 标签作为根元素,直接在 RouterLink 上设置 target 属性,vue 的特性使它被绑定到 <a> 标签上。

<template><router-link :to="{ name: 'ReportDetail', params: { rid: 'A00000001' } }" target="_blank">GO</router-link>
</template>

这是最简单直接的解决方案,一开始略过了它,因为印象中很早就试过此方案但未生效。既然此方案有效,后面几种方案看看就行了。。。

2. 自定义链接组件

组合式 API - useLink

参照官网示例,承接 RouterLink 所有属性,使用组合式 API 解析得到所需的链接信息,再按具体需求渲染组件。

3. 插槽 + custom 属性

在 RouterLink 的 v-slot 中可以访问与 useLink 组合式函数相同的属性。

基于插槽与 custom 属性,可以如下创建一个简单链接满足需求,这一方案同上一方案比较类似,都需要自行处理 isActive, isExactActive 等状态。原因参阅上面的源码片段 👆

<template><router-link :to="{ name: 'ReportDetail', params: { rid: 'A00000001' } }" :custom="true"><template #default="{ href }"><a :href="href" target="_blank">GO</a></template></router-link>
</template>

vue__target_100">4. 添加 vue 自定义指令-绑定路由 target

由于 RouterLink 组件最终会渲染成 <a> 标签,添加一个指令用于绑定链接的 target 属性即可

main.js 定义并注册自定义指令:

import { createApp } from 'vue'
import App from './App.vue'const app = createApp(App)app.directive('target', {mounted(el, binding) {// 将元素的 target 属性设置为绑定值const { value: target = '_blank' } = bindingel.setAttribute('target', target)},
})app.mount('#app')

使用:

<template><router-link v-target :to="{ name: 'ReportDetail', params: { rid: 'A00000001' } }">GO</router-link>
</template>

http://www.ppmy.cn/devtools/114967.html

相关文章

HarmonyOS学习(十三)——数据管理(二) 关系型数据库

文章目录 1、基本概念2、运行机制3、默认配置与限制4、接口说明5、实战&#xff1a;开发“账本”5.1、创建RdbStore5.2、创建数据库5.3、增加数据5.4、删除数据5.5、修改数据5.6、查询数据5.7、备份数据库5.8、恢复数据库5.9、删除数据库 官方文档地址&#xff1a; 通过关系型…

mysql 8.0 搭建主从集群注意事项

mysql 8.0 的集群搭建方式和mysql 5.7的搭建方式&#xff0c;有点不同&#xff0c;命令改了。官方文档写的很全&#xff08;又臭又长&#xff09;&#xff0c;所以写一篇笔记&#xff0c;简单总结下怎么搭建。 怎么安装mysql 8.0就不赘述了&#xff0c;假设两台机器已经完成数据…

Llamaindex 使用过程中的常见问题 (FAQ)

导读 在使用LlamaIndex进行文档索引和查询时&#xff0c;您可能会发现需要根据特定的需求对基础设置进行调整。下面是一些常见的定制化需求及其对应的实现方式&#xff1a; 文档分割&#xff1a;为了更好地管理和查询大型文档&#xff0c;您可以选择将文档分割成更小的块。这可…

请求HTTP链接的图片等资源被自动变成HTTPS请求的问题解决(顺便可以解决图片防盗链)

文章目录 问题现象问题根本原因常规问题解决办法非Chrome浏览器&#xff1a;控制CSP协议对HTML页面处理nginx配置中处理 Chrome浏览器本地处理方式 Chrome浏览器通用解决办法&#xff08;服务器端无法控制新版Chrome这种行为&#xff0c;只能曲线救国--顺便可以解决图片防盗链&…

[网络层]-IP协议相关特性

IP协议 基本概念 主机 : 配有IP地址,但是不进行路由控制的设备路由器 : 既配有IP地址,又能进行路由控制节点: 主机和路由器的统称 协议头格式 4位版本(version):占四位,用于指定IP协议的版本,例如,使用IPv4,该字段就为44位首部长度: 表示IP协议首部的长度,以32位bit (4字节)…

Mysql存储过程详细解读

目录 存储过程介绍 创建与调用 查看与删除 变量 系统变量 用户自定义变量 ​编辑局部变量 ​编辑​编辑IF判断 存储过程参数​编辑​编辑​编辑 CASE ​编辑 WHILE​编辑 ​编辑REPEAT​编辑​编辑 LOOP 游标 条件处理程序 存储函数 存储过程介绍 创建与调用 查…

Rust GUI框架 tauri V2 项目创建

文章目录 Tauri 2.0创建应用文档移动应用开发 Android 前置要求移动应用开发 iOS 前置要求参考资料 Tauri 2.0 Tauri 是一个构建适用于所有主流桌面和移动平台的轻快二进制文件的框架。开发者们可以集成任何用于创建用户界面的可以被编译成 HTML、JavaScript 和 CSS 的前端框架…

【C++掌中宝】深入解析C++命名空间:有效管理代码的利器

文章目录 前言1. namespace 的价值2. namespace 的定义3. 命名空间的本质4. 嵌套的命名空间5. 命名空间的使用6. using 指令7. 补充结语 前言 假设这样一种情况&#xff0c;当一个班上有两个名叫 Zara 的学生时&#xff0c;为了明确区分它们&#xff0c;我们在使用名字之外&am…