switchTab.ts 1.8 KB
Newer Older
fxy060608's avatar
fxy060608 已提交
1
import { ComponentPublicInstance } from 'vue'
fxy060608's avatar
fxy060608 已提交
2 3
import {
  API_SWITCH_TAB,
fxy060608's avatar
fxy060608 已提交
4
  API_TYPE_SWITCH_TAB,
fxy060608's avatar
fxy060608 已提交
5 6 7 8
  defineAsyncApi,
  SwitchTabOptions,
  SwitchTabProtocol,
} from '@dcloudio/uni-api'
fxy060608's avatar
fxy060608 已提交
9
import { getCurrentPageVm, invokeHook } from '@dcloudio/uni-core'
fxy060608's avatar
fxy060608 已提交
10
import { getCurrentPagesMap, removePage } from '../../../framework/setup/page'
fxy060608's avatar
fxy060608 已提交
11
import { navigate } from './utils'
fxy060608's avatar
fxy060608 已提交
12
import { ON_HIDE } from '@dcloudio/uni-shared'
fxy060608's avatar
fxy060608 已提交
13

fxy060608's avatar
fxy060608 已提交
14 15 16 17 18 19 20 21 22
function removeNonTabBarPages() {
  const curTabBarPageVm = getCurrentPageVm()
  if (!curTabBarPageVm) {
    return
  }
  const pagesMap = getCurrentPagesMap()
  const keys = pagesMap.keys()
  for (const routeKey of keys) {
    const page = pagesMap.get(routeKey) as ComponentPublicInstance
fxy060608's avatar
fxy060608 已提交
23
    if (!page.$.__isTabBar) {
fxy060608's avatar
fxy060608 已提交
24 25 26 27 28
      removePage(routeKey)
    } else {
      page.$.__isActive = false
    }
  }
fxy060608's avatar
fxy060608 已提交
29
  if (curTabBarPageVm.$.__isTabBar) {
fxy060608's avatar
fxy060608 已提交
30
    curTabBarPageVm.$.__isVisible = false
fxy060608's avatar
fxy060608 已提交
31
    invokeHook(curTabBarPageVm, ON_HIDE)
fxy060608's avatar
fxy060608 已提交
32 33 34
  }
}

L
liyongning 已提交
35 36 37 38 39 40
/**
 * 判断 url 和 page 是否为同一个页面
 * @param url 目标页
 * @param $page 页面栈中的某个页面
 * @returns boolean
 */
fxy060608's avatar
fxy060608 已提交
41
function isSamePage(url: string, $page: Page.PageInstance['$page']) {
42
  return url === $page.fullPath || (url === '/' && $page.meta.isEntry)
fxy060608's avatar
fxy060608 已提交
43 44
}

fxy060608's avatar
fxy060608 已提交
45 46 47 48
function getTabBarPageId(url: string) {
  const pages = getCurrentPagesMap().values()
  for (const page of pages) {
    const $page = page.$page
fxy060608's avatar
fxy060608 已提交
49
    if (isSamePage(url, $page)) {
fxy060608's avatar
fxy060608 已提交
50 51 52 53 54 55
      ;(page as ComponentPublicInstance).$.__isActive = true
      return $page.id
    }
  }
}

fxy060608's avatar
fxy060608 已提交
56
export const switchTab = defineAsyncApi<API_TYPE_SWITCH_TAB>(
fxy060608's avatar
fxy060608 已提交
57
  API_SWITCH_TAB,
fxy060608's avatar
fxy060608 已提交
58 59 60
  ({ url }, { resolve, reject }) => {
    return (
      removeNonTabBarPages(),
fxy060608's avatar
fxy060608 已提交
61
      navigate({ type: API_SWITCH_TAB, url }, getTabBarPageId(url))
fxy060608's avatar
fxy060608 已提交
62 63 64 65
        .then(resolve)
        .catch(reject)
    )
  },
fxy060608's avatar
fxy060608 已提交
66 67 68
  SwitchTabProtocol,
  SwitchTabOptions
)