nuxt.js keep-alive和嵌套路由无法共存的错误

2,130 阅读2分钟

在nuxt中,为了保证浏览器返回后页面的状态不改变,我们一般会这样写

<nuxt keep-alive />

正常情况下,这种写法不会有问题。但是,当你使用了嵌套路由,问题就出现了:

当你访问一个嵌套路由的页面后,再访问其他页面,然后在访问另一个嵌套路由,你会发现页面显示的是你之前访问过的嵌套路由页面,简单来说:/user/info ==> / ==>  /user/set这时候的/user/set显示为/user/info页面的内容


为了描述清楚,这里我用四个页面复现一下这个问题。

创建一个nuxt项目,目录结构如下


其中,info和set是user的子路由。

user.vue


然后我们在info.vue中添加前往首页的链接


接着在首页中添加前往SET页面的链接


最后是SET页面,单纯的展示内容


好,现在我们的访问路径按照上文的来:

1.我们先进入INFO页面

2.点击前往首页

3.点击前往SET页面

这个时候我们可以看到,浏览器地址栏显示的是/user/set,然而页面却是INFO页面。

到这里,这个问题就完整的复现了,这个问题的出现是因为我们在nuxt使用了keep-alive,在nuxt看来,/user/info和/user/set都是/user,所以在我们从INFO页到首页的时候,它保存了/user/info的页面,当我们再次进入/user的时候,无论我们的url是指向哪一个嵌套子路由,他都显示之前保存的页面。这个结论我们可以从chrome的vue devtools插件看出来。

当我们从INFO页面到首页后,pagesUserInfo被缓存了,而当我们从首页进到SET页面时,缓存被激活,此时没有触发渲染,所以我们看到的还是INFO页面


目前这个问题还没有找到相对完美的解决方案,我的做法是取消使用嵌套路由,用子路由来代替嵌套路由,这种做法不会改变URL,但是弊端是那些公共的样式需要在每个子路由引入。希望有解决过这个问题的大佬给我一个更好的解决方案。

以上。