vue-router 可以在新标签页中打开 link 吗?
Can vue-router open a link in a new tab?
我有一个摘要页面和一个详细信息子页面。所有路线都使用 vue-router
(v 0.7.x) 使用如下编程导航实现:
this.$router.go({ path: "/link/to/page" })
但是,当我从摘要页面路由到子页面时,我需要在新选项卡中打开子页面,就像将 _target="blank"
添加到 <a>
标记一样。
有办法吗?
对于那些想知道答案是否定的人。
请参阅 github 上的相关 issue。
Q: Can vue-router open link in new tab progammaticaly
A: No. use a normal link.
我认为你可以这样做:
let routeData = this.$router.resolve({name: 'routeName', query: {data: "someData"}});
window.open(routeData.href, '_blank');
对我有用。
如果您像问题中所问的那样定义路线(路径:'/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'});
参考文献:
- vue-router router.resolve(location, current?, append?)
- vue-router router-link
这似乎在较新的版本(Vue Router 3.0.1)中是可能的:
<router-link :to="{ name: 'fooRoute'}" target="_blank">
Link Text
</router-link>
我认为最好的方法是简单地使用:
window.open("yourURL", '_blank');
* 飞走了 *
项目中的某处,通常是 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>
只需在您的路由文件中写入此代码即可:
{
name: 'Google',
path: '/google',
beforeEnter() {
window.open("http://www.google.com",
'_blank');
}
}
这对我有用-
let routeData = this.$router.resolve(
{
path: '/resources/c-m-communities',
query: {'dataParameter': 'parameterValue'}
});
window.open(routeData.href, '_blank');
我修改了@Rafael_Andrs_Cspedes_Basterio答案
如果您只对相对路径感兴趣,例如:/dashboard
、/about
等,请参阅其他答案。
如果你想打开一个绝对路径,比如:https://www.google.com
到一个新的选项卡,你必须知道 Vue Router 并不打算处理这些。
但是,他们似乎将其视为功能请求。 #1280。但在他们这样做之前,
Here is a little trick you can do to handle external links with 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()
}
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)
请记住,每当我们打开另一个页面到新选项卡时,我们必须使用 noopener noreferrer
.
这对我有用:
在HTML模板中:
<a target="_blank" :href="url" @click.stop>your_name</a>
在安装()中:
this.url = `${window.location.origin}/your_page_name`;
使用锚标记执行此操作的最简单方法是:
<a :href="$router.resolve({name: 'posts.show', params: {post: post.id}}).href" target="_blank">
Open Post in new tab
</a>
下面的代码是打开一个带有参数的新标签。
有路由器link=
<router-link
:to="{ name: 'task_section',query: {reportId: item.task,}}"
target="_blank"> Link Text
</router-link>
现在可以访问发送的数据
this.$route.query.reportId
可以通过为 window 重定向创建一个单独的方法来实现。
const openLinkInNewTab = (url) => {
window.open(url, '_blank');
}
然后像这样在 template
上使用它
<a href="javascript:void(0)" @click="openLinkInNewTab('https://devsbuddy.com')">
Open in new tab
</a>
我有一个摘要页面和一个详细信息子页面。所有路线都使用 vue-router
(v 0.7.x) 使用如下编程导航实现:
this.$router.go({ path: "/link/to/page" })
但是,当我从摘要页面路由到子页面时,我需要在新选项卡中打开子页面,就像将 _target="blank"
添加到 <a>
标记一样。
有办法吗?
对于那些想知道答案是否定的人。 请参阅 github 上的相关 issue。
Q: Can vue-router open link in new tab progammaticaly
A: No. use a normal link.
我认为你可以这样做:
let routeData = this.$router.resolve({name: 'routeName', query: {data: "someData"}});
window.open(routeData.href, '_blank');
对我有用。
如果您像问题中所问的那样定义路线(路径:'/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'});
参考文献:
- vue-router router.resolve(location, current?, append?)
- vue-router router-link
这似乎在较新的版本(Vue Router 3.0.1)中是可能的:
<router-link :to="{ name: 'fooRoute'}" target="_blank">
Link Text
</router-link>
我认为最好的方法是简单地使用:
window.open("yourURL", '_blank');
* 飞走了 *
项目中的某处,通常是 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>
只需在您的路由文件中写入此代码即可:
{
name: 'Google',
path: '/google',
beforeEnter() {
window.open("http://www.google.com",
'_blank');
}
}
这对我有用-
let routeData = this.$router.resolve(
{
path: '/resources/c-m-communities',
query: {'dataParameter': 'parameterValue'}
});
window.open(routeData.href, '_blank');
我修改了@Rafael_Andrs_Cspedes_Basterio答案
如果您只对相对路径感兴趣,例如:/dashboard
、/about
等,请参阅其他答案。
如果你想打开一个绝对路径,比如:https://www.google.com
到一个新的选项卡,你必须知道 Vue Router 并不打算处理这些。
但是,他们似乎将其视为功能请求。 #1280。但在他们这样做之前,
Here is a little trick you can do to handle external links with 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()
}
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)
请记住,每当我们打开另一个页面到新选项卡时,我们必须使用 noopener noreferrer
.
这对我有用:
在HTML模板中:
<a target="_blank" :href="url" @click.stop>your_name</a>
在安装()中:
this.url = `${window.location.origin}/your_page_name`;
使用锚标记执行此操作的最简单方法是:
<a :href="$router.resolve({name: 'posts.show', params: {post: post.id}}).href" target="_blank">
Open Post in new tab
</a>
下面的代码是打开一个带有参数的新标签。
有路由器link=
<router-link
:to="{ name: 'task_section',query: {reportId: item.task,}}"
target="_blank"> Link Text
</router-link>
现在可以访问发送的数据
this.$route.query.reportId
可以通过为 window 重定向创建一个单独的方法来实现。
const openLinkInNewTab = (url) => {
window.open(url, '_blank');
}
然后像这样在 template
上使用它
<a href="javascript:void(0)" @click="openLinkInNewTab('https://devsbuddy.com')">
Open in new tab
</a>