oak-frontend-base/es/features/navigator.mp.js

150 lines
5.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { assert } from 'oak-domain/lib/utils/assert';
import { Navigator as CommonNavigator } from './navigator.common';
export class Navigator extends CommonNavigator {
history;
constructor() {
super();
this.history = wx;
}
getLocation() {
//初始化的时候
const pages = getCurrentPages(); //获取加载的页面
const currentPage = pages[pages.length - 1]; //获取当前页面的对象
const route = currentPage?.route; //当前页面url
const options = currentPage?.options; //如果要获取url中所带的参数可以查看options
const pathname = route ? route
.replace('/pages', '')
.replace('pages', '')
.replace('/index', '') : '';
let search = '';
for (const k in options) {
if (search) {
search += '&';
}
search += `${k}=${typeof options[k] === 'string' ? options[k] : JSON.stringify(options[k])}`;
}
const url = pathname.replace(this.namespace, '').replace('//', '/');
return {
pathname: pathname,
state: options,
key: `${pages.length - 1}`,
namespace: this.namespace,
search,
url: url || '/',
};
}
getState() {
const { pathname, state } = this.getLocation();
const state2 = this.constructState(pathname, state);
return state2;
}
getPathname(pathname, namespace) {
if (!/^\/{1}/.test(pathname)) {
assert(false, 'url前面必须以/开头');
}
// 格式:/house/list 前面加上/pages 后面加上/index
if (pathname?.indexOf('pages') !== -1 ||
pathname?.lastIndexOf('index') !== -1) {
assert(false, 'url两边不需要加上/pages和/index');
}
let pathname2 = pathname;
if (namespace) {
const pathname3 = this.constructNamespace(pathname, namespace);
pathname2 = `/pages${pathname3}/index`;
return pathname2;
}
return `/pages${pathname2}/index`;
}
getUrlAndProps(options, state, disableNamespace) {
const { url, ...rest } = options;
const { pathname } = this.getLocation();
const state2 = Object.assign({}, rest, state, {
oakFrom: pathname,
});
const url2 = this.constructUrl(url, state2, disableNamespace);
return {
url: url2,
};
}
navigateTo(options, state, disableNamespace) {
if (!this.enter()) {
return;
}
const { url } = this.getUrlAndProps(options, state, disableNamespace);
return new Promise((resolve, reject) => {
wx.navigateTo({
url: url,
success: () => {
this.leave();
this.publish();
resolve(undefined);
},
fail: (err) => reject(err),
});
});
}
// 关闭当前页面跳转到应用内的某个页面但不允许跳转到tabBar页面。
redirectTo(options, state, disableNamespace) {
if (!this.enter()) {
return;
}
const { url } = this.getUrlAndProps(options, state, disableNamespace);
return new Promise((resolve, reject) => {
wx.redirectTo({
url: url,
success: () => {
this.leave();
this.publish();
resolve(undefined);
},
fail: (err) => reject(err),
});
});
}
//跳转到tabBar页面并关闭其他所有非tabBar页面用于跳转到主页。
switchTab(options, state, disableNamespace) {
if (!this.enter()) {
return;
}
const { url } = this.getUrlAndProps(options, state, disableNamespace);
return new Promise((resolve, reject) => {
wx.switchTab({
url: url,
success: () => {
this.leave();
this.publish();
resolve(undefined);
},
fail: (err) => reject(err),
});
});
}
navigateBack(delta) {
if (!this.enter()) {
return;
}
return new Promise((resolve, reject) => {
wx.navigateBack({
delta: delta || 1,
success: () => {
this.leave();
this.publish();
resolve(undefined);
},
fail: (err) => reject(err),
});
});
}
navigateBackOrRedirectTo(options, state, disableNamespace) {
const pages = getCurrentPages();
if (pages.length > 1) {
return this.navigateBack();
}
const isTabBar = options?.isTabBar;
if (isTabBar) {
return this.switchTab(options, state, disableNamespace);
}
return this.redirectTo(options, state, disableNamespace);
}
}