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

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

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