vue3 使用KeepAlive缓存,多个路由使用同一个组件

news/2024/7/3 2:19:22

项目使用KeepAlive缓存页面,页面内容根据参数来显示区分,所以出现多个路由指向同一个组件,缓存就不生效了。

解决思路

  • 1、动态路由渲染时,给组件套一个空壳,设置不一样的name。
  • 2、动态路由渲染时,复制一个仅name不同的组件,或者修改组件的name。(未使用,仅验证过可行性)

思路一实现:

// dynamicRouteComponet.tsx
import { defineComponent, defineAsyncComponent } from 'vue'

export const dynamicRouteComponet = (componentOption, routeName) => {
  return defineComponent({
    name: routeName,
    components: {
      comp: defineAsyncComponent(componentOption)
    },
    setup() {
      return () => {
        return <comp></comp>
      }
    }
  })
}
data.component = dynamicRouteComponet(comModule, route.name)

思路二实现

//组件地址必须是字符串,如果是动态的可以使用if判断,要给组件仅呈现一个根元素,不然会有警告异常,直接修改组件的name不会有警告
data.component = () => createCustomComponent(import('../views/...'), route.name)

//警告信息
//Component "default" in record with path "/dashboard/workplace" is a function that does not return a Promise. If you were passing a functional component, make sure to add a "displayName" to the component. This will break in production if not fixed.
//复制组件
import { h, onMounted, shallowRef } from 'vue'
export const createCustomComponent = (component, name) => {
  return {
    name,
    setup() {
      const comp: any = shallowRef(null)
      onMounted(async () => {
        if (component instanceof Promise) {
          try {
            const module = component
            console.log(module)
            comp.value = (await module)?.default
          } catch (error) {
            console.error(`can not resolve component ${name}, error:`, error)
          }
          return
        }

        comp.value = component
      })

      return () => {
        console.log(comp.value)
        return comp.value ? h(comp.value) : null
      }
    }
  }
}
data.component = () => dynamicComponent(import('../views/Dashboard/Workplace.vue'), route.name)
//修改组件名称
export const dynamicComponent = (component, routeName) => {
  return component.then((comp) => {
    if (comp && comp.default) {
      return { ...comp.default, name: routeName }
    }
    return comp
  })
}

http://lihuaxi.xjx100.cn/news/1292452.html

相关文章

卷积基础知识总结

卷积层是卷积神经网络中的核心模块&#xff0c;**卷积层的目的是提取输入特征图的特征&#xff0c;**如下图所示&#xff0c;卷积核可以提取图像中的边缘信息。卷积也成为过滤器&#xff0c;即Filter 1 卷积的计算方法 卷积运算本质上就是在滤波器和输入数据的局部区域间做点…

csproj文件常用设置及C#注释常用写法

csproj文件常用设置及C#注释常用写法 .NET新版SDK风格的csproj文件 打开可为空警告 <PropertyGroup><Nullable>enable</Nullable> </PropertyGroup>启动全局引用using 下图没有任何using&#xff0c;仍然不报错 <PropertyGroup><Implicit…

vue加element-ui实现前端表格分页

如果不从后台请求数据&#xff0c;那么就需要在前端手动管理数据。可以使用以下步骤实现该功能&#xff1a; 在 Vue 组件的 data 中定义一个数组来存放所有数据&#xff08;不分页&#xff09;。 data() {return {allData: [], // 所有数据currentPage: 1, // 当前页数pageSi…

Java 引用传递

引用传递是 Java 中一个重要的概念&#xff0c;它与值传递不同&#xff0c;可以使得函数或方法可以修改传入的对象。本文将介绍 Java 中的引用传递&#xff0c;包括其定义、实现方式、与值传递的区别以及示例代码。 什么是引用传递 在 Java 中&#xff0c;变量可以存储基本类…

Character类(Java)

文章目录 1. 介绍2. 分析3. 方法3.1 isDigit()方法 --- isLetter()方法3.2 xxxx()方法3.2 xxxx()方法 1. 介绍 A. 类介绍&#xff1a;   Character 类在对象中包装一个基本类型 char 的值。Character 类型的对象包含类型为 char 的单个字段。 2. 分析 A. 类包结构&#xff1a…

centos磁盘扩容

解释 PE - 物理块&#xff08;Physical Extent&#xff09; 硬盘上有很多实际物理存在的存储块PV - 物理卷 &#xff08;Physical Volume&#xff09; 物理卷处于最底层&#xff0c;它可以是实际物理硬盘上的分区&#xff0c;也可以是整个物理硬盘(相当于单独做一个分区)&…

Bokeh 绘图基础与常用功能

Reference | Getting started with Bokeh – Medium Post 在 Github 上查看交互式的绘图结果 | Bokeh 绘图入门 – Posted by Paradise 在这篇文章中&#xff0c;从最基本的绘图开始&#xff0c;逐步学习 Bokeh 中常用的绘图功能&#xff0c;目标是能满足大部分基础的绘图需求。…

关于在容器中,nignx代理后端多个服务如何保证后端服务的地址不变呢?

关于在容器中&#xff0c;nignx代理后端多个服务如何保证后端服务的地址不变呢&#xff1f; 有什么方法 第一种 如果你的后端服务的IP地址不会随着每一次的版本迭代而发生变化&#xff0c;那么就相当于host network 第二种 如果你的后端服务的IP地址每次都会发生变化 &#xf…