vue keep-alive与mapState的填坑记录

  最近在用keep-alive配合vuex做缓存处理。发现在某些场景下,keep-alive设置的include不会立即生效,但是include的值确实已经改变。
  具体的原因如下。在router.beforeEach中dispatch关于keep-alive的action,在action中根据路由对state中的include动态增删。然后在相应的页面组件中mapState获取该include。我发现路由的跳转优先于mapState获取include,导致缓存不会立即生效。由此可见mapState获取值应该是异步的。
  解决办法,在action中使用promise包装,在router.beforeEach使用await或者.then实现同步,保证include修改完成并mapState到组件中,再进行路由的跳转。
  出现该问题的场景如下图:
场景
  点切换左侧导航时,清空store中的include,重新点击下钻并动态修改include。此时,返回上一页面会重新发起网络请求,缓存失效!
  我发现生命周期即进入了created,也进入了activated。也就是说state中include的修改晚于router的跳转。怀疑在router.beforeEach拦截处理include时,出现了异步,导致路由优先进入然后组件才通过mapState获取到新的include的值。
  于是,我将action中操作include的函数使用primise封装起来,如下:

const actions = {
  changeKeepAlive({ commit }, { to, from }) {
    return new Promise((resolve, reject) => {
      if (!to.path.includes('/home/menu')) { // 不是首页, 清空keepalive
        commit('CLEAR_INCLUDE');
        resolve();
      } else {
        let fromIsInKeepAlive = state.include.includes(from.name);
        if (to.meta.index < from.meta.index && fromIsInKeepAlive) {  // 后退时,若当前页被缓存,移除缓存配置
          commit('DELETE_INCLUDE', from.name);
          resolve();
        }
        if (to.meta.index > from.meta.index && !fromIsInKeepAlive) {  // 前进时,下一页需要缓存,添加该页面
          commit('ADD_INCLUDE', from.name);
          resolve();
        }
      }
      resolve();
    });
  }
};

然后在main.js中的router.beforeEach中(也可以使用await):

store.dispatch('keepAlive/changeKeepAlive', {to, from}).then(() => {
	...
})

  再次尝试,发现缓存已经正常。初步估计mapState是异步的,双向绑定的值能够及时的更新,但是keep-alive的include需要在路由跳转前修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值