发现面试好像会喜欢问“项目中遇到的难点”这样的问题。但说实话,难点这种东西,难了不会,会了不难,一旦解决了就觉得也还好,过段时间也就忘了,再过段时间,哪怕能想起来,也一定觉得不是什么值得说出来的问题。
总之,确实怎么回想也想不出什么难点,就只好从现在开始记录了。
就从keep-alive踩坑开始吧。
本文主要为了给个人记录一个过程,因此按照踩坑顺序记录,而不是一个知识体系。
btw过程中发现了好多博客的错误……
首先,移动端,一个列表页,一个详情页。从列表页点入详情页,再从详情页回退到列表页,实际上列表页是完全不需要刷新的。在此需求上,能做到类似App那样“前进刷新,后退不刷新”的效果,当然是极好的。
判断前进还是后退
单纯监听前进还是后退,很容易想到监听popstate
事件。但是这个事件不管前进还是后退都能触发,且不能和Vue的生命周期结合起来,所以Pass。
其他人的实现提供了两种方法,一种是另辟蹊径:vue单页面,多路由,前进刷新,后退不刷新,严格监听是从哪一个路由跳到哪一个路由,从而监听是前进还是后退。这显然是很死板的,当然,如果需求简单,仅仅需要顾及几个页面,那反而很安全。另一种是vue实现前进刷新,后退不刷新,使用路由的路径层级去判断是前进还是后退,也就是说,前进后退和路由层级严格挂钩,路由和前进后退的方向都变得不自由了。
我开始想的是第三种方法,在路由信息对象上记录数字,用这个数字标识层级。但是很快意识到,这种方法也不直观,最直观的方法莫过于直接压一个栈。当要去的路由等于栈顶的路由的时候,就相当于是后退了。
1 | let routerStack = [] |