vue-router.mjs:74 [Vue Router warn]: <router-view> can no longer be used directly inside <transition

报错信息:

警告信息指出 <router-view> 不再能直接在 <transition> 或 <keep-alive> 中使用,因为它需要通过插槽(slot)的方式来配合这些组件使用。在你当前的代码中,你尝试使用 v-slot="News" 是不正确的,因为 v-slot 的值应该是插槽的名字(如果有命名插槽的话),但 <router-view> 并没有一个名为 "News" 的插槽。

另外,你的代码尝试根据路由的 meta.keepAlive 属性来决定是否使用 <keep-alive> 来包裹 <router-view>,但是这种方式在 Vue Router 3.x 中是直接可以使用的,但在 Vue Router 4.x 中由于引入了插槽,需要不同的方式来处理。

下面是一个 Vue Router 4.x 兼容的示例,展示了如何根据路由的 meta.keepAlive 属性来决定是否使用 <keep-alive>

<template>  
<div>  
    <h2>我是Home的内容</h2>  
    <div>  
        <ul class="nav nav-tabs">  
            <router-link class="list-group-item" active-class="active" to="/MyHome/news">News</router-link>  
            <router-link class="list-group-item" active-class="active" to="/MyHome/message">Message</router-link>  
        </ul>  
    </div>  
  
    <!-- 使用作用域插槽(scoped slot)来决定是否使用 <keep-alive> -->  
    <router-view v-slot="{ Component }">  
        <keep-alive>  
            <component :is="Component" v-if="$route.meta.keepAlive" />  
        </keep-alive>  
        <component :is="Component" v-if="!$route.meta.keepAlive" />  
    </router-view>  
</div>  
</template>  
  
<script>  
export default {  
    name: 'MyHome',  
    beforeDestroy() {  
        console.log("Home被销毁了")  
    },  
}  
</script>  
  
<style>  
/* 样式 */  
</style>

注意,这里我们使用了 <router-view> 的作用域插槽,并且检查了 $route.meta.keepAlive 来决定是否使用 <keep-alive> 包裹 <component>。当 meta.keepAlive 为 true 时,组件会被 <keep-alive> 包裹;否则,直接渲染 <component>

但是,通常你不需要在父组件(这里是 MyHome.vue)中处理 <keep-alive>,因为你可以直接在路由配置中为每个路由设置 meta.keepAlive 属性,然后在 App.vue 或其他顶层组件中统一处理 <keep-alive>。例如:

<!-- App.vue -->  
<template>  
  <div id="app">  
    <router-view v-slot="{ Component }">  
      <keep-alive>  
        <component :is="Component" v-if="$route.meta.keepAlive" />  
      </keep-alive>  
      <component :is="Component" v-if="!$route.meta.keepAlive" />  
    </router-view>  
  </div>  
</template>

然后在路由配置中为每个路由设置 meta.keepAlive

// router.js  
const routes = [  
  {  
    path: '/MyHome/news',  
    component: News,  
    meta: { keepAlive: true }  
  },  
  {  
    path: '/MyHome/message',  
    component: Message,  
    meta: { keepAlive: false }  
  },  
  // 其他路由...  
];

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值