提交 6d2d2492 编写于 作者: fxy060608's avatar fxy060608

fix(h5): tabBar 切换丢失滚动位置

上级 d253295d
...@@ -15,7 +15,28 @@ function removeKeepAliveInclude (componentName) { ...@@ -15,7 +15,28 @@ function removeKeepAliveInclude (componentName) {
} }
} }
function switchTab (routes) { let positionStore = Object.create(null)
export function getTabBarScrollPosition (id) {
return positionStore[id]
}
function saveTabBarScrollPosition (id) {
positionStore[id] = {
x: window.pageXOffset,
y: window.pageYOffset
}
}
function switchTab (routes, to, from) {
if (
to &&
from &&
to.meta.isTabBar &&
from.meta.isTabBar
) { // tabbar 跳 tabbar
saveTabBarScrollPosition(from.params.__id__)
}
// 关闭非 tabBar 页面 // 关闭非 tabBar 页面
const pages = getCurrentPages() const pages = getCurrentPages()
for (let i = pages.length - 1; i >= 0; i--) { for (let i = pages.length - 1; i >= 0; i--) {
...@@ -33,11 +54,13 @@ function reLaunch (toName) { ...@@ -33,11 +54,13 @@ function reLaunch (toName) {
// 关闭所有页面 // 关闭所有页面
const pages = getCurrentPages(true) const pages = getCurrentPages(true)
for (let i = pages.length - 1; i >= 0; i--) { for (let i = pages.length - 1; i >= 0; i--) {
callPageHook(pages[i], 'onUnload') callPageHook(pages[i], 'onUnload')
// 重新reLaunch至首页可能会被keepAlive,先手动强制destroy // 重新reLaunch至首页可能会被keepAlive,先手动强制destroy
pages[i].$destroy() pages[i].$destroy()
} }
this.keepAliveInclude = [] this.keepAliveInclude = []
// 清空 positionStore
positionStore = Object.create(null)
} }
let currentPages = [] let currentPages = []
...@@ -65,7 +88,7 @@ function beforeEach (to, from, next, routes) { ...@@ -65,7 +88,7 @@ function beforeEach (to, from, next, routes) {
removeKeepAliveInclude.call(this, fromName) removeKeepAliveInclude.call(this, fromName)
if (from.meta) { if (from.meta) {
if (from.meta.isQuit) { // 如果 redirectTo 的前一个页面是 quit 类型,则新打开的页面也是 quit if (from.meta.isQuit) { // 如果 redirectTo 的前一个页面是 quit 类型,则新打开的页面也是 quit
to.meta.isQuit = true to.meta.isQuit = true
to.meta.isEntry = !!from.meta.isEntry to.meta.isEntry = !!from.meta.isEntry
} }
if (from.meta.isTabBar) { // 如果是 tabBar,需要更新系统组件 tabBar 内的 list 数据 if (from.meta.isTabBar) { // 如果是 tabBar,需要更新系统组件 tabBar 内的 list 数据
...@@ -78,7 +101,7 @@ function beforeEach (to, from, next, routes) { ...@@ -78,7 +101,7 @@ function beforeEach (to, from, next, routes) {
break break
case 'switchTab': case 'switchTab':
switchTab.call(this, routes) switchTab.call(this, routes, to, from)
break break
case 'reLaunch': case 'reLaunch':
reLaunch.call(this, toName) reLaunch.call(this, toName)
......
...@@ -16,6 +16,10 @@ import { ...@@ -16,6 +16,10 @@ import {
createPageMixin createPageMixin
} from './page' } from './page'
import {
getTabBarScrollPosition
} from './app/router-guard'
function getMinId (routes) { function getMinId (routes) {
let minId = 0 let minId = 0
routes.forEach(route => { routes.forEach(route => {
...@@ -62,6 +66,17 @@ export default { ...@@ -62,6 +66,17 @@ export default {
if (savedPosition) { if (savedPosition) {
return savedPosition return savedPosition
} else { } else {
if (
to &&
from &&
to.meta.isTabBar &&
from.meta.isTabBar
) { // tabbar 跳 tabbar
const position = getTabBarScrollPosition(to.params.__id__)
if (position) {
return position
}
}
return { return {
x: 0, x: 0,
y: 0 y: 0
...@@ -101,7 +116,9 @@ export default { ...@@ -101,7 +116,9 @@ export default {
const appMixin = createAppMixin(routes, entryRoute) const appMixin = createAppMixin(routes, entryRoute)
// mixin app hooks // mixin app hooks
Object.keys(appMixin).forEach(hook => { Object.keys(appMixin).forEach(hook => {
options[hook] = options[hook] ? [].concat(appMixin[hook], options[hook]) : [appMixin[hook]] options[hook] = options[hook] ? [].concat(appMixin[hook], options[hook]) : [
appMixin[hook]
]
}) })
// router // router
...@@ -117,7 +134,9 @@ export default { ...@@ -117,7 +134,9 @@ export default {
const pageMixin = createPageMixin() const pageMixin = createPageMixin()
// mixin page hooks // mixin page hooks
Object.keys(pageMixin).forEach(hook => { Object.keys(pageMixin).forEach(hook => {
options[hook] = options[hook] ? [].concat(pageMixin[hook], options[hook]) : [pageMixin[hook]] options[hook] = options[hook] ? [].concat(pageMixin[hook], options[hook]) : [
pageMixin[hook]
]
}) })
} else { } else {
if (this.$parent && this.$parent.__page__) { if (this.$parent && this.$parent.__page__) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册