239 lines
6.5 KiB
JavaScript
239 lines
6.5 KiB
JavaScript
const defaultList = [
|
|
{
|
|
pagePath: '/pages/tabbar/index',
|
|
iconPath: '/static/images/icon_sy.png',
|
|
selectedIconPath: '/static/images/icon_syf.png',
|
|
text: '首页'
|
|
},
|
|
{
|
|
pagePath: '/pages/tabbar/sort',
|
|
iconPath: '/static/images/icon_fl.png',
|
|
selectedIconPath: '/static/images/icon_flf.png',
|
|
text: '分类'
|
|
},
|
|
{
|
|
pagePath: '/pages/tabbar/shop',
|
|
iconPath: '/static/images/icon_gwc.png',
|
|
selectedIconPath: '/static/images/icon_gwcf.png',
|
|
text: '购物车'
|
|
},
|
|
{
|
|
pagePath: '/pages/tabbar/me',
|
|
iconPath: '/static/images/icon_wd.png',
|
|
selectedIconPath: '/static/images/icon_wdf.png',
|
|
text: '我的'
|
|
}
|
|
]
|
|
|
|
const promotionList = [
|
|
{
|
|
pagePath: '/pages/tabbar/index',
|
|
iconPath: '/static/images/icon_sy.png',
|
|
selectedIconPath: '/static/images/icon_syf.png',
|
|
text: '首页'
|
|
},
|
|
{
|
|
pagePath: '/pages/tabbar/shop',
|
|
iconPath: '/static/images/icon_gwc.png',
|
|
selectedIconPath: '/static/images/icon_gwcf.png',
|
|
text: '榜单'
|
|
},
|
|
{
|
|
pagePath: '/pages/tabbar/sort',
|
|
iconPath: '/static/images/icon_fl.png',
|
|
selectedIconPath: '/static/images/icon_flf.png',
|
|
text: '分类'
|
|
},
|
|
{
|
|
pagePath: '/pages/tabbar/me',
|
|
iconPath: '/static/images/icon_wd.png',
|
|
selectedIconPath: '/static/images/icon_wdf.png',
|
|
text: '我的'
|
|
}
|
|
]
|
|
|
|
function isPromotionUnlockedValue(value) {
|
|
return value === true || value === 'true' || value === 1 || value === '1'
|
|
}
|
|
|
|
function normalizePagePath(path) {
|
|
if (!path) {
|
|
return ''
|
|
}
|
|
return path.charAt(0) === '/' ? path : `/${path}`
|
|
}
|
|
|
|
function isTabbarUnlocked() {
|
|
return isPromotionUnlockedValue(wx.getStorageSync('promotionUnlocked'))
|
|
}
|
|
|
|
function getTabList(isPromotionUnlocked) {
|
|
return isPromotionUnlocked ? defaultList : promotionList
|
|
}
|
|
|
|
function isKnownTabPath(path) {
|
|
if (!path) {
|
|
return false
|
|
}
|
|
return defaultList.some(item => item.pagePath === path) || promotionList.some(item => item.pagePath === path)
|
|
}
|
|
|
|
function setTabbarSelectedPath(path) {
|
|
if (!path) {
|
|
return
|
|
}
|
|
wx.setStorageSync('tabbarSelectedPath', path)
|
|
}
|
|
|
|
function getStoredTabbarSelectedPath() {
|
|
return wx.getStorageSync('tabbarSelectedPath') || ''
|
|
}
|
|
|
|
function getCurrentStackPagePath() {
|
|
const pages = getCurrentPages()
|
|
const currentPage = pages[pages.length - 1]
|
|
if (currentPage && currentPage.route) {
|
|
return normalizePagePath(currentPage.route)
|
|
}
|
|
return ''
|
|
}
|
|
|
|
function getCurrentTabBarInstance() {
|
|
const pages = getCurrentPages()
|
|
const currentPage = pages[pages.length - 1]
|
|
if (!currentPage || typeof currentPage.getTabBar !== 'function') {
|
|
return null
|
|
}
|
|
return currentPage.getTabBar()
|
|
}
|
|
|
|
function syncCurrentTabBar(selectedPath = '') {
|
|
const tabBar = getCurrentTabBarInstance()
|
|
if (tabBar && typeof tabBar.syncPromotionStatus === 'function') {
|
|
tabBar.syncPromotionStatus(selectedPath || getCurrentStackPagePath())
|
|
}
|
|
}
|
|
|
|
let routeListenerRegistered = false
|
|
|
|
Component({
|
|
data: {
|
|
selected: '/pages/tabbar/index',
|
|
list: defaultList,
|
|
isPromotionUnlocked: false,
|
|
isIphoneX: false
|
|
},
|
|
lifetimes: {
|
|
attached() {
|
|
this.registerRouteListener()
|
|
this.syncPromotionStatus(this.getCurrentPagePath())
|
|
this.syncSafeArea()
|
|
}
|
|
},
|
|
pageLifetimes: {
|
|
show() {
|
|
this.syncPromotionStatus(this.getCurrentPagePath())
|
|
}
|
|
},
|
|
methods: {
|
|
registerRouteListener() {
|
|
if (routeListenerRegistered || typeof wx.onAppRoute !== 'function') {
|
|
return
|
|
}
|
|
routeListenerRegistered = true
|
|
wx.onAppRoute((res) => {
|
|
const path = normalizePagePath(res && res.path ? res.path : '')
|
|
if (!isKnownTabPath(path)) {
|
|
return
|
|
}
|
|
setTabbarSelectedPath(path)
|
|
syncCurrentTabBar(path)
|
|
})
|
|
},
|
|
getCurrentPagePath() {
|
|
const currentPath = getCurrentStackPagePath()
|
|
if (isKnownTabPath(currentPath)) {
|
|
return currentPath
|
|
}
|
|
const storedPath = getStoredTabbarSelectedPath()
|
|
if (isKnownTabPath(storedPath)) {
|
|
return storedPath
|
|
}
|
|
return ''
|
|
},
|
|
syncSafeArea() {
|
|
const systemInfo = wx.getSystemInfoSync()
|
|
const safeArea = systemInfo.safeArea || {}
|
|
const isIphoneX = !!safeArea.bottom && safeArea.bottom < systemInfo.screenHeight
|
|
this.setData({ isIphoneX })
|
|
},
|
|
syncPromotionStatus(selectedPath = '') {
|
|
const isPromotionUnlocked = isTabbarUnlocked()
|
|
const list = getTabList(isPromotionUnlocked)
|
|
const currentPath = this.getCurrentPagePath()
|
|
let nextSelected = selectedPath || currentPath || this.data.selected
|
|
const selectedExists = list.some(item => item.pagePath === nextSelected)
|
|
if (!selectedExists) {
|
|
const currentSelectedExists = list.some(item => item.pagePath === currentPath)
|
|
if (currentSelectedExists) {
|
|
nextSelected = currentPath
|
|
} else {
|
|
const storedPath = getStoredTabbarSelectedPath()
|
|
const storedSelectedExists = list.some(item => item.pagePath === storedPath)
|
|
nextSelected = storedSelectedExists ? storedPath : (list[0] ? list[0].pagePath : '')
|
|
}
|
|
}
|
|
const nextData = {
|
|
isPromotionUnlocked,
|
|
list,
|
|
selected: nextSelected
|
|
}
|
|
if (
|
|
this.data.isPromotionUnlocked !== isPromotionUnlocked ||
|
|
this.data.list !== list ||
|
|
this.data.selected !== nextSelected
|
|
) {
|
|
this.setData({
|
|
...nextData
|
|
})
|
|
}
|
|
return nextData
|
|
},
|
|
setSelectedByPath(path) {
|
|
const currentPath = path || ''
|
|
const exists = this.data.list.some(item => item.pagePath === currentPath)
|
|
if (exists && this.data.selected !== currentPath) {
|
|
this.setData({ selected: currentPath })
|
|
}
|
|
},
|
|
switchTab(e) {
|
|
const isPromotionUnlocked = isTabbarUnlocked()
|
|
const { index, pagePath } = e.currentTarget.dataset
|
|
const currentList = getTabList(isPromotionUnlocked)
|
|
let item = null
|
|
let selectedPath = ''
|
|
if (pagePath) {
|
|
selectedPath = pagePath
|
|
item = currentList.find(tab => tab.pagePath === pagePath) || null
|
|
}
|
|
if (!item && typeof index !== 'undefined') {
|
|
const currentIndex = Number(index)
|
|
item = currentList[currentIndex]
|
|
selectedPath = item ? item.pagePath : ''
|
|
}
|
|
if (!item) {
|
|
return
|
|
}
|
|
setTabbarSelectedPath(item.pagePath)
|
|
this.setData({
|
|
selected: selectedPath,
|
|
isPromotionUnlocked,
|
|
list: currentList
|
|
})
|
|
wx.switchTab({
|
|
url: item.pagePath
|
|
})
|
|
}
|
|
}
|
|
})
|