Vue路由传参问题
# 路由传参问题
# query 方式
参数会在url中显示
this.$router.push({
// query方式
path: "/a",
query: {
projectDetails: val
},params 方式
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# params 方式
传参数据不会在导航栏中显示,需要配合路由的name属性使用
// params 方式
name: 'a',
params: {
projectDetails: val
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 新开页面
需要使用resolve配置
const {href} = this.$router.resolve({
path: '/a',
query: {
code: '123',
}
})
window.open(href, '_blank')
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
这里需要注意一下,使用params进行传参,在新页面内使用this.$route.params对象为{},参数无法传过来,query是可以正常传参。
我想这个应该跟我们正常打开一个链接是一样的,因为router-link的tag='a',应该是个超链接。
# 原因
params 是保存在内存中的,
window.open(detail.href, '_blank')
会打开一个新的窗口,这时候已经跟之前的 vue-router 实例没关系了open新页面,window对象是独立。拿不到数据,你可以使用query的形式,或者params放入url里面的形式
var router = new VueRouter({
mode: 'history',
routes: [
{path: '/article/detail/:article_id', name: '/detail'}
]
})
this.$router.resolve({path: `/article/detail/${article_id}`});
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
这样导致params传参的参数会显示在url地址,如何解决呢?
# 解决方案
可以通过转义为base64格式的字符串形式进行传递
传递
const info = { fileid: item.id, readOnly: item.readOnly };
const { href } = this.$router.resolve({
name: "workspace",
params: {
info: window.btoa(JSON.stringify(info)),
},
});
window.open(href, "_blank");
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
调用
JSON.parse(window.atob(this.$route.params.info));
1
这个只是我的个人想法,欢迎指正。
如果遇到这种情况,不想参数在url上显示且必须要传的话,也可以借用浏览器的缓存来实现。
在父页面写入缓存,在子页面从缓存中读取,读取之后再删除。
当然如果还有更好的解决方案,欢迎留言。
最后
我是觉得,如果遇到困难,暂时无法解决,可以选择曲线救国,疑难杂症后续有时间在深入研究。
编辑 (opens new window)
上次更新: 2021/12/06, 21:28:32