diff --git a/packages/uni-app-plus/dist/uni-app-service.es.js b/packages/uni-app-plus/dist/uni-app-service.es.js index f603171586c5506803ffce903a21cc9224a68db6..e244adfdf7aeb8520af1e862c9089c1c531d52a1 100644 --- a/packages/uni-app-plus/dist/uni-app-service.es.js +++ b/packages/uni-app-plus/dist/uni-app-service.es.js @@ -9355,6 +9355,15 @@ var serviceContext = (function (vue) { pageVm.$page = __pageInstance; pageVm.$vm = pageVm; addCurrentPage(initScope(__pageId, pageVm)); + invokeHook(pageVm, 'onLoad', __pageQuery); + invokeHook(pageVm, 'onShow'); + vue.onMounted(() => { + invokeHook(pageVm, 'onReady'); + // TODO preloadSubPackages + }); + vue.onBeforeUnmount(() => { + invokeHook(pageVm, 'onUnload'); + }); if (oldSetup) { return oldSetup(__pageQuery, ctx); } @@ -9500,6 +9509,8 @@ var serviceContext = (function (vue) { }, NavigateToProtocol, NavigateToOptions); function _navigateTo({ url, path, query, aniType, aniDuration, }) { // TODO eventChannel + // 当前页面触发 onHide + invokeHook('onHide'); return new Promise((resolve) => { showWebview(registerPage({ url, path, query, openType: 'navigateTo' }), aniType, aniDuration, () => { resolve(undefined); @@ -9623,6 +9634,8 @@ var serviceContext = (function (vue) { .slice(len - delta, len) .forEach((page) => removePage(page)); setStatusBarStyle(); + // 前一个页面触发 onShow + invokeHook('onShow'); }; const webview = plus.webview.getWebviewById(currentPage.$page.id + ''); if (!currentPage.__uniapp_webview) { diff --git a/packages/uni-app-plus/src/service/api/route/navigateBack.ts b/packages/uni-app-plus/src/service/api/route/navigateBack.ts index a5eff3a140769a94a8aa58d6afc7950bdb757072..10429558820afeaf5a938151cf168cbc5310d141 100644 --- a/packages/uni-app-plus/src/service/api/route/navigateBack.ts +++ b/packages/uni-app-plus/src/service/api/route/navigateBack.ts @@ -104,6 +104,8 @@ function back( .slice(len - delta, len) .forEach((page) => removePage(page as ComponentPublicInstance)) setStatusBarStyle() + // 前一个页面触发 onShow + invokeHook('onShow') } const webview = plus.webview.getWebviewById(currentPage.$page.id + '') diff --git a/packages/uni-app-plus/src/service/api/route/navigateTo.ts b/packages/uni-app-plus/src/service/api/route/navigateTo.ts index 55a9a1c5e9704d6dd2452b631b6117e0c3099134..6364f9b8501dc224fe28cd8d159037147c5058f8 100644 --- a/packages/uni-app-plus/src/service/api/route/navigateTo.ts +++ b/packages/uni-app-plus/src/service/api/route/navigateTo.ts @@ -1,5 +1,5 @@ import { parseUrl } from '@dcloudio/uni-shared' -import { getRouteMeta } from '@dcloudio/uni-core' +import { getRouteMeta, invokeHook } from '@dcloudio/uni-core' import { API_NAVIGATE_TO, API_TYPE_NAVIGATE_TO, @@ -59,6 +59,8 @@ function _navigateTo({ aniDuration, }: NavigateToOptions): Promise { // TODO eventChannel + // 当前页面触发 onHide + invokeHook('onHide') return new Promise((resolve) => { showWebview( registerPage({ url, path, query, openType: 'navigateTo' }), diff --git a/packages/uni-app-plus/src/service/framework/page/getCurrentPages.ts b/packages/uni-app-plus/src/service/framework/page/getCurrentPages.ts index 9631f793e4213a9a6eba5abaa7f9f7fd855c836e..f91327459e24a3877f57946252c2e6e0fb11b53d 100644 --- a/packages/uni-app-plus/src/service/framework/page/getCurrentPages.ts +++ b/packages/uni-app-plus/src/service/framework/page/getCurrentPages.ts @@ -1,3 +1,4 @@ +import { getCurrentPage } from '@dcloudio/uni-core' import { formatLog } from '@dcloudio/uni-shared' import { ComponentPublicInstance } from 'vue' @@ -21,6 +22,10 @@ export function getCurrentPages() { return curPages } +export function removeCurrentPage() { + removePage(getCurrentPage() as ComponentPublicInstance) +} + export function removePage(curPage: ComponentPublicInstance) { const index = pages.findIndex((page) => page === curPage) if (index === -1) { diff --git a/packages/uni-app-plus/src/service/framework/page/setup.ts b/packages/uni-app-plus/src/service/framework/page/setup.ts index a6290266cb39e759b2c0be301c227fd76a740221..90155f37ff0d136e25d994ac180ce400b9ecbd56 100644 --- a/packages/uni-app-plus/src/service/framework/page/setup.ts +++ b/packages/uni-app-plus/src/service/framework/page/setup.ts @@ -1,5 +1,11 @@ +import { invokeHook } from '@dcloudio/uni-core' import { formatLog } from '@dcloudio/uni-shared' -import { ComponentPublicInstance, getCurrentInstance } from 'vue' +import { + ComponentPublicInstance, + getCurrentInstance, + onBeforeUnmount, + onMounted, +} from 'vue' import { VuePageComponent } from './define' import { addCurrentPage } from './getCurrentPages' @@ -18,6 +24,15 @@ export function setupPage(component: VuePageComponent) { pageVm.$page = __pageInstance as Page.PageInstance['$page'] pageVm.$vm = pageVm addCurrentPage(initScope(__pageId as number, pageVm)) + invokeHook(pageVm, 'onLoad', __pageQuery) + invokeHook(pageVm, 'onShow') + onMounted(() => { + invokeHook(pageVm, 'onReady') + // TODO preloadSubPackages + }) + onBeforeUnmount(() => { + invokeHook(pageVm, 'onUnload') + }) if (oldSetup) { return oldSetup(__pageQuery as any, ctx) } diff --git a/packages/uni-app-plus/src/service/framework/webview/init/event/index.ts b/packages/uni-app-plus/src/service/framework/webview/init/event/index.ts index fc39d6afe4968f2cc4a62b9aaec0f2c069c403fe..1a84d0646d7c3564754bb283011d893c76311318 100644 --- a/packages/uni-app-plus/src/service/framework/webview/init/event/index.ts +++ b/packages/uni-app-plus/src/service/framework/webview/init/event/index.ts @@ -1,4 +1,5 @@ import { onWebviewClose } from './close' +import { onWebviewPopGesture } from './popGesture' import { onWebviewResize } from './resize' const WEBVIEW_LISTENERS = { @@ -21,8 +22,8 @@ export function initWebviewEvent(webview: PlusWebviewWebviewObject) { onWebviewResize(webview) // TODO - // if (plus.os.name === 'iOS') { - // !(webview as any).nvue && onWebviewRecovery(webview, routeOptions) - // onWebviewPopGesture(webview) - // } + if (plus.os.name === 'iOS') { + // !(webview as any).nvue && onWebviewRecovery(webview, routeOptions) + onWebviewPopGesture(webview) + } } diff --git a/packages/uni-app-plus/src/service/framework/webview/init/event/popGesture.ts b/packages/uni-app-plus/src/service/framework/webview/init/event/popGesture.ts new file mode 100644 index 0000000000000000000000000000000000000000..6b08d89c2c88209b0622e0eedffe2bcc1d607fbb --- /dev/null +++ b/packages/uni-app-plus/src/service/framework/webview/init/event/popGesture.ts @@ -0,0 +1,30 @@ +import { invokeHook } from '@dcloudio/uni-core' +import { + lastStatusBarStyle, + setStatusBarStyle, + StatusBarStyle, +} from '../../../../statusBar' +import { removeCurrentPage } from '../../../page/getCurrentPages' + +export function onWebviewPopGesture(webview: PlusWebviewWebviewObject) { + let popStartStatusBarStyle: StatusBarStyle + webview.addEventListener('popGesture', (e) => { + if (e.type === 'start') { + // 设置下一个页面的 statusBarStyle + const pages = getCurrentPages() + const page = pages[pages.length - 2] + popStartStatusBarStyle = lastStatusBarStyle + const statusBarStyle = + page && (page.$page.statusBarStyle as StatusBarStyle) + statusBarStyle && setStatusBarStyle(statusBarStyle) + } else if (e.type === 'end' && !e.result) { + // 拖拽未完成,设置为当前状态栏前景色 + setStatusBarStyle(popStartStatusBarStyle) + } else if (e.type === 'end' && e.result) { + removeCurrentPage() + setStatusBarStyle() + // 触发前一个页面 onShow + invokeHook('onShow') + } + }) +} diff --git a/packages/uni-app-plus/src/service/statusBar.ts b/packages/uni-app-plus/src/service/statusBar.ts index 79c2e6bc7bfa5ae6c408e3401024751f22d5fa21..df491a6c0b8abdcc4f6e89c9139279f25980a7b4 100644 --- a/packages/uni-app-plus/src/service/statusBar.ts +++ b/packages/uni-app-plus/src/service/statusBar.ts @@ -1,7 +1,7 @@ import { formatLog } from '@dcloudio/uni-shared' type SetStatusBarStyle = typeof plus.navigator.setStatusBarStyle -type StatusBarStyle = Parameters[0] +export type StatusBarStyle = Parameters[0] export let lastStatusBarStyle: StatusBarStyle