如何在 Vue 3 中使用 router-view 使某些组件“保持活动”?

Pav*_*rić 11 javascript vue.js vue-router vuejs3 vue-router4

我创建了一个由两个主要组件组成的小应用程序,我使用 vue 路由器在组件之间进行路由。

第一个组件称为 MoviesList,第二个组件称为 Movie。我已将它们注册到routes js 文件中。

const routes = [
  {
    path: '/',
    name: 'Home',
    component: MoviesList
  },

  {
    path: '/:movieId',
    name: 'Movie',
    component: Movie
  }
  
]
Run Code Online (Sandbox Code Playgroud)

我的 App.vue 模板如下所示

<template>
   <router-view></router-view>
</template>
Run Code Online (Sandbox Code Playgroud)

如何使 MovieList 组件缓存起来,或者说它是用<keep-alive>标签包裹的?期望的结果是缓存 MovieList 组件,而不缓存 Movie 组件。

我想这样做,因为 MovieList 组件有一个在 Mounted() 钩子上运行的方法,每当我切换路由并返回时,该方法都会再次运行,因为组件被重新渲染。

小智 19

试试这个include="MoviesList",或者exclude="Movie"也可以

<router-view v-slot="{ Component }">
  <keep-alive include="MoviesList">
    <component :is="Component" />
  </keep-alive>
</router-view>
Run Code Online (Sandbox Code Playgroud)

  • 确保您的组件设置了名称(`export default { name: '...'}`) - 基于组件文件名的默认名称将不起作用。另外,有关 router-view 新插槽 api 的更多信息如下:https://next.router.vuejs.org/api/#router-view-sv-slot (5认同)
  • 另外 - 如果您使用脚本设置,则需要在“&lt;script setup&gt;”和“export default { name: 'MoviesList' }”上方添加另一个“&lt;script&gt;”标记,因为否则它不起作用。`script setup` 不会显式设置组件名称。请参阅 https://github.com/vuejs/rfcs/discussions/273?sort=top (3认同)

Bou*_*him 6

尝试使用keep-aliveinsiderouter-view并根据当前组件有条件地渲染它:

<router-view v-slot="{ Component }">
 <template v-if="Component.name==='movie-list'">
    <keep-alive>
      <component :is="Component" />
    </keep-alive>
 </template>
<template v-else>
     <component :is="Component" />
</template>

</router-view>
Run Code Online (Sandbox Code Playgroud)