需求背景: 用户访问网站路径为 [ 首页 → 商品详情页 → 首页 ], 此时需要缓存首页,再次返回到首页,需要展示到上次浏览的锚点位置

解决方案:

1:router + keep-alive

缺陷:一旦缓存后,无法销毁,占用内存

大致步骤:
1 路由meta中添加一个标识:
  meta: { title: '', isKeepAlive: true }
 
2 app.vue中使用keep-alive
 
  <keep-alive :max="10">
    <router-view v-if="$route.meta.isKeepAlive" />
  </keep-alive>
  <router-view v-if="!$route.meta.isKeepAlive" />
 
3 具体页面中通过 activated, deactivated钩子调用数据函数

2:router + keep-alive + vuex (推荐)

大致步骤:
 
1. vuex中设置需要缓存的组件名: keepAlivePage: []
 
 
2. app.vue
<keep-alive :include="keeplist" :max="10">
  <router-view></router-view>
</keep-alive>
 
<script>
  import { mapGetters } from 'vuex'
  export default {
    computed: {
      ...mapGetters({
        keeplist: 'getKeepAlivePage'
      })
    }
  }
</script>
 
 
3. store -> getters.js
const getters = {
  getKeepAlivePage: state => {
    return state.keepAlivePage
  }
}
export default getters
 
 
4. store -> mutation.js
 
const mutations = {
  // 缓存某个组件
  cache (state, name) {
    if (!state.keepAlivePage.includes(name)) {
      state.keepAlivePage.push(name)
    }
  },
 
  // 不缓存某个组件
  uncache (state, name) {
    if (state.keepAlivePage.includes(name)) {
      state.keepAlivePage = state.keepAlivePage.filter(item => item !== name)
    }
  }
}
 
 
5. router.js
const routeArry = [] // 路由
const router = new VueRouter({
  mode: 'history',
  routes: routeArry,
  // vue-router提供了scrollBehavior方法
  scrollBehavior (to, from, savedPosition) {
    if (savedPosition) {
      return savedPosition
    } else {
      return { x: 0, y: 0 }
    }
  }
})
 
 
6. 准备工作完毕,接下来愉快的使用啦,以开头需求背景为例:home.vue
import { mapMutations } from 'vuex'
<script>
  created () {
    this.setKeepAlive('Home')
  },
  
  methods: {
   ...mapMutations({
     setKeepAlive: 'cache',
     delKeepAlive: 'uncache'
   })
  },
 
  beforeRouteLeave (to, from, next) {
    if (to.name !== 'goodsdetail') {
      this.delKeepAlive('Home')
    }
    next()
  }
</script>

划重点:delKeepAlive('Home') 和 setKeepAlive('Home') 中,传值一定是组件名称, 非路由name

大致思路:

进入页面,先将组件缓存下来;

通过beforeRouteLeave判断,是否为需求指定页面,如果是跳过,反之清除掉;

这样就可以及时销毁缓存啦~