You need to enable JavaScript to run this app. 为什么通过Vue-router传递参数时返回"[object Object]"?
优惠活动
大模型
产品
解决方案
定价
更多

为什么通过Vue-router传递参数时返回"[object Object]"?

问题原因

原因1:模板直接输出引用类型值

如果你的this.questions本身是对象/数组类型,你在接收组件的模板中直接用{{ data }}插值渲染,JS会自动调用引用类型的toString()方法,输出结果就是[object Object]。这种情况你在mounted钩子中打印的this.data应该是正常的数组/对象结构,仅模板展示异常。

原因2:Vue Router 4 未匹配动态段的params传参失效

Vue Router 4 官方已经废弃了不与路由path动态段匹配的params传参用法,你的路由path没有定义对应data参数的动态段,此时通过params传递的非动态段参数会被静默丢弃或者被路由处理为异常值,最终拿到的data不是预期的this.questions值。

解决方案

对应不同原因的解决方式如下:

  • 如果是原因1(模板展示问题):不要直接输出整个对象/数组,按需访问具体属性即可。如果this.questions是数组就用v-for遍历,是对象就写{{ data.属性名 }}访问具体字段。
  • 如果是原因2(路由传参失效),有三种可选方案:

方案1:改用query传参(适合少量非敏感数据)

把传递的参数序列化后放到query中,接收端再反序列化:
发送端代码修改:

goToQuestions() {
  this.$router.push({
    name: "QuestionsPage",
    query: {
      data: JSON.stringify(this.questions)
    },
  });
},

接收端代码修改:

props: {
  data: String
},
mounted() {
  const questionData = JSON.parse(this.data)
  console.log("解析后的参数", questionData);
},

路由配置不需要修改,注意query参数会暴露在地址栏,不要传递敏感数据,且数据量不要过大。

方案2:使用Pinia传递复杂数据(最优解)

如果是大量复杂数据或者敏感数据,用Pinia存储传递是最优解:

  1. 定义Pinia存储:
// stores/question.js
import { defineStore } from 'pinia'
export const useQuestionStore = defineStore('question', {
  state: () => ({
    transferData: null
  }),
  actions: {
    setTransferData(data) {
      this.transferData = data
    }
  }
})
  1. 发送端跳转前存值:
import { useQuestionStore } from '@/stores/question'
const questionStore = useQuestionStore()
goToQuestions() {
  questionStore.setTransferData(this.questions)
  this.$router.push({ name: "QuestionsPage" })
}
  1. 接收端直接从store取值:
import { useQuestionStore } from '@/stores/question'
const questionStore = useQuestionStore()
mounted() {
  console.log("拿到的参数", questionStore.transferData);
}

这种方式没有数据大小限制,不会暴露参数,配合Pinia持久化插件还可以实现刷新后数据不丢失。

方案3:路由配置动态段(不推荐传复杂对象)

如果一定要用params传参,可以在路由path中添加动态段,动态段参数仅支持字符串类型,因此仍需要序列化处理:
路由配置修改:

{
  path: "/questions-page/:data?",
  name: "QuestionsPage",
  props: true,
  component: () => import ('@/views/QuestionsPage.vue')
},

发送端传递时序列化:

this.$router.push({
  name: "QuestionsPage",
  params: {
    data: JSON.stringify(this.questions)
  }
})

接收端反序列化即可使用,缺点是参数会暴露在地址栏,且存在长度限制。

内容的提问来源于stack exchange,提问作者Samakaab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 20:57:03