将对象作为参数传递给 router.push (vue-router@4.05)

Pass an object as param to router.push (vue-router@4.05)

问题

router.push({name:"Order", params: {obj: {}}) 无法推送 obj: {},而是路由接收 obj: '[object Object]'

情况

我有这样的路由设置

{
    path: '/Order',
    name: 'Order',
    component: () => import("../views/Order.vue"),
    props: route => {
      return route.params.obj //  '[object Object]'
    },
 }

这导致道具未在 Order.vue

中定义

预期结果

{
    ...
    props: route => {
      return route.params.obj //  '{}'
    },
}

基于 对象在旧版本中工作

我测试了什么

我用 jest 检查了传递给 router.push 的参数,它们按应有的方式显示:{name:"Order", params: {obj: {}}

有什么想法吗?

在 Vue-router

never supported 将对象传递给 params

它在 Router v3 中与 $router.push 一起工作 - 目标组件接收到对象。 但是 一旦用户开始使用浏览器导航(后退按钮)或 copy/pasting URL,这个解决方案就失效了(你可以试试 here - 只需单击按钮,然后使用框架的后退和前进控件)

根据经验 - 如果您想将 任何东西 传递给目标 route/component,此类数据必须在路由定义中定义为参数,以便它可以直接包含在URL中。备选方案是在存储中传递数据、查询参数(对象需要使用 JSON.stringify 序列化)或使用历史状态。

Vue-router v3 是这样,Vue-router v4 也是如此

备注

只是为了解释备选方案。我所说的“商店”不仅仅指 Vuex。我知道 Vuex 对于一些小型应用程序来说可能有点矫枉过正。我个人比较喜欢Pinia over existing Vuex. And you can create global state solution yourself with composition API很容易...