如何用keep-alive做组件缓存

最近做了很多后台管理系统,其中有一个常见的需求,就是从列表页跳入详情页后,要求浏览器记住列表页之前的搜索条件和页码,使得从详情页返回列表页之后,页面不刷新,和上次的操作保持一致。
于是问题定位到组件缓存上。。。如何操作?
想到了几种方案:

  1. 使用sessionStorage,可行性没什么问题,但是这种方式有一个弊端就是:当系统列表页面特别多时,每个列表页的筛选条件(form表单)和页码都要进行一次sessionStorage存储,比较麻烦。。。
  2. 将每个列表的筛选条件和页码存入浏览器地址栏中。。(没试过)
  3. 使用keep-alive(本文重点介绍keep-alive如何使用
    结合router,缓存部分页面
  • 使用$route.meta的keepAlive属性:
<keep-alive>
    <router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"></router-view>

需要在router中设置router的元信息meta:

export default new Router({
  routes: [
    {
      path: '/pagea',
      name: 'pageA',
      component: PageA,
      meta: {
        keepAlive: false // 不需要缓存
      }
    },
    {
      path: '/pageb',
      name: 'pageB',
      component: PageB,
      meta: {
        keepAlive: true // 需要被缓存
      }
    }
  ]
})

在组件里进行判断,只有从详情页返回时才需要做缓存,其他情况不需要缓存,需要重新发送ajax请求

  1. 将浏览器上一次进入的页面存入一个全局变量中,方便后面进行判断
//  在全局路由守卫中加入这句
router.beforeEach((to, from, next) => {
    window.lastRoute = from.name
})
  1. 在组件中判断
  • 使用<keep-alive>会将数据保留在内存中,如果要在每次进入页面的时候获取最新的数据,需要在activated阶段获取数据,承担原来created钩子中获取数据的任务。
activated() {
    // 上一次访问的路由信息不是详情页时
    if (window.lastRoute && window.lastRoute !== 'detail') {
      // 初始化页面信息并重新发送ajax请求
      this.resetPageInfo()
    }
}

注:在缓存的组件里面只有第一次进入组件是才会触发created等生命周期钩子函数,再次进来时只会触发activated 和 deactivated

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 14,317评论 1 92
  • 1. 背景 vue 中有一个 keep-alive 的功能,可以将组件渲染结果缓存起来,结合 vue-router...
    书SHU阅读 6,878评论 2 10
  • vue中,我们所要实现的一个场景就是:1.搜索页面==>到搜索结果列表页时,搜索结果列表页面要重新获取数据,2.搜...
    白小纯Zzz阅读 6,920评论 0 3
  • 一:什么是闭包?闭包的用处? (1)闭包就是能够读取其他函数内部变量的函数。在本质上,闭包就 是将函数内部和函数外...
    xuguibin阅读 10,080评论 1 52
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 29,120评论 1 45

友情链接更多精彩内容