vue-router之keep-alive

 
<keep-alive>是Vue的内置组件,能在组件切换过程中将状态保留在内存中,防止重复渲染Dom.
 
目的:
vue-cli 构建的vue 单页面应用,某些特定的页面,实现前进刷新,后退不刷新。
 
注意:
    此处的刷新特指当进入此页面时,出发ajax/axios请求,向服务器获取数据。
    不刷新特指当进入此页面时,不出发ajax/axios 请求,而是使用之前缓存的数据,以便减少服务器请求,用户体验更流畅。
 
实现思路:
用 keep-alive 及 scrollBehavior 完美解决。
1、在app.vue文件中,给路由加上 keep-alive
<template>
  <div id="app">
    <keep-alive>
     <!-- 使用缓存的视频组件 keepAlive true:需要被缓存 false:不需要缓存 -->
      <router-view v-if="$route.meta.keepAlive"></router-view>
    </keep-alive>
    <!-- 不使用缓存的视频组件 keepAlive true:需要被缓存 false:不需要缓存 -->
    <router-view v-if="!$route.meta.keepAlive"></router-view>
  </div>
</template>

 

2、在router/index.js 中添加 路由元信息,设置需要缓存的页面
routes: [
    {
      path: "/",
      name: "home",
      component: () => import("@/pages/tabBar/home"), //首页
      meta: {
        keepAlive: true, // 判断组件是否需要被缓存 true:需要被缓存 false:不需要缓存
        isKeepAlive: false // 用户判断上一级页面是哪个
      }
    },
    {
      path: "/assets",
      name: "assets",
      component: () => import("@/pages/tabBar/assets"), //资产
      meta: {
        keepAlive: true, // 判断组件是否需要被缓存 true:需要被缓存 false:不需要缓存
        isKeepAlive: false // 用户判断上一级页面是哪个
      }
    }
]

 

3、然后在需要的页面进行设置 如 home.vue
export default {
  data () {
    return {
      isFirstEnter:false,
    }
  },
  created () {
    this.isFirstEnter = true;
  },
  activated() {
    // 只有第一次进入或者刷寻页面后才会执行此钩子函数
    if(!this.$route.meta.isKeepAlive || this.isFirstEnter){
      // 如果isKeepAlive是false,表明需要获取新数据,否则就不再请求,直接使用缓存的数据
      this.getData(); // 获取首次刷新数据
    }
    // 恢复成默认的false,避免isKeepAlive一直是true,导致下次无法获取数据
    this.isFirstEnter = false;
    this.$route.meta.isKeepAlive = false
  },
  beforeRouteEnter(to, from, next) {
    // 判断是哪个页面跳转,判断争取表明当前页面不需要刷新获取新数据,直接用之前缓存的数据即可
    if (from.name == "assets") {
      to.meta.isKeepAlive = true;
    }
    next();
  },
}

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2021-10-27 17:19  明夜琉  阅读(862)  评论(0编辑  收藏  举报