zoukankan      html  css  js  c++  java
  • 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();
      },
    }
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    继承与组合关系
    sql decimal & float & celling 介绍
    EFDB 基本规范&知识
    html 5 video
    screen printing
    javascript array
    angular router ui bug !
    angular destroy & jquery destroy
    Google addword 策略
    规范 : angular ui router path & params
  • 原文地址:https://www.cnblogs.com/mingyeliu/p/15471739.html
Copyright © 2011-2022 走看看