keep-alive

keep-alive的应用场景
keep-alive是 Vue 内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染。
在vue 2.1.0 版本之后,keep-alive新加入了两个属性: include(包含的组件缓存) 与 exclude(排除的组件不缓存,优先级大于include) 。
 
如果未使用keep-alive组件,则在页面回退时仍然会重新渲染页面,触发created钩子,使用体验不好。 在以下场景中使用keep-alive组件会显著提高用户体验,菜单存在多级关系,多见于列表页+详情页的场景如
  • 商品列表页点击商品跳转到商品详情,返回后仍显示原有信息
  • 订单列表跳转到订单详情,返回,等等场景。
<keep-alive include='include_components' exclude='exclude_components'>
    <component>
        <!-- 该组件是否缓存取决于include和exclude属性 --> 
    </component>
</keep-alive>

 参数解释
  include - 字符串或正则表达式,只有名称匹配的组件会被缓存
  exclude - 字符串或正则表达式,任何名称匹配的组件都不会被缓存
  include 和 exclude 的属性允许组件有条件地缓存。二者都可以用“,”分隔字符串、正则表达式、数组。当使用正则或者是数组时,要记得使用v-bind 。 

 使用示例:
<!-- 逗号分隔字符串,只有组件a与b被缓存。 -->
    <keep-alive include="a,b">
      <component></component>
    </keep-alive>
    
    <!-- 正则表达式 (需要使用 v-bind,符合匹配规则的都会被缓存) -->
    <keep-alive :include="/a|b/">
      <component></component>
    </keep-alive>
    
    <!-- Array (需要使用 v-bind,被包含的都会被缓存) -->
    <keep-alive :include="['a', 'b']">
      <component></component>
    </keep-alive>
 
keep-alive的生命周期
  • 初次进入时:created > mounted > activated;退出后触发 deactivated
  • 再次进入:会触发 activated;事件挂载的方法等,只执行一次的放在 mounted 中;组件每次进去执行的方法放在 activated 中
 
页面只刷新一次,任何页面跳转到这个页面都不刷新
方法一: 直接在你的router-view 标签外面 包裹一个 keep-alive标签, 加 include="组件名称"
<keep-alive  include="FileList">
     <router-view></router-view>
</keep-alive>
这时候匹配到的组件就会值加在一次。这个就比较简单,但能使用性不广。 
 方法二: (keep-alive与vue-router配合使用)
配置路由器的时候 需要加 keepAlive: true 参数
    {
       path: 'Loading',//等待页面
       component: Loading,
       meta: {
         requireAuth: true, // requireAuth属性作用是表明该路由是否需要登录验证,在进行全局拦截时,我们将通过该属性判断路由的跳转,该属性包含在meta属性中:
         keepAlive: false, //此组件不需要被缓存false 需要缓存为true
   }
 
配置入口文件
<keep-alive>
     <router-view v-if="$route.meta.keepAlive">
     <!-- 这里是会被缓存的视图组件,比如 Home! -->
    </router-view>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"></router-view>
       <!-- 这里是不被缓存的视图组件,比如 Edit! -->
之后在 router.beforeEach  方法里面来动态修改 keepAlive  的值 
 
router.beforeEach((to, from, next) => {
  iView.LoadingBar.start();//loadong 效果
 
  //进入登录页面的时候清除 token
  if(to.path === '/login' ){
    sessionStorage.removeItem("token", '');
    sessionStorage.removeItem("user_Data", '');
  }
  store.state.token = sessionStorage.getItem('token');//获取本地存储的token
  if (to.meta.requireAuth) {  // 判断该路由是否需要登录权限
    if (store.state.token !== "" && store.state.token !== null) {  // 通过vuex state获取当前的token是否存在
      //判断是否需要缓存
      if(to.path === '/filelist' && from.path === '/fileview'){
        to.meta.keepAlive = true;  // 让 列表页 缓存,即不刷新
        next();
      }else {
        to.meta.keepAlive = false;  // 让 列表页 即不缓存,刷新
        next();
      }
    }else {
      next({
        path: '/login',
        query: {redirect: from.fullPath}  // 将跳转的路由path作为参数,登录成功后跳转到该路由
      })
    }
 
  }else {
    next();
  }
})

我这里只判断  to.path === '/filelist' && from.path === '/fileview' (翻译从文一下这个代码,本路径是fileview,要跳转的路径是filelist,也就是从fileviewlu路径跳转到filelist,不刷新filelist页面)表页的时候缓存。

这里我们就可以愉快的使用之前缓存是数据了。

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a
原文地址:https://www.cnblogs.com/maxiag/p/13390672.html