Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | 6x 6x 6x 6x 6x 6x 1x 1x 1x 6x 2x 2x 2x 6x 1x 1x 6x 6x 6x 6x 6x 6x 6x | import { AnyObject } from '../types'
import { createUrlQueryString, isUrl } from '../utils'
import { ensureInMiniProgram } from './ensureInMiniProgram'
import { getMiniProgramConfig } from './miniProgramConfig'
import { miniProgramBus } from './miniProgramBus'
/**
* 跳转至某个页面,跳转失败时会尝试切换到 Tab 页。
*
* **注意:在页面真正切换后 Promise 才会被 resolve,因而此时的页面上下文已经是新页面。**
*
* @param url 要跳转去的页面地址
* @param query 查询参数
* @param redirect 是否关闭当前页面后跳转
*/
export function navigatePageTo(
url: string,
query?: AnyObject,
redirect?: boolean,
): Promise<any> {
let routeChanged: boolean
let routeChangeResolve: AnyFunction
const offRouteChange = miniProgramBus.once('routeChange', () => {
Iif (routeChangeResolve) {
routeChangeResolve()
} else {
routeChanged = true
}
})
return new Promise<void>((resolve, reject) => {
ensureInMiniProgram(mp => {
if (isUrl(url)) {
const { webUrlToMiniProgramUrl } = getMiniProgramConfig()
if (typeof webUrlToMiniProgramUrl === 'function') {
url = webUrlToMiniProgramUrl(url)
}
}
if (query && typeof query === 'object') {
const queryString = createUrlQueryString(query)
if (queryString) {
url += (url.indexOf('?') > -1 ? '&' : '?') + queryString
}
}
const switchTab = () =>
new Promise((resolve, reject) => {
mp.switchTab({
url: url,
success: resolve,
fail: reject,
})
})
const navigateTo = () =>
new Promise((resolve, reject) => {
;(redirect
? ((mp.redirectTo as any) as typeof mp.navigateTo)
: mp.navigateTo)({
url: url,
success: resolve,
fail: reject,
})
})
// 支付宝下 navigateTo、redirectTo 也能跳转到 Tab 页并不会报错,只是不会显示 Tab 栏
Iif (mp.$brand === '支付宝') {
return switchTab().catch(navigateTo)
}
return navigateTo().catch(switchTab)
})
.then(() => {
if (routeChanged) {
resolve()
} else E{
routeChangeResolve = resolve
}
})
.catch(() => {
offRouteChange()
reject()
})
})
}
|