# Vue 前进刷新后退不刷新,简易页面堆栈实现 - 类似原生 APP 应用的导航体验 - push 保留当前页面,打开新页面 - back 或者 go 负数, - 页面栈最多十层 导航默认行为类似手机 APP 的页面导航(A、B、C 为页面): A 前进到 B,再前进到 C; C 返回到 B 时,B 会从缓存中恢复; B 再次前进到 C,C 会重新生成,不会从缓存中恢复; C 前进到 A,A 会生成,现在路由中包含 2 个 A 实例。 !重要:vue-navigation 在 url 中添加了一个 key 来区分路由。key 的名称默认为 VNK,可以修改。 本库是个导航管理器,用来模拟原生 APP 应用导航。 页面元素的垂直滚动距离 window.pageYOffset, document.documentElement.scrollTop 页面元素的垂直滚动距离 document.body.scrollTop 页面容器元素的垂直滚动距离 document.querySelector('.container').scrollTop requestAnimationFrame [](https://github.com/CJY0208/react-activation/blob/master/src/helpers/saveScrollPosition.js) [vue-stack-router](https://github.com/luojilab/vue-stack-router) [vue-page-stack](https://github.com/hezhongfeng/vue-page-stack) [记一次 vue 的 keep-alive 踩坑之路](https://www.jianshu.com/p/cd1baf5b03b0) Why Not Vue Router Vue Router 是 vue 的官方路由管理,不可否认其有着强大的功能和广泛的使用,但在使用 vue-router 开发移动端业务时,有以下几点问题: vue-router 中所有注册的路由都是单例的,当出现 PageA 跳转到 PageA 的时候,并不是产生一个新的 PageA,而是当前的 PageA 重新渲染。当需要两个 PageA ,并且两个 PageA 都需要有自己不同的状态时,这个场景用 vue-router 解决会比较麻烦。 vue-router 遵循 Web 的规范,整个路由的路径是线性的,组件实例的存活与路由无关,而是取决于是否使用了 keep-alive 组件。而在移动端,大部分栈式路由的场景,PageA 跳转到 PageB,A 和 B 实例都是存活的,当 PageB 返回 PageA,A 存活而 B 被销毁,显然 vue-router 无法满足这个场景。 开始 vue-stack-router 是一个 Vue 路由管理器的社区解决方案,针对移动端而设计,支持对页面进行栈式的管理,主要有以下功能: 栈式的路由管理 声明式的路由配置 路由 query、parameter 路由间数据传递 细粒度、可定制的路由过渡效果 安装 ``` function getElementPosition (el, offset) { const docEl = document.documentElement const docRect = docEl.getBoundingClientRect() const elRect = el.getBoundingClientRect() return { x: elRect.left - docRect.left - offset.x, y: elRect.top - docRect.top - offset.y } } ```