vc-keep-alive给keep-alive一个小升级

Github
Live Demo

主要修改了 keepAlive 的缓存机制, 可以像 APP 那样前进刷新, 返回销毁, 支持动态路由和功能性路由

keepalive.gif

改变了keepAlive的缓存机制, 可以像 APP 那样前进重建, 返回销毁
不过目前仅仅用于Page级别, 也就是一级路由, 其他级路由似乎没有需要
原本的keepAlive默认是以componentName来做缓存的 key
当然如果有vnode.key的话则会使用vnode.key, 所以网上很多通过$route.fullPath当作 key
可以实现params/query的变更新建组件, 但是无法做到返回销毁
如果使用$destroy()去手动销毁, 但是keepAlive里面还是存在缓存标记
导致从 3 级路由返回到 2 级路由时拿缓存的instance是失效的, 进而导致重建
所以通过Page前进返回行为分析, 总结出 key 的生成规则

解决的痛点

  1. 子路由的更新和父级路由无关, 所以一级路由的缓存 key 是命中路由的父一级路由相关, 目前是父路由的 path + 父子路由相同的 params
  2. 还有就是自己功能性路由的支持
    1. 比如使用支持返回键的 imgsViewer, 需要 history 压栈而不触发 forward/backward 事件, 所以提供了 ignorePaths 参数
    1. 比如子路由不使用 router-view 来渲染, 而是使用 view-pager 来自行控制,
      支持左右滑动切换, 如果 view-pager 的页面状态是需要保存到 url, 则需要一级路由的一个动态路由占位符, 充当子路由, 所以提供了 ignoreParams 参数

Props

参数 类型 默认值 可选值 描述
ignorePaths Array, String, RegExp 忽略符合条件的 URL,不压栈
ignoreParams Array, String 忽略动态路由参数,不参与 key 的构成

Events

事件名 参数 描述
init Info 组件初始化的时候
forward Info 路由前进的时候
replace Info 路由替换的时候
backward Info 路由返回的时候

Event Params: Info

参数 类型 描述
fromPath String 变化前 path
nextPath String 变化后 path
fromRouterKey String 变化前 key
nextRouterKey String 变化后 key

注: vc-keep-alive 将会把历史栈储存在 SessionStorage 的__VCKEEPALIVE__字段里

Demo Code

npm install vc-keep-alive
<template>
  <div id="app" :class="pageAct">
    <transition name="page-slide">
      <vc-keep-alive
        :ignorePaths="ignorePaths"
        :ignoreParams="ignoreParams"
        @init="log('init', $event)"
        @forward="log('forward', $event)"
        @replace="log('replace', $event)"
        @backward="log('backward', $event)"
      >
        <router-view />
      </vc-keep-alive>
    </transition>
  </div>
</template>

<script>
import Vue from 'vue';
import VcKeepAlive from 'vc-keep-alive';

Vue.use(VcKeepAlive);

export default {
  data() {
    return {
      pageAct: '',
      ignorePaths: ['popup='],
      ignoreParams: ['pagerTab']
    };
  },

  methods: {
    log(act, args) {
      console.log(act, args);
      this.pageAct = 'page-' + act;
    }
  }
};
</script>

TODO

License

MIT 一起来扣细节~

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

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,145评论 1 32
  • 1 写这篇博客的初衷 首先一句话概括:我想把这几个月做的事情记录下来,并且希望尽量详细,希望读者读了这篇文章能够知...
    格老子阅读 2,683评论 1 56
  • 一、具体需求: 1. 页面布局 左侧导航,右侧侧边辅助菜单,中间主业务界面;左侧导航是根据用户权限动态生成的。 2...
    环零弦阅读 8,855评论 0 3
  • 投射儿子好好利用这一个星期时间把老师讲的知识点认真复习并牢牢记住,期末考试好成绩。 投射儿子认真完成作业,多刷题练...
    冯梅fm阅读 128评论 0 1
  • 4点56分,我扔掉手机,打开简书,开始写作。 就在昨晚,听完樊登讲书的最后一分钟,他的一句话最终又扎到我的内心,激...
    梅子Mey阅读 5,818评论 8 31