移动端中,我们浏览商品列表的时候,点击进入详情页面,然后返回到商品列表,一般都是用户浏览到哪里,返回来的时候还是那个位置(试想一下,如果一返回,页面重新刷新,你又要往上滑不知道多少页才能找到你刚刚的那款商品,这么一想是不是很崩溃),但是vue很贴心,给我们设计了keep-alive

<keep-alive> 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们

keep-alive在vue2和vue3中还是有些区别的

在vue2中

<keep-alive>
    <router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>

如果你在vue3中使用vue2的写法,在编译的时候会报警告,你参照警告修改就行

在vue3中

<router-view v-slot="{ Component }">
    <keep-alive :include="cachedViews">
      <component :is="Component"></component>
    </keep-alive>
</router-view>

这两个页面是在子路由里面 ,所以子路由也要嵌套一下keep-alive

 

 

 

 首页和吃喝玩乐都有列表页面,但是并不是都要缓存

缓存的情况:福利商品列表进入详情页面、吃喝玩乐商品进入详情页面

不缓存的情况:福利跳吃喝玩乐

如果不使用动态路由缓存的话,那么福利到吃喝玩乐也会北缓存,吃喝玩乐到福利也会被缓存,这显然不符合规范

所以这里就用到了动态路由缓存

使用 include + beforeRouteLeave + vuex  + scrollBehavior (也是边查资料边踩坑)

include支持数组,因为我需要缓存的页面有几个,所以我这里使用数组去动态缓存

 store中的写法很简单

 接下来就是在离开页面的时候操作vuex中cachedView的数组

在需要动态路由缓存的页面,加上这个,跟created()等生命周期同级

 这样,当你在列表页面进到详情页面,你的路由数组为['search','dine-libertinismtwo','parentCpn'],当你切换下面tabar页面的时候,路由数组为['search','dine-libertinismtwo']

路由文件中

 网上是这么写的,但是在我这里不行,会出现滚动条相互影响

 我打印了一下savePosition

 然后我就投机取巧,把x,y修改成left,top,就可以了

 至此,就完成了动态路由缓存了,说来惭愧,这竟然是我第一次用keep-alive

 

 

Logo

前往低代码交流专区

更多推荐