VueVue3.x & Ant-Design-Vue

Vue<keep-alive实现页面缓存>

2019-08-06  本文已影响6人  誰在花里胡哨

在Vue当中,正常流程就是在切换路由时进行页面加载,每次的切换都要重新调用后端接口,但有时候在数据分页的情况下,你是不希望有这种现象出现的(在第3页打开的数据,切下路由回来就没了,还要我重新加载,坑~~)

这时候就可以用到keep-alive实现页面的缓存,避免路由切换造成不必要的麻烦。

keep-alive
优点:可以实现页面的缓存,不会重复进行接口调用,提高用户体验。
缺点:在不做任何处理的情况下,页面不会进行实时更新,及页面在第一次加载完(调用接口)后,后来的几次路由切换就不会再次调用接口

如何使用keep-alive

在App.vue:
    <keep-alive>
      <router-view v-if="$route.meta.keepAlive"></router-view>
    </keep-alive>
    <router-view v-if="!$route.meta.keepAlive"></router-view>
在路由(router/index.js):

给需要缓存的页面加上 keepAlive:true

import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)

let newRouter = new Router({
routes: [
    {
      name: "HelloWorld",
      path: '/HelloWorld',
      component: resolve => require(['../components/HelloWorld'], resolve),
      meta: { title: 'HelloWorld' }
    },
   {
      name: "property",
      path: '/Property',
      component: resolve => require(['../components/page/index/Property'], resolve),
      meta: { title: '金融资产',keepAlive:true }
    },
]
});
export default newRouter
在被缓存的页面:

在页面处于 keep-alive 的前提下:
执行顺序(created > mounted > activated > deactivated)
created,mounted里面的方法只会在页面首次进入时执行,之后就不会执行;
activated,deactivated 里面的方法每次进入时都会被执行;
(这边添加了一个滚轮监听的方法,实现滚轮位置的缓存,避免页面跳转回来时一直显示在最顶部位置)

data() {
    return {
        scrollTop :0
       }
},
 created() {
   
  },
 mounted() {
 
  },
 activated() {
   window.scrollTo(0, this.scrollTop); //每次进入页面时滚轮位置在上次的位置
   //this.scrollTop = 0;
   window.addEventListener("scroll", this.handleScroll); //每次进入开启滚轮监听
 },
 deactivated(){ //离开该页面时调用的方法
  window.removeEventListener("scroll", this.handleScroll); //每次离开页面时去除这个监听
 },
methods:{
  //滚轮监听的方法
  handleScroll() {
      let scrollTop =
        window.pageYOffset ||
        document.documentElement.scrollTop ||
        document.body.scrollTop;
        this.scrollTop = scrollTop;
    },
}
实现效果图:
keepAlive.gif

这样就可以实现每次进入该页面时页面内容被缓存,而且滚轮位置还是在上次的位置

如果想从不同的路由跳转过来,是否实现缓存,那就可以同过监听$route定义不同的状态实现对activated里面方法不同的调用

watch:{
   $route(to,from){
      //如果路由是从A过来的,那么定义一个变量为true,则在这个状态下activated里面的方法进行调用或更新数据
      //如果路由是从B过来的,那么定义一个变量为false,则在这个状态下activated里面的方法不会进行调用或更新数据
   }
}
上一篇下一篇

猜你喜欢

热点阅读