zoukankan      html  css  js  c++  java
  • Vue keep-alive&路由守卫

    一 keep-alive

    缓存组件内容,避免组件反复加载,影响效率

    (1)在路由中配置:

     添加meta:{keepAlive:true}

    {
        path: '/',
        name: 'home',
        component: Home,
        meta:{
          keepAlive:true
        }
    }
    

    其中:keepAlive是自定义属性名,meta是用来专门保存自定义属性值的配置项

    (2)  App.vue中:

      如果当前路由需要缓存($route.meta.keepAlive==true),就放在keep-alive包裹的一个router-view中;

      如果当前路由不要缓存($route.meta.keepAlive==false),就keep-alive外的一个router-view上。

    <keep-alive>
        <router-view v-if="$route.meta.keepAlive"/>
    </keep-alive>
    <router-view v-if ="!$route.meta.keepAlive"></route-view>

    此时:这个页面带有keepAlive为true的路由对应的页面,只在首次请求时,加载一次,以后的后退跳转操作,都不再重新渲染内容。

    二 路由守卫|路由钩子函数

    在发生路由跳转时,自动执行的回调函数

     

    如有需求:

        当从首页进入搜索列表页时是第一次加载,需要从服务器进行加载;然后从搜索列表页进入详情页也是第一次加载。

        但是当从详情页返回列表页,任然希望还是原来搜索到的商品,不需要从服务器加载,而是直接使用浏览器缓存的页面,此时需要keep-alive和路由守卫协同作用 

    (1)首页进入商品列表页,不需要缓存,需要重新搜索:

    index.vue(首页)中

    beforeRouteLeave(to,from,next){
        console.log(`离开首页...`);
        //如果从首页跳到products
        if(to.name=="products"){
          to.meta.keepAlive=false;
        }
        next();
    }
    

     products.vue(商品列表页)中:

    beforeRouterLeave(to,from,next){
          console.log(`离开商品列表页`);
          if(to.name=="details"){
              //如果去的是商品详情页,就缓存当前页面
              from.keepAlive=true;      
          }
    }        
    

     details.vue(商品详情页)中:

    beforeRouterLeave(to,from,next){
          console.log(`路由离开详情页面`);
          if(to.name=="products"){
                // 如果去的是原来的商品列表页,就缓存当前的压面,下次进入这个访问过的商品就不用重新加载了
                to.meta.keepAlive=true;    
          }        
    }    
    
  • 相关阅读:
    CSS实现元素居中原理解析
    Windows 下 Ionic 开发环境搭建
    JavaScript实现简单的双向数据绑定
    JavaScript之Promise对象
    前端工程师的进阶之路
    前端开发必备之chrome插件
    Javascript之Event Loop
    CentOS7 如何挂载网络设备
    mysql 全量备份以及增量备份
    zabbix 内网监控云服务器
  • 原文地址:https://www.cnblogs.com/codexlx/p/12497077.html
Copyright © 2011-2022 走看看