跳至内容

RouterView 插槽

RouterView 组件公开了一个插槽,可用于渲染路由组件

模板
<router-view v-slot="{ Component }">
  <component :is="Component" />
</router-view>

上面的代码等同于使用 <router-view /> 而不使用插槽,但当我们想要使用其他功能时,插槽提供了额外的灵活性。

KeepAlive 和 Transition

在使用 KeepAlive 组件时,我们通常希望它保持路由组件的活动状态,而不是 RouterView 本身。我们可以通过将 KeepAlive 放置在插槽内来实现这一点

模板
<router-view v-slot="{ Component }">
  <keep-alive>
    <component :is="Component" />
  </keep-alive>
</router-view>

类似地,插槽允许我们使用 Transition 组件在路由组件之间进行过渡

模板
<router-view v-slot="{ Component }">
  <transition>
    <component :is="Component" />
  </transition>
</router-view>

我们也可以在 Transition 内使用 KeepAlive

模板
<router-view v-slot="{ Component }">
  <transition>
    <keep-alive>
      <component :is="Component" />
    </keep-alive>
  </transition>
</router-view>

有关将 RouterView 与 Transition 组件一起使用的更多信息,请参阅 过渡 指南。

传递 props 和插槽

我们可以使用插槽向路由组件传递 props 或插槽

模板
<router-view v-slot="{ Component }">
  <component :is="Component" some-prop="a value">
    <p>Some slotted content</p>
  </component>
</router-view>

实际上,这通常不是我们想要做的事情,因为路由组件都需要使用相同的 props 和插槽。有关传递 props 的其他方法,请参阅 向路由组件传递 props

模板引用

使用插槽允许我们直接在路由组件上放置一个 模板引用

模板
<router-view v-slot="{ Component }">
  <component :is="Component" ref="mainContent" />
</router-view>

如果我们改为将引用放在 <router-view> 上,则引用将填充 RouterView 实例,而不是路由组件。