原理
进入页面后添加该页面至缓存。如果是replace进入的则不进行缓存操作;
退出页面的时候移除该页面的缓存;
添加缓存必须是进入页面后再加,这样下次进入才是缓存,而不是进入前加入缓存,进入后立刻获取上一个状态的缓存
重新定义路由跳转的函数
由于全局需要监听函数是否前进/后退,需要重新编写路由的跳转函数,利用store,存储进入前的路由状态routerPushStatus,然后在全局路由守卫中获取这个值,以判断进入的是前进还是后退等:
加上全局datetime的query的目的是使$route的fullPath每次都不同,绑在了router-view组件的key上,这样可以保证每下一个页面都能被缓存,即使push的是相同name的页面
./store/index.js
1 | import Vue from 'vue' |
./router.js
1 | import store from './store/index.js' |
手机端的后退有一个问题,就是如果使用原生的后退,是不会触发router的back()或go(-1)方法的,结果就是如果使用了浏览器原生的后退进行后退,就不会经过自定义的路由函数,无法得知他是后退状态,这时候需要监听popstate来解决这个问题
main.js
1 | import store from './store/index.js' |
在vuex中定义router缓存的相关module
./router-cache.js
1 | const state = { |
./store/index.js
1 | import Vue from 'vue' |
定义好进行缓存/移除缓存的函数
./util.js
1 | import store from './store/index.js' |
路由要定义好name属性,引用的组件同样要定义相同的name
./router.js
1 | import VueRouter from 'vue-router' |
keep-alive的include和exclude实际需要的是组件内的name,设置为一样可以方便使用route的name进行管理
./views/Home.vue
1 | export default { |
在全局定义路由守卫,执行缓存相关函数
./main.js
1 | import Vue from 'vue' |
处理keep-alive的逻辑
router-view结构:
注意要将router-view的样式使用定位对齐到同一水平线,mode使用同时进出的动画
./App.vue
1 | <template> |
自此为止完成了通用的APP使用vue&vue-router&vuex进行的前进刷新,后退缓存的方案,且切换路由对应动画。如果在提交某些订单返回后要删除缓存,使用utils.js里的removeRouterCache函数即可