提交 b93bf39a 编写于 作者: fxy060608's avatar fxy060608

feat: uni.redirectTo

上级 ced3159e
......@@ -1101,6 +1101,12 @@ function normalizePageMeta(pageMeta) {
navigationBar.backButton = pageMeta.isQuit ? false : true;
navigationBar.titleColor = navigationBar.titleColor || "#fff";
navigationBar.backgroundColor = navigationBar.backgroundColor || "#F7F7F7";
if (__UNI_FEATURE_PAGES__) {
if (history.state && history.state.__type__ === "redirectTo" && getCurrentPages().length === 0) {
pageMeta.isEntry = true;
pageMeta.isQuit = true;
}
}
return pageMeta;
}
const sheetsMap = new Map();
......@@ -1154,7 +1160,7 @@ function getCurrentPages$1(isAll = false) {
pruneCurrentPages();
return [...currentPagesMap.values()];
}
function removeCurrentPages(delta = -1) {
function removeCurrentPages(delta = 1, removeRouteCaches = false) {
const keys = [...currentPagesMap.keys()];
const start = keys.length - 1;
const end = start - delta;
......@@ -1164,6 +1170,13 @@ function removeCurrentPages(delta = -1) {
pageVm.$.__isUnload = true;
invokeHook(pageVm, "onUnload");
currentPagesMap.delete(routeKey);
if (removeRouteCaches) {
const vnode = pageCacheMap.get(routeKey);
if (vnode) {
pageCacheMap.delete(routeKey);
routeCache.pruneCacheEntry(vnode);
}
}
}
}
let id = history.state && history.state.__id__ || 1;
......@@ -11281,7 +11294,10 @@ function navigate(type, url) {
});
}
const navigateTo = defineAsyncApi(API_NAVIGATE_TO, ({url}, {resolve, reject}) => navigate(API_NAVIGATE_TO, url).then(resolve).catch(reject), NavigateToProtocol, NavigateToOptions);
const redirectTo = defineAsyncApi(API_REDIRECT_TO, ({url}, {resolve, reject}) => navigate(API_REDIRECT_TO, url).then(resolve).catch(reject), RedirectToProtocol, RedirectToOptions);
const redirectTo = defineAsyncApi(API_REDIRECT_TO, ({url}, {resolve, reject}) => {
removeCurrentPages(1, true);
return navigate(API_REDIRECT_TO, url).then(resolve).catch(reject);
}, RedirectToProtocol, RedirectToOptions);
const reLaunch = defineAsyncApi(API_RE_LAUNCH, ({url}, {resolve, reject}) => navigate(API_RE_LAUNCH, url).then(resolve).catch(reject), ReLaunchProtocol, ReLaunchOptions);
const switchTab = defineAsyncApi(API_SWITCH_TAB, ({url}, {resolve, reject}) => navigate(API_SWITCH_TAB, url).then(resolve).catch(reject), SwitchTabProtocol, SwitchTabOptions);
function setNavigationBar(pageMeta, type, args, resolve, reject) {
......@@ -11958,7 +11974,7 @@ var PageHead = /* @__PURE__ */ defineComponent({
const searchInput = __UNI_FEATURE_NAVIGATIONBAR_SEARCHINPUT__ && usePageHeadSearchInput();
__UNI_FEATURE_NAVIGATIONBAR_TRANSPARENT__ && usePageHeadTransparent(headRef, navigationBar);
return () => {
const backButtonTsx = __UNI_FEATURE_PAGES__ ? createBackButtonTsx(navigationBar) : null;
const backButtonTsx = __UNI_FEATURE_PAGES__ ? createBackButtonTsx(pageMeta) : null;
const leftButtonsTsx = __UNI_FEATURE_NAVIGATIONBAR_BUTTONS__ ? createButtonsTsx(buttons.left) : [];
const rightButtonsTsx = __UNI_FEATURE_NAVIGATIONBAR_BUTTONS__ ? createButtonsTsx(buttons.right) : [];
const type = navigationBar.type || "default";
......@@ -11982,8 +11998,12 @@ var PageHead = /* @__PURE__ */ defineComponent({
};
}
});
function createBackButtonTsx(navigationBar) {
if (navigationBar.backButton) {
function createBackButtonTsx(pageMeta) {
const {
navigationBar,
isQuit
} = pageMeta;
if (navigationBar.backButton && !isQuit) {
return createVNode("div", {
class: "uni-page-head-btn",
onClick: onPageHeadBackButton
......@@ -12487,7 +12507,7 @@ function createPageRefreshTsx(refreshRef, pageMeta) {
}
var index = defineComponent({
name: "Page",
setup(props, ctx) {
setup(_props, ctx) {
const {navigationBar} = providePageMeta();
return () => createVNode("uni-page", null, __UNI_FEATURE_NAVIGATIONBAR__ && navigationBar.style !== "custom" ? [createVNode(PageHead), createPageBodyVNode(ctx)] : [createPageBodyVNode(ctx)]);
}
......
......@@ -14,7 +14,7 @@ import { providePageMeta } from '../../plugin/provide'
export default defineComponent({
name: 'Page',
setup(props, ctx) {
setup(_props, ctx) {
const { navigationBar } = providePageMeta()
return () =>
createVNode(
......
......@@ -48,7 +48,7 @@ export default /*#__PURE__*/ defineComponent({
return () => {
// 单页面无需back按钮
const backButtonTsx = __UNI_FEATURE_PAGES__
? createBackButtonTsx(navigationBar)
? createBackButtonTsx(pageMeta)
: null
const leftButtonsTsx = __UNI_FEATURE_NAVIGATIONBAR_BUTTONS__
? createButtonsTsx(buttons.left)
......@@ -82,8 +82,9 @@ export default /*#__PURE__*/ defineComponent({
},
})
function createBackButtonTsx(navigationBar: UniApp.PageNavigationBar) {
if (navigationBar.backButton) {
function createBackButtonTsx(pageMeta: UniApp.PageRouteMeta) {
const { navigationBar, isQuit } = pageMeta
if (navigationBar.backButton && !isQuit) {
return (
<div class="uni-page-head-btn" onClick={onPageHeadBackButton}>
{createSvgIconVNode(
......
......@@ -9,6 +9,7 @@ import { useRoute, RouteLocationNormalizedLoaded } from 'vue-router'
import { invokeHook } from '@dcloudio/uni-core'
import { removeLeadingSlash } from '@dcloudio/uni-shared'
import { usePageMeta } from './provide'
import { NavigateType } from '../../service/api/route/utils'
const SEP = '$$'
......@@ -23,11 +24,14 @@ function pruneCurrentPages() {
}
export function getCurrentPages(isAll: boolean = false) {
pruneCurrentPages() // TODO 目前页面unmounted时机较晚,前一个页面onShow里边调用getCurrentPages,可能还会获取到上一个准备被销毁的页面
pruneCurrentPages()
return [...currentPagesMap.values()]
}
export function removeCurrentPages(delta: number = -1) {
export function removeCurrentPages(
delta: number = 1,
removeRouteCaches = false
) {
const keys = [...currentPagesMap.keys()]
const start = keys.length - 1
const end = start - delta
......@@ -37,14 +41,19 @@ export function removeCurrentPages(delta: number = -1) {
pageVm.$.__isUnload = true
invokeHook(pageVm, 'onUnload')
currentPagesMap.delete(routeKey)
if (removeRouteCaches) {
const vnode = pageCacheMap.get(routeKey)
if (vnode) {
pageCacheMap.delete(routeKey)
routeCache.pruneCacheEntry!(vnode)
}
}
}
}
let id = (history.state && history.state.__id__) || 1
export function createPageState(
type: 'navigateTo' | 'redirectTo' | 'reLaunch' | 'switchTab'
) {
export function createPageState(type: NavigateType) {
return {
__id__: ++id,
__type__: type,
......
......@@ -80,5 +80,17 @@ function normalizePageMeta(pageMeta: UniApp.PageRouteMeta) {
navigationBar.backButton = pageMeta.isQuit ? false : true
navigationBar.titleColor = navigationBar.titleColor || '#fff'
navigationBar.backgroundColor = navigationBar.backgroundColor || '#F7F7F7'
if (__UNI_FEATURE_PAGES__) {
// 首页执行了redirectTo
if (
history.state &&
history.state.__type__ === 'redirectTo' &&
getCurrentPages().length === 0
) {
pageMeta.isEntry = true
pageMeta.isQuit = true
}
}
return pageMeta
}
......@@ -5,12 +5,15 @@ import {
RedirectToOptions,
RedirectToProtocol,
} from '@dcloudio/uni-api'
import { removeCurrentPages } from '../../../framework/plugin/page'
import { navigate } from './utils'
export const redirectTo = defineAsyncApi<API_TYPE_REDIRECT_TO>(
API_REDIRECT_TO,
({ url }, { resolve, reject }) =>
navigate(API_REDIRECT_TO, url).then(resolve).catch(reject),
({ url }, { resolve, reject }) => {
removeCurrentPages(1, true)
return navigate(API_REDIRECT_TO, url).then(resolve).catch(reject)
},
RedirectToProtocol,
RedirectToOptions
)
import { isNavigationFailure, Router } from 'vue-router'
import { createPageState } from '../../../framework/plugin/page'
export function navigate(
type: 'navigateTo' | 'redirectTo' | 'reLaunch' | 'switchTab',
url: string
): Promise<undefined> {
export type NavigateType =
| 'navigateTo'
| 'redirectTo'
| 'reLaunch'
| 'switchTab'
export function navigate(type: NavigateType, url: string): Promise<undefined> {
const router = getApp().$router as Router
return new Promise((resolve, reject) => {
router[type === 'navigateTo' ? 'push' : 'replace']({
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册