keep-alive实现前进刷新,后退缓存

186 阅读1分钟

背景:

移动端项目为Hybrid,用原生webview新开页面方式耗时,客户投诉打开慢,所以架构升级,路由跳转普遍替换为router.push+keep-alive的方式,但是如果都用keep-alive,返回再进页面不刷新,所以需要实现前进刷新,后退缓存的效果

步骤:

  1. 项目布局层给router-view设置keep-alive

  2. 给keep-alive设置include,include用vuex进行存储

  3. 注册popstate事件,每次页面返回,出栈,将当前路由的match均保存起来

    window.addEventListener('popstate', this.handlePopState)

    handlePopState() { this.justGoBackRouteNameList = getMatchedRouteNameList(this.$route) }

    `/** * 获取相关路由list * @param {Object} route 路由对象 * @returns {String[]} */
    const getMatchedRouteNameList = route => route.matched.map(item => item.name).filter(item => !!item)

    `

问题:

  1. 遇到tab结构,每个tab都有单独的route,tab之间是通过router.push方式切换,无法触发popstate事件,最终均会被缓存下来,如果遇到其他页面复用了某个tab组件,那么这些组件就没法再次进入的时候就不会被更新
    方案:
  • 将tab路由跳转改成同路由下组件切换的方式,这样tab切换不涉及组件缓存

  • 将子tab组件改成watch监听id实现页面刷

  • 如果页面重复push跳转,会使用缓存页面,导致页面不更新,如果用watch工作量太大,
    考虑更新上面keep-alive的逻辑,更新后如下