首页 > 其他分享 >vue3中使用keepAlive缓存路由组件不生效的问题解决

vue3中使用keepAlive缓存路由组件不生效的问题解决

时间:2024-07-29 21:17:37浏览次数:14  
标签:缓存 const alive keep vue3 组件 路由 keepAlive

在 Vue 3 中使用 keep-alive 缓存路由组件时,可能会遇到一些问题导致缓存不生效。以下是一些常见的问题及其解决方案:

  1. keep-alive 写法错误
    在 Vue 3 中,使用 keep-alive 需要将 router-view 包裹在 keep-alive 中,并通过插槽传递组件。例如:

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

    这样可以确保页面状态被缓存 。

  2. include 属性使用错误
    keep-aliveinclude 属性需要指定组件的名称,而不是路由的名称。在 Vue 3 中,组件的名称可以通过 <script setup name="ComponentName"> 来指定。例如:

    <script setup name="TemplateAllocation"></script>
    

    然后在 keep-alive 中使用:

    <keep-alive :include="['TemplateAllocation']">
      <component :is="Component"></component>
    </keep-alive>
    

    确保 include 中使用的是组件的名称,而不是路由的名称 。

  3. 多层嵌套路由缓存问题
    在多层嵌套路由中,可以通过将所有 router-view 都通过 keep-alive 包裹起来,并使用 includeexclude 属性来判断是否需要缓存。例如:

    <template>
      <router-view v-slot="{ Component }">
        <keep-alive :include="cacheList">
          <component :is="Component" :key="route.fullPath" />
        </keep-alive>
      </router-view>
    </template>
    <script>
    import { useRoute } from 'vue-router'
    import useStore from '@/store';
    import { storeToRefs } from 'pinia';
    const route = useRoute()
    const { tagview } = useStore()
    const { cacheList } = storeToRefs(tagview)
    </script>
    

    这样可以实现嵌套路由的缓存 。

  4. 动态组件缓存问题
    如果多个路由使用同一个组件,可以通过动态修改组件的名称来解决缓存问题。例如:

    <router-view v-slot="{ Component, route }">
      <keep-alive :include="[...visitedViewPaths]">
        <component :is="formatComponentInstance(Component, route)" />
      </keep-alive>
    </router-view>
    <script>
    function formatComponentInstance(Component, route) {
      let wrapper;
      const wrapperName = route.path;
      if (wrapperMap.has(wrapperName)) {
        wrapper = wrapperMap.get(wrapperName);
      } else {
        wrapper = {
          name: wrapperName,
          render() {
            return h(Component);
          }
        };
        wrapperMap.set(wrapperName, wrapper);
      }
      return wrapper;
    }
    const wrapperMap = new Map();
    </script>
    

    这样可以确保每个路由的组件实例都有唯一的名称,从而正确缓存 。

通过以上方法,可以解决 Vue 3 中使用 keep-alive 缓存路由组件不生效的问题。

标签:缓存,const,alive,keep,vue3,组件,路由,keepAlive
From: https://www.cnblogs.com/suducn/p/18331108

相关文章

  • 缓存优化(缓存击穿和缓存雪崩)
    缓存优化(缓存击穿和缓存雪崩)缓存击穿和缓存雪崩缓存击穿缓存击穿是指用户查询的数据在缓存中不存在,但是后端数据库中却存在。这种现象一般是由于缓存中的某个键过期导致的,比如一个热点数据键,它每时每刻都在接受大量的并发访问,如果某一刻这个键突然失效了,那么就会导致大量的并......
  • js vue3 vue2鼠标单击事件复制指定内容到粘贴板
    借助原生JavaScript的 navigator.clipboard.writeText() 方法来时(要求页面是在用户交互的上下文中,比如点击事件处理程序中调用)如:点击列表的复制按钮,得到指定列(data)的值到粘贴板<template><div><button@click="click">复制文本</button></div></templ......
  • React 的 KeepAlive 实战指南:深度解析组件缓存机制
    Vue的Keep-Alive组件是用于缓存组件的高阶组件,可以有效地提高应用性能。它能够使组件在切换时仍能保留原有的状态信息,并且有专门的生命周期方便去做额外的处理。该组件在很多场景非常有用,比如:·tabs缓存页面·分步表单·路由缓存在Vue中,通过KeepAlive包裹内的组件......
  • Vue3-如何自己写一个“返回顶部”功能
    功能描述:在屏幕的右下角固定一个“返回顶部”按钮,只有当用户滚动屏幕一定程度后出现,否则隐藏。点击按钮,网页平滑的滚动到页面顶部。环境:Vue3,js,antd具体思路:1、给窗口挂载滚动事件,监听视口的滚动,当滚动距离超出设定阈值后,出现按钮。2、点击按钮,滚动窗口。具体代码:<tem......
  • Vue3 - 最新详细实现安装使用 Google 谷歌地图教程,提供搜索城市名称及地点(搜索关键字
    前言如果您需要Vue2版本,请访问这篇文章。在vue3|nuxt3网站开发中,详解实现接入谷歌google地图申请密钥及相关配置完整流程,附带使用谷歌地图相关功能示例代码,支持地图渲染展示、在地图上标点、全球地图搜索及搜索框相关联想关键词、地图导航、用户当前位置经纬度......
  • 70%的人都答错了的面试题,vue3的ref是如何实现响应式的?
    前言最近在我的vue源码交流群有位面试官分享了一道他的面试题:vue3的ref是如何实现响应式的?下面有不少小伙伴回答的是Proxy,其实这些小伙伴只回答对了一半。当ref接收的是一个对象时确实是依靠Proxy去实现响应式的。但是ref还可以接收 string、number 或 boolean 这样的......
  • 缓存优化(缓存穿透)
    缓存优化(缓存穿透)缓存穿透缓存穿透是指查询一个一定不存在的数据时,数据库查询不到数据,也不会写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,可能导致数据库崩溃。这种情况大概率是遭到了攻击。常见的解决方案有:缓存空数据,使用布隆过滤器等。当前项目中存在的......
  • vue2 - 详细实现“视频切片/分段加载“播放大视频,解决视频过大加载播放缓慢问题,vue处
    效果图在vue2、nuxt2项目开发中,详解vue视频分片加载,所谓“边播放边加载”,利用axios分段请求后端服务器每次只拿一小段视频慢慢缓存播放,让非常大的视频(例如电影,很长的视频播放太慢)流畅播放,vue2实现将video视频进行切片网络请求加载提升视频加载速度,详细解决视频分段下载......
  • Memcached跨平台性能解码:操作系统对缓存速度的影响
    Memcached跨平台性能解码:操作系统对缓存速度的影响在分布式缓存系统的设计和部署中,Memcached因其轻量级和高性能而成为首选方案之一。然而,Memcached在不同操作系统上的性能表现可能会有显著差异。本文将深入探讨这些差异的原因,并提供实际的测试方法和代码示例,帮助系统架构......
  • 科普文:详解 JuiceFS 读性能:预读、预取、缓存、FUSE 和对象存储
    在高性能计算场景中,往往采用全闪存架构和内核态并行文件系统,以满足性能要求。随着数据规模的增加和分布式系统集群规模的增加,全闪存的高成本和内核客户端的运维复杂性成为主要挑战。JuiceFS,是一款全用户态的云原生分布式文件系统,通过分布式缓存大幅提升I/O吞吐量,并使用成本......