我有一个概览页面和一个详细子页面。所有的路由都是使用编程式导航实现的vue-router
(v 0.7.x), 类似于这样:
this.$router.go({ path: "/link/to/page" })
然而,当我从概览页面跳转到子页面时,我需要像在<a>
标签中添加_target="blank"
一样在新标签页中打开子页面。
有什么方法可以做到这一点吗?
我有一个概览页面和一个详细子页面。所有的路由都是使用编程式导航实现的vue-router
(v 0.7.x), 类似于这样:
this.$router.go({ path: "/link/to/page" })
然而,当我从概览页面跳转到子页面时,我需要像在<a>
标签中添加_target="blank"
一样在新标签页中打开子页面。
有什么方法可以做到这一点吗?
我认为你可以像这样做:
const routeData = this.$router.resolve({name: 'routeName', query: {data: "someData"}});
window.open(routeData.href, '_blank');
这对我有用。
更新
关于组合 API:
import { useRouter } from 'vue-router'
const router = useRouter();
const routeData = router.resolve({name: 'routeName', query: {data: "someData"}});
window.open(routeData.href, '_blank');
window.open(routeData.href, 'details ' + id);
- Sham Fiorin看起来在较新版本中已经可以实现了(Vue Router 3.0.1):
<router-link :to="{ name: 'fooRoute'}" target="_blank">
Link Text
</router-link>
this.$router.push()
编程方式配合使用。 - jplindstrom对于那些想知道答案的人,答案是否定的。 请参见在Github上相关的问题。
问:vue-router能否编程方式打开新标签页?
答:不行。请使用普通链接。
<router-link>
标签中添加target="_blank"
了。https://dev59.com/Z1kS5IYBdhLWcg3wVlXC#49654382 - thanksd如果您的路由定义与问题中要求的相同(路径为“/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'});
参考资料:
通常在项目中的某个地方,例如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>
这对我起作用了-
let routeData = this.$router.resolve(
{
path: '/resources/c-m-communities',
query: {'dataParameter': 'parameterValue'}
});
window.open(routeData.href, '_blank');
我修改了 @Rafael_Andrs_Cspedes_Basterio 的回答
{
name: 'Google',
path: '/google',
beforeEnter() {
window.open("http://www.google.com",
'_blank');
}
}
我认为最好的方法是简单地使用:
window.open("yourURL", '_blank');
*飞走了*
如果您只关注相对路径,比如:/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()
}
this.$router.absUrl('https://www.google.com)
请注意,每次我们在新标签页中打开另一页时,都必须使用noopener noreferrer
。
示例代码:
<a :href="$router.resolve({name: 'posts.show', params: {post: post.id}}).href" target="_blank">
Open Post in new tab
</a>
target="_blank"
。但我不确定这是否是一个好的实践方法。而且我没有任何参数。 - greenridinghood