Vue3 多路由指向同一组件 实现keep-alive缓存页面的解决方案

    最近在项目开发中正好遇到多路由指向同一组件无法实现页面缓存,网上很多keep-alive的实现方案都是通过name属性去实现的(设置路由的

name与页面的name一致,通过getCahes加载缓存的名称),但是由于多路由指向同一组件的情况无法显示的去设置组件的name。

通过name实现keep-alive

    解决方案一:

        路由meta中添加一个keepAlive的参数去控制缓存,并且给组件设置key=route.fullpath去做区分,通过v-if去控制缓存,不再通过name。修改方

案如下图:(这种写法会导致关闭这个页面后再次进入依然有缓存的情况,比较坑的是keep-alive没有提供手动删除缓存的方法,下面有第二种解决方案)

vue3

注释:这个Vue3的写法,Vue2写法如下:

<div id="app">

  <!--keep-alive 表示页面不会被销毁,即保持页面状态-->

  <keep-alive>

    <router-view v-if="$route.meta.keepalive"></router-view>

  </keep-alive>

  <router-view v-if="!$route.meta.keepalive"></router-view>

</div>

解决方案二:

    给component重新命名,项目涉及到多个路由调用同一个组件,只要确保路由名称唯一就行。

第一步重写名称:(给component组件重命名的方法,参考了网友的写法)

const wrapperMap = new Map()

const wrap = (name, component) => {

  let wrapper

  const wrapperName = name

  if (wrapperMap.has(wrapperName)) {

    wrapper = wrapperMap.get(wrapperName)

  } else {

    wrapper = {

      name: wrapperName,

      render() {

        return h("div", { className: "vaf-page-wrapper" }, component)

      },

    }

    wrapperMap.set(wrapperName, wrapper)

  }

  return h(wrapper)

}


第二步:修改keep-alive

 <router-view>

      <template #default="{ Component, route }">

        <keep-alive :include="getCaches">

          <component :is="wrap(route.name, Component)" :key="route.fullPath"/>

        </keep-alive>

      </template>

    </router-view>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容