From ebb9672c164c650395ec9854ada1f975961d0804 Mon Sep 17 00:00:00 2001 From: fxy060608 Date: Thu, 15 Jul 2021 21:04:37 +0800 Subject: [PATCH] feat(app): add lifecycle --- .../uni-app-plus/dist/uni-app-service.es.js | 13 ++++++++ .../src/service/api/route/navigateBack.ts | 2 ++ .../src/service/api/route/navigateTo.ts | 4 ++- .../service/framework/page/getCurrentPages.ts | 5 ++++ .../src/service/framework/page/setup.ts | 17 ++++++++++- .../framework/webview/init/event/index.ts | 9 +++--- .../webview/init/event/popGesture.ts | 30 +++++++++++++++++++ .../uni-app-plus/src/service/statusBar.ts | 2 +- 8 files changed, 75 insertions(+), 7 deletions(-) create mode 100644 packages/uni-app-plus/src/service/framework/webview/init/event/popGesture.ts 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 f60317158..e244adfdf 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 a5eff3a14..104295588 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 55a9a1c5e..6364f9b85 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 9631f793e..f91327459 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 a6290266c..90155f37f 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 fc39d6afe..1a84d0646 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 000000000..6b08d89c2 --- /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 79c2e6bc7..df491a6c0 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 -- GitLab