Vue 路由器:如何将数据传递给默认/初始路由

Vue router: how to pass data to default/ initial route

我有一个像这样设置的 vue 路由器配置:

[
    {
        name: 'home',
        path: '/',
        component: HomeComponent,
        props: true,
    },

    {
        name: 'detail',
        path: '/detail/:id',
        component: DetailComponent,
        props: true,
    }
]

包含此配置的应用执行以下操作:

  1. 查询 API 以获得 object Foo
  2. 显示 header 以及来自 Foo
  3. 的一些信息
  4. 呈现默认 ("home") 路线,其中包含来自 Foo 的更多信息和用户可以单击以访问详细路线的 Bar 项目列表(包含在 Foo 中)。

问题是如何在第一次加载时将 Foo 数据传递到 home 路由?由于 API 是应用程序组件的一部分(作为 this.api - 不是全局的)我不能在路由器配置中硬编码 home 的道具;由于我无法在 beforeRouteEnter 中引用此内容,因此我无法在路由到家之前使用 this.api 执行请求。

我试过:

  1. 通过 <router-view :foo="myFoo" /> 传递 Foo - 这没有任何效果。
  2. Re-routing 加载 Foo 后通过 this.$router.push()this.$router.replace() 返回主页。这同样没有效果,即使 $forceUpdate.

我考虑过:

  1. 通过应用 beforeRouteLeave() 导航守卫中的 next() 传递数据。这充其量让我觉得很脆弱,因为我将不得不考虑每条获得 foo 道具的特定路线。
  2. 涉及秘密隐藏路线和其他魔法的任何数量的可怕黑客攻击。

我还怀疑我将面临与任何深层链接相同的问题,因为应用程序还必须在将其传递给 per-route 组件之前获取 foo。

所以。如何在页面加载时通过道具将数据从 top-level 应用程序传递到任何给定的路由?

不清楚您是如何获得 Foo 对象的,但假设您是在 App.vue 中的 mounted() 挂钩中获得它,您可以将它发送到 Home 通过 Vuex 存储的组件:

方法一

App.vue

mounted () {
  this.foo = getFoo()
},
computed: {
  foo: {
    get () {
      return this.$store.state.foo
    },
    set (value) {
      // commit or dispatch the object to store
    }
  }
}

Home.vue

<div>{{foo}}</div>
computed: {
  foo () {
    return this.$store.state.foo
  }
}

方法 2 - 使用 eventBus

创建名为 eventBus.js 的文件:

eventBus.js

import Vue from 'vue'
export const eventBus = new Vue()

在你的 main.js 中导入创建的事件总线,如果你想让它在全球可用,你可以在其中导入 Vue 并将其添加到 Vue 原型中:

Main.js

import { eventBus } from './eventBus'

Vue.prototype.$eventBus = eventBus

App.vue

mounted () {
  this.foo = getFoo()
  // Send foo via event bus
  this.$eventBus.$emit('transferFoo', this.foo)
}

Home.vue

<div>{{foo}}</div>
data () {
  return {
    foo: {}
  }
},
mounted () {
  this.$eventBus.$on('transferFoo', data => {
    this.foo = data
  })
}