vtils
Version:
一个面向业务的 JavaScript/TypeScript 实用程序库。
75 lines (74 loc) • 2.44 kB
JavaScript
import { createUrlQueryString, isUrl } from "../utils/index.js";
import { ensureInMiniProgram } from "./ensureInMiniProgram.js";
import { getMiniProgramConfig } from "./miniProgramConfig.js";
import { miniProgramBus } from "./miniProgramBus.js";
/**
* 跳转至某个页面,跳转失败时会尝试切换到 Tab 页。
*
* **注意:在页面真正切换后 Promise 才会被 resolve,因而此时的页面上下文已经是新页面。**
*
* @param url 要跳转去的页面地址
* @param query 查询参数
* @param redirect 是否关闭当前页面后跳转
*/
export function navigatePageTo(url, query, redirect) {
var routeChanged;
var routeChangeResolve;
var offRouteChange = miniProgramBus.once('routeChange', function () {
if (routeChangeResolve) {
routeChangeResolve();
} else {
routeChanged = true;
}
});
return new Promise(function (resolve, reject) {
ensureInMiniProgram(function (mp) {
if (isUrl(url)) {
var _getMiniProgramConfig = getMiniProgramConfig(),
webUrlToMiniProgramUrl = _getMiniProgramConfig.webUrlToMiniProgramUrl;
if (typeof webUrlToMiniProgramUrl === 'function') {
url = webUrlToMiniProgramUrl(url);
}
}
if (query && typeof query === 'object') {
var queryString = createUrlQueryString(query);
if (queryString) {
url += (url.indexOf('?') > -1 ? '&' : '?') + queryString;
}
}
var switchTab = function switchTab() {
return new Promise(function (resolve, reject) {
mp.switchTab({
url: url,
success: resolve,
fail: reject
});
});
};
var navigateTo = function navigateTo() {
return new Promise(function (resolve, reject) {
;
(redirect ? mp.redirectTo : mp.navigateTo)({
url: url,
success: resolve,
fail: reject
});
});
};
// 支付宝下 navigateTo、redirectTo 也能跳转到 Tab 页并不会报错,只是不会显示 Tab 栏
if (mp.$brand === '支付宝') {
return switchTab().catch(navigateTo);
}
return navigateTo().catch(switchTab);
}).then(function () {
if (routeChanged) {
resolve();
} else {
routeChangeResolve = resolve;
}
}).catch(function () {
offRouteChange();
reject();
});
});
}