From d13c03092f312eababf4cba2a7404b94599a68f8 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Tue, 9 Jul 2024 20:45:45 +0800 Subject: [PATCH 01/18] [feat]lifetimes --- .../patch/react/getDefaultOptions.ios.js | 45 +++++++++++++++++-- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/packages/core/src/platform/patch/react/getDefaultOptions.ios.js b/packages/core/src/platform/patch/react/getDefaultOptions.ios.js index ed3ee2af22..30563db80e 100644 --- a/packages/core/src/platform/patch/react/getDefaultOptions.ios.js +++ b/packages/core/src/platform/patch/react/getDefaultOptions.ios.js @@ -1,11 +1,12 @@ -import { useEffect, useLayoutEffect, useSyncExternalStore, useRef, createElement, memo, forwardRef, useImperativeHandle } from 'react' +import { useEffect, useLayoutEffect, useSyncExternalStore, useRef, createElement, memo, forwardRef, useImperativeHandle, useContext, createContext } from 'react' import * as ReactNative from 'react-native' import { ReactiveEffect } from '../../../observer/effect' import { hasOwn, isFunction, noop, isObject, error, getByPath, collectDataset } from '@mpxjs/utils' import MpxProxy from '../../../core/proxy' -import { BEFOREUPDATE, UPDATED } from '../../../core/innerLifecycle' +import { BEFOREUPDATE, ONLOAD, UPDATED, ONSHOW, ONHIDE } from '../../../core/innerLifecycle' import mergeOptions from '../../../core/mergeOptions' import { queueJob } from '../../../observer/scheduler' +import { useIsFocused, useRoute } from '@react-navigation/native' function getNativeComponent (tagName) { return getByPath(ReactNative, tagName) @@ -196,17 +197,41 @@ function createInstance ({ propsRef, ref, type, rawOptions, currentInject, valid return instance } +// todo resize api +function usePageStatus(mpxProxy) { + const route = useRoute() + const { pageStatusContext } = global.__navigationHelper + const { pageStatus } = useContext(pageStatusContext[route.name]) + useEffect(() => { + mpxProxy.callHook(pageStatus ? ONSHOW : ONHIDE) + const pageLifetimes = mpxProxy.options.pageLifetimes + if (pageLifetimes) { + const instance = mpxProxy.target + if (pageStatus) { + pageLifetimes.show.call(instance) + } else { + pageLifetimes.hide.call(instance) + } + } + }, [pageStatus]) +} + export function getDefaultOptions ({ type, rawOptions = {}, currentInject }) { rawOptions = mergeOptions(rawOptions, type, false) const components = currentInject.getComponents() || {} const validProps = Object.assign({}, rawOptions.props, rawOptions.properties) const defaultOptions = memo(forwardRef((props, ref) => { + const route = useRoute() const instanceRef = useRef(null) const propsRef = useRef(props) let isFirst = false if (!instanceRef.current) { isFirst = true instanceRef.current = createInstance({ propsRef, ref, type, rawOptions, currentInject, validProps, components }) + if (type === 'page') { + const params = route.params || {} + instanceRef.current.__mpxProxy.callHook(ONLOAD, [params]) + } } const instance = instanceRef.current // reset instance @@ -228,6 +253,8 @@ export function getDefaultOptions ({ type, rawOptions = {}, currentInject }) { proxy.propsUpdated() } + usePageStatus(proxy) + useEffect(() => { if (proxy.pendingUpdatedFlag) { proxy.pendingUpdatedFlag = false @@ -250,7 +277,14 @@ export function getDefaultOptions ({ type, rawOptions = {}, currentInject }) { if (type === 'page') { const { Provider } = global.__navigationHelper const pageConfig = Object.assign({}, global.__mpxPageConfig, currentInject.pageConfig) + const pageStatusContext = createContext(null) const Page = ({ navigation }) => { + const isFocused = useIsFocused() + const { name } = useRoute() + global.__navigationHelper.pageStatusContext = global.__navigationHelper.pageStatusContext || {} + if (!global.__navigationHelper.pageStatusContext[name]) { + global.__navigationHelper.pageStatusContext[name] = pageStatusContext + } useLayoutEffect(() => { navigation.setOptions({ headerTitle: pageConfig.navigationBarTitleText || '', @@ -270,7 +304,12 @@ export function getDefaultOptions ({ type, rawOptions = {}, currentInject }) { }, showsVerticalScrollIndicator: false }, - createElement(defaultOptions) + createElement(pageStatusContext.Provider, + { + value: { pageStatus: isFocused } + }, + createElement(defaultOptions) + ) ) ) } From 240ff30d43c44d9d1ffa8270b0440ad98e11b975 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Fri, 12 Jul 2024 13:25:12 +0800 Subject: [PATCH 02/18] [feat]support onResize for page/component --- packages/core/src/platform/createApp.ios.js | 33 +++++++++++---- .../patch/react/getDefaultOptions.ios.js | 41 +++++++++++++++---- .../patch/react/orientationContext.js | 8 ++++ 3 files changed, 67 insertions(+), 15 deletions(-) create mode 100644 packages/core/src/platform/patch/react/orientationContext.js diff --git a/packages/core/src/platform/createApp.ios.js b/packages/core/src/platform/createApp.ios.js index 02e4537d23..bca5472e4f 100644 --- a/packages/core/src/platform/createApp.ios.js +++ b/packages/core/src/platform/createApp.ios.js @@ -4,7 +4,9 @@ import { makeMap, spreadProp } from '@mpxjs/utils' import { mergeLifecycle } from '../convertor/mergeLifecycle' import * as wxLifecycle from '../platform/patch/wx/lifecycle' import Mpx from '../index' -import { createElement, memo, useRef, useEffect } from 'react' +import { createElement, memo, useRef, useEffect, useState } from 'react' +import { Dimensions } from 'react-native' +import { OrientationContext, getOrientation } from '../platform/patch/react/orientationContext' const appHooksMap = makeMap(mergeLifecycle(wxLifecycle.LIFECYCLE).app) @@ -65,12 +67,22 @@ export default function createApp (option, config = {}) { global.__navigationHelper.lastFailCallback = null } } + global.__mpxOptionsMap[currentInject.moduleId] = memo(() => { + const [orientation, setOrientation] = useState(getOrientation()) const instanceRef = useRef(null) if (!instanceRef.current) { instanceRef.current = createAppInstance(appData) } const instance = instanceRef.current + useEffect(() => { + const listener = Dimensions.addEventListener('change', ({ window }) => { + setOrientation(getOrientation(window)) + }) + return () => { + listener && listener.remove() + } + }, []) useEffect(() => { const current = navigationRef.isReady() ? navigationRef.getCurrentRoute() : {} const options = { @@ -84,17 +96,22 @@ export default function createApp (option, config = {}) { // todo relaunch时会重复执行,需check defaultOptions.onLaunch && defaultOptions.onLaunch.call(instance, options) }, []) - return createElement(NavigationContainer, + return createElement(OrientationContext.Provider, { - ref: navigationRef, - onStateChange, - onUnhandledAction + value: { orientation } }, - createElement(Stack.Navigator, + createElement(NavigationContainer, { - initialRouteName: firstPage + ref: navigationRef, + onStateChange, + onUnhandledAction }, - ...pageScreens + createElement(Stack.Navigator, + { + initialRouteName: firstPage + }, + ...pageScreens + ) ) ) }) diff --git a/packages/core/src/platform/patch/react/getDefaultOptions.ios.js b/packages/core/src/platform/patch/react/getDefaultOptions.ios.js index 30563db80e..e0caa366fa 100644 --- a/packages/core/src/platform/patch/react/getDefaultOptions.ios.js +++ b/packages/core/src/platform/patch/react/getDefaultOptions.ios.js @@ -3,10 +3,11 @@ import * as ReactNative from 'react-native' import { ReactiveEffect } from '../../../observer/effect' import { hasOwn, isFunction, noop, isObject, error, getByPath, collectDataset } from '@mpxjs/utils' import MpxProxy from '../../../core/proxy' -import { BEFOREUPDATE, ONLOAD, UPDATED, ONSHOW, ONHIDE } from '../../../core/innerLifecycle' +import { BEFOREUPDATE, ONLOAD, UPDATED, ONSHOW, ONHIDE, ONRESIZE } from '../../../core/innerLifecycle' import mergeOptions from '../../../core/mergeOptions' import { queueJob } from '../../../observer/scheduler' import { useIsFocused, useRoute } from '@react-navigation/native' +import { OrientationContext } from './orientationContext' function getNativeComponent (tagName) { return getByPath(ReactNative, tagName) @@ -197,11 +198,11 @@ function createInstance ({ propsRef, ref, type, rawOptions, currentInject, valid return instance } -// todo resize api +const pageStatusContextMap = {} + function usePageStatus(mpxProxy) { const route = useRoute() - const { pageStatusContext } = global.__navigationHelper - const { pageStatus } = useContext(pageStatusContext[route.name]) + const { pageStatus } = useContext(pageStatusContextMap[route.name]) useEffect(() => { mpxProxy.callHook(pageStatus ? ONSHOW : ONHIDE) const pageLifetimes = mpxProxy.options.pageLifetimes @@ -209,13 +210,38 @@ function usePageStatus(mpxProxy) { const instance = mpxProxy.target if (pageStatus) { pageLifetimes.show.call(instance) + // isFunction(pageLifetimes.show) && pageLifetimes.show.call(instance) } else { pageLifetimes.hide.call(instance) + // isFunction(pageLifetimes.hide) && pageLifetimes.hide.call(instance) } } }, [pageStatus]) } +function useWindowSize(mpxProxy) { + const { orientation } = useContext(OrientationContext) + useEffect(() => { + const windowSize = ReactNative.Dimensions.get('window') + const screenSize = ReactNative.Dimensions.get('screen') + const systemInfo = { + deviceOrientation: orientation, + size: { + screenWidth: screenSize.width, + screenHeight: screenSize.height, + windowWidth: windowSize.width, + windowHeight: windowSize.height + } + } + const target = mpxProxy.target + // todo: 页面事件的 options 合并&调用方式 + // mpxProxy.callHook(ONRESIZE, [systemInfo]) + target.onResize && target.onResize.call(target, systemInfo) + const pageLifetimes = mpxProxy.options.pageLifetimes + pageLifetimes && isFunction(pageLifetimes.resize) && pageLifetimes.resize.call(target, systemInfo) + }, [orientation]) +} + export function getDefaultOptions ({ type, rawOptions = {}, currentInject }) { rawOptions = mergeOptions(rawOptions, type, false) const components = currentInject.getComponents() || {} @@ -255,6 +281,8 @@ export function getDefaultOptions ({ type, rawOptions = {}, currentInject }) { usePageStatus(proxy) + useWindowSize(proxy) + useEffect(() => { if (proxy.pendingUpdatedFlag) { proxy.pendingUpdatedFlag = false @@ -281,9 +309,8 @@ export function getDefaultOptions ({ type, rawOptions = {}, currentInject }) { const Page = ({ navigation }) => { const isFocused = useIsFocused() const { name } = useRoute() - global.__navigationHelper.pageStatusContext = global.__navigationHelper.pageStatusContext || {} - if (!global.__navigationHelper.pageStatusContext[name]) { - global.__navigationHelper.pageStatusContext[name] = pageStatusContext + if (!pageStatusContextMap[name]) { + pageStatusContextMap[name] = pageStatusContext } useLayoutEffect(() => { navigation.setOptions({ diff --git a/packages/core/src/platform/patch/react/orientationContext.js b/packages/core/src/platform/patch/react/orientationContext.js new file mode 100644 index 0000000000..0dd1c6691d --- /dev/null +++ b/packages/core/src/platform/patch/react/orientationContext.js @@ -0,0 +1,8 @@ +import { createContext } from 'react' +import { Dimensions } from 'react-native' + +export const OrientationContext = createContext(null) + +export function getOrientation (window = Dimensions.get('window')) { + return window.width > window.height ? 'landscape' : 'portrait' +} From 078c2eb9c3bce342806ab8d80787f57949b3c1c3 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Mon, 15 Jul 2024 14:21:12 +0800 Subject: [PATCH 03/18] little adjust --- .../src/platform/patch/react/getDefaultOptions.ios.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/core/src/platform/patch/react/getDefaultOptions.ios.js b/packages/core/src/platform/patch/react/getDefaultOptions.ios.js index e0caa366fa..4514514a5a 100644 --- a/packages/core/src/platform/patch/react/getDefaultOptions.ios.js +++ b/packages/core/src/platform/patch/react/getDefaultOptions.ios.js @@ -209,11 +209,9 @@ function usePageStatus(mpxProxy) { if (pageLifetimes) { const instance = mpxProxy.target if (pageStatus) { - pageLifetimes.show.call(instance) - // isFunction(pageLifetimes.show) && pageLifetimes.show.call(instance) + isFunction(pageLifetimes.show) && pageLifetimes.show.call(instance) } else { - pageLifetimes.hide.call(instance) - // isFunction(pageLifetimes.hide) && pageLifetimes.hide.call(instance) + isFunction(pageLifetimes.hide) && pageLifetimes.hide.call(instance) } } }, [pageStatus]) @@ -234,8 +232,6 @@ function useWindowSize(mpxProxy) { } } const target = mpxProxy.target - // todo: 页面事件的 options 合并&调用方式 - // mpxProxy.callHook(ONRESIZE, [systemInfo]) target.onResize && target.onResize.call(target, systemInfo) const pageLifetimes = mpxProxy.options.pageLifetimes pageLifetimes && isFunction(pageLifetimes.resize) && pageLifetimes.resize.call(target, systemInfo) From 24c2164bd350d9e45f18ee783043f7eb26b3c303 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Tue, 16 Jul 2024 15:12:12 +0800 Subject: [PATCH 04/18] fix lint --- .../src/platform/patch/react/getDefaultOptions.ios.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/core/src/platform/patch/react/getDefaultOptions.ios.js b/packages/core/src/platform/patch/react/getDefaultOptions.ios.js index 4514514a5a..97058ac358 100644 --- a/packages/core/src/platform/patch/react/getDefaultOptions.ios.js +++ b/packages/core/src/platform/patch/react/getDefaultOptions.ios.js @@ -3,7 +3,7 @@ import * as ReactNative from 'react-native' import { ReactiveEffect } from '../../../observer/effect' import { hasOwn, isFunction, noop, isObject, error, getByPath, collectDataset } from '@mpxjs/utils' import MpxProxy from '../../../core/proxy' -import { BEFOREUPDATE, ONLOAD, UPDATED, ONSHOW, ONHIDE, ONRESIZE } from '../../../core/innerLifecycle' +import { BEFOREUPDATE, ONLOAD, UPDATED, ONSHOW, ONHIDE } from '../../../core/innerLifecycle' import mergeOptions from '../../../core/mergeOptions' import { queueJob } from '../../../observer/scheduler' import { useIsFocused, useRoute } from '@react-navigation/native' @@ -200,7 +200,7 @@ function createInstance ({ propsRef, ref, type, rawOptions, currentInject, valid const pageStatusContextMap = {} -function usePageStatus(mpxProxy) { +function usePageStatus (mpxProxy) { const route = useRoute() const { pageStatus } = useContext(pageStatusContextMap[route.name]) useEffect(() => { @@ -217,7 +217,7 @@ function usePageStatus(mpxProxy) { }, [pageStatus]) } -function useWindowSize(mpxProxy) { +function useWindowSize (mpxProxy) { const { orientation } = useContext(OrientationContext) useEffect(() => { const windowSize = ReactNative.Dimensions.get('window') @@ -232,7 +232,7 @@ function useWindowSize(mpxProxy) { } } const target = mpxProxy.target - target.onResize && target.onResize.call(target, systemInfo) + target.onResize && target.onResize(systemInfo) const pageLifetimes = mpxProxy.options.pageLifetimes pageLifetimes && isFunction(pageLifetimes.resize) && pageLifetimes.resize.call(target, systemInfo) }, [orientation]) From 016c551f3efe3d8e5efc85189eef39a83e87e50c Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Wed, 17 Jul 2024 18:24:03 +0800 Subject: [PATCH 05/18] [optimize]lifetimes --- packages/core/src/platform/createApp.ios.js | 33 ++---- .../patch/react/getDefaultOptions.ios.js | 103 ++++++++++++------ .../patch/react/orientationContext.js | 8 -- 3 files changed, 79 insertions(+), 65 deletions(-) delete mode 100644 packages/core/src/platform/patch/react/orientationContext.js diff --git a/packages/core/src/platform/createApp.ios.js b/packages/core/src/platform/createApp.ios.js index bca5472e4f..6dbf03c39f 100644 --- a/packages/core/src/platform/createApp.ios.js +++ b/packages/core/src/platform/createApp.ios.js @@ -4,9 +4,7 @@ import { makeMap, spreadProp } from '@mpxjs/utils' import { mergeLifecycle } from '../convertor/mergeLifecycle' import * as wxLifecycle from '../platform/patch/wx/lifecycle' import Mpx from '../index' -import { createElement, memo, useRef, useEffect, useState } from 'react' -import { Dimensions } from 'react-native' -import { OrientationContext, getOrientation } from '../platform/patch/react/orientationContext' +import { createElement, memo, useRef, useEffect } from 'react' const appHooksMap = makeMap(mergeLifecycle(wxLifecycle.LIFECYCLE).app) @@ -69,20 +67,11 @@ export default function createApp (option, config = {}) { } global.__mpxOptionsMap[currentInject.moduleId] = memo(() => { - const [orientation, setOrientation] = useState(getOrientation()) const instanceRef = useRef(null) if (!instanceRef.current) { instanceRef.current = createAppInstance(appData) } const instance = instanceRef.current - useEffect(() => { - const listener = Dimensions.addEventListener('change', ({ window }) => { - setOrientation(getOrientation(window)) - }) - return () => { - listener && listener.remove() - } - }, []) useEffect(() => { const current = navigationRef.isReady() ? navigationRef.getCurrentRoute() : {} const options = { @@ -96,22 +85,18 @@ export default function createApp (option, config = {}) { // todo relaunch时会重复执行,需check defaultOptions.onLaunch && defaultOptions.onLaunch.call(instance, options) }, []) - return createElement(OrientationContext.Provider, + + return createElement(NavigationContainer, { - value: { orientation } + ref: navigationRef, + onStateChange, + onUnhandledAction }, - createElement(NavigationContainer, + createElement(Stack.Navigator, { - ref: navigationRef, - onStateChange, - onUnhandledAction + initialRouteName: firstPage }, - createElement(Stack.Navigator, - { - initialRouteName: firstPage - }, - ...pageScreens - ) + ...pageScreens ) ) }) diff --git a/packages/core/src/platform/patch/react/getDefaultOptions.ios.js b/packages/core/src/platform/patch/react/getDefaultOptions.ios.js index 97058ac358..580ddad79a 100644 --- a/packages/core/src/platform/patch/react/getDefaultOptions.ios.js +++ b/packages/core/src/platform/patch/react/getDefaultOptions.ios.js @@ -1,13 +1,30 @@ import { useEffect, useLayoutEffect, useSyncExternalStore, useRef, createElement, memo, forwardRef, useImperativeHandle, useContext, createContext } from 'react' import * as ReactNative from 'react-native' import { ReactiveEffect } from '../../../observer/effect' -import { hasOwn, isFunction, noop, isObject, error, getByPath, collectDataset } from '@mpxjs/utils' +import { hasOwn, isFunction, noop, isObject, error, getByPath, collectDataset, isBoolean } from '@mpxjs/utils' import MpxProxy from '../../../core/proxy' import { BEFOREUPDATE, ONLOAD, UPDATED, ONSHOW, ONHIDE } from '../../../core/innerLifecycle' import mergeOptions from '../../../core/mergeOptions' import { queueJob } from '../../../observer/scheduler' import { useIsFocused, useRoute } from '@react-navigation/native' -import { OrientationContext } from './orientationContext' + +function getOrientation (window = ReactNative.Dimensions.get('window')) { + return window.width > window.height ? 'landscape' : 'portrait' +} + +function getSystemInfo () { + const window = ReactNative.Dimensions.get('window') + const screen = ReactNative.Dimensions.get('screen') + return { + deviceOrientation: getOrientation(), + size: { + screenWidth: screen.width, + screenHeight: screen.height, + windowWidth: window.width, + windowHeight: window.height + } + } +} function getNativeComponent (tagName) { return getByPath(ReactNative, tagName) @@ -198,44 +215,65 @@ function createInstance ({ propsRef, ref, type, rawOptions, currentInject, valid return instance } -const pageStatusContextMap = {} +const pageStatusContext = createContext(null) function usePageStatus (mpxProxy) { - const route = useRoute() - const { pageStatus } = useContext(pageStatusContextMap[route.name]) - useEffect(() => { - mpxProxy.callHook(pageStatus ? ONSHOW : ONHIDE) + const { pageStatus } = useContext(pageStatusContext) || {} + + const triggerPageStatusHook = (event) => { + mpxProxy.callHook(event === 'show' ? ONSHOW : ONHIDE) const pageLifetimes = mpxProxy.options.pageLifetimes if (pageLifetimes) { const instance = mpxProxy.target - if (pageStatus) { - isFunction(pageLifetimes.show) && pageLifetimes.show.call(instance) - } else { - isFunction(pageLifetimes.hide) && pageLifetimes.hide.call(instance) + isFunction(pageLifetimes[event]) && pageLifetimes[event].call(instance) + } + } + + useEffect(() => { + if (!isBoolean(pageStatus)) return + triggerPageStatusHook(pageStatus ? 'show' : 'hide') + + const subscription = ReactNative.AppState.addEventListener('change', (currentState) => { + if (currentState === 'active') { + pageStatus && triggerPageStatusHook('show') + } else if (currentState === 'background') { + pageStatus && triggerPageStatusHook('hide') } + }) + return () => { + subscription.remove() } }, [pageStatus]) } function useWindowSize (mpxProxy) { - const { orientation } = useContext(OrientationContext) - useEffect(() => { - const windowSize = ReactNative.Dimensions.get('window') - const screenSize = ReactNative.Dimensions.get('screen') - const systemInfo = { - deviceOrientation: orientation, - size: { - screenWidth: screenSize.width, - screenHeight: screenSize.height, - windowWidth: windowSize.width, - windowHeight: windowSize.height - } - } + const { pageStatus } = useContext(pageStatusContext) || {} + + const triggerResizeEvent = () => { + const systemInfo = getSystemInfo() const target = mpxProxy.target target.onResize && target.onResize(systemInfo) const pageLifetimes = mpxProxy.options.pageLifetimes pageLifetimes && isFunction(pageLifetimes.resize) && pageLifetimes.resize.call(target, systemInfo) - }, [orientation]) + } + + useEffect(() => { + let lastOrientation = getOrientation() + const isShow = isBoolean(pageStatus) && pageStatus + if (isShow) { + triggerResizeEvent() + } + + const subscription = ReactNative.Dimensions.addEventListener('change', ({ window }) => { + const orientation = getOrientation(window) + if (orientation === lastOrientation || !isShow) return + triggerResizeEvent() + lastOrientation = orientation + }) + return () => { + subscription.remove() + } + }, [pageStatus]) } export function getDefaultOptions ({ type, rawOptions = {}, currentInject }) { @@ -243,7 +281,6 @@ export function getDefaultOptions ({ type, rawOptions = {}, currentInject }) { const components = currentInject.getComponents() || {} const validProps = Object.assign({}, rawOptions.props, rawOptions.properties) const defaultOptions = memo(forwardRef((props, ref) => { - const route = useRoute() const instanceRef = useRef(null) const propsRef = useRef(props) let isFirst = false @@ -251,7 +288,7 @@ export function getDefaultOptions ({ type, rawOptions = {}, currentInject }) { isFirst = true instanceRef.current = createInstance({ propsRef, ref, type, rawOptions, currentInject, validProps, components }) if (type === 'page') { - const params = route.params || {} + const params = props.route.params || {} instanceRef.current.__mpxProxy.callHook(ONLOAD, [params]) } } @@ -301,13 +338,9 @@ export function getDefaultOptions ({ type, rawOptions = {}, currentInject }) { if (type === 'page') { const { Provider } = global.__navigationHelper const pageConfig = Object.assign({}, global.__mpxPageConfig, currentInject.pageConfig) - const pageStatusContext = createContext(null) const Page = ({ navigation }) => { const isFocused = useIsFocused() - const { name } = useRoute() - if (!pageStatusContextMap[name]) { - pageStatusContextMap[name] = pageStatusContext - } + const route = useRoute() useLayoutEffect(() => { navigation.setOptions({ headerTitle: pageConfig.navigationBarTitleText || '', @@ -331,7 +364,11 @@ export function getDefaultOptions ({ type, rawOptions = {}, currentInject }) { { value: { pageStatus: isFocused } }, - createElement(defaultOptions) + createElement(defaultOptions, + { + route + } + ) ) ) ) diff --git a/packages/core/src/platform/patch/react/orientationContext.js b/packages/core/src/platform/patch/react/orientationContext.js deleted file mode 100644 index 0dd1c6691d..0000000000 --- a/packages/core/src/platform/patch/react/orientationContext.js +++ /dev/null @@ -1,8 +0,0 @@ -import { createContext } from 'react' -import { Dimensions } from 'react-native' - -export const OrientationContext = createContext(null) - -export function getOrientation (window = Dimensions.get('window')) { - return window.width > window.height ? 'landscape' : 'portrait' -} From 3faa7c9911cf41fa315fa03fa940ee9e090b702a Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Wed, 17 Jul 2024 18:39:56 +0800 Subject: [PATCH 06/18] [optimize] --- .../patch/react/getDefaultOptions.ios.js | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/packages/core/src/platform/patch/react/getDefaultOptions.ios.js b/packages/core/src/platform/patch/react/getDefaultOptions.ios.js index 580ddad79a..894604b627 100644 --- a/packages/core/src/platform/patch/react/getDefaultOptions.ios.js +++ b/packages/core/src/platform/patch/react/getDefaultOptions.ios.js @@ -217,27 +217,27 @@ function createInstance ({ propsRef, ref, type, rawOptions, currentInject, valid const pageStatusContext = createContext(null) +const triggerPageStatusHook = (mpxProxy, event) => { + mpxProxy.callHook(event === 'show' ? ONSHOW : ONHIDE) + const pageLifetimes = mpxProxy.options.pageLifetimes + if (pageLifetimes) { + const instance = mpxProxy.target + isFunction(pageLifetimes[event]) && pageLifetimes[event].call(instance) + } +} + function usePageStatus (mpxProxy) { const { pageStatus } = useContext(pageStatusContext) || {} - const triggerPageStatusHook = (event) => { - mpxProxy.callHook(event === 'show' ? ONSHOW : ONHIDE) - const pageLifetimes = mpxProxy.options.pageLifetimes - if (pageLifetimes) { - const instance = mpxProxy.target - isFunction(pageLifetimes[event]) && pageLifetimes[event].call(instance) - } - } - useEffect(() => { if (!isBoolean(pageStatus)) return - triggerPageStatusHook(pageStatus ? 'show' : 'hide') + triggerPageStatusHook(mpxProxy, pageStatus ? 'show' : 'hide') const subscription = ReactNative.AppState.addEventListener('change', (currentState) => { if (currentState === 'active') { - pageStatus && triggerPageStatusHook('show') + pageStatus && triggerPageStatusHook(mpxProxy, 'show') } else if (currentState === 'background') { - pageStatus && triggerPageStatusHook('hide') + pageStatus && triggerPageStatusHook(mpxProxy, 'hide') } }) return () => { @@ -246,28 +246,28 @@ function usePageStatus (mpxProxy) { }, [pageStatus]) } +const triggerResizeEvent = (mpxProxy) => { + const systemInfo = getSystemInfo() + const target = mpxProxy.target + target.onResize && target.onResize(systemInfo) + const pageLifetimes = mpxProxy.options.pageLifetimes + pageLifetimes && isFunction(pageLifetimes.resize) && pageLifetimes.resize.call(target, systemInfo) +} + function useWindowSize (mpxProxy) { const { pageStatus } = useContext(pageStatusContext) || {} - const triggerResizeEvent = () => { - const systemInfo = getSystemInfo() - const target = mpxProxy.target - target.onResize && target.onResize(systemInfo) - const pageLifetimes = mpxProxy.options.pageLifetimes - pageLifetimes && isFunction(pageLifetimes.resize) && pageLifetimes.resize.call(target, systemInfo) - } - useEffect(() => { let lastOrientation = getOrientation() const isShow = isBoolean(pageStatus) && pageStatus if (isShow) { - triggerResizeEvent() + triggerResizeEvent(mpxProxy) } const subscription = ReactNative.Dimensions.addEventListener('change', ({ window }) => { const orientation = getOrientation(window) if (orientation === lastOrientation || !isShow) return - triggerResizeEvent() + triggerResizeEvent(mpxProxy) lastOrientation = orientation }) return () => { From 5a5c514d0df454e8ade744b8ed8ad647685aa5c2 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Mon, 22 Jul 2024 10:06:08 +0800 Subject: [PATCH 07/18] [optimize]reactive for page lifetime --- .../patch/react/getDefaultOptions.ios.js | 126 +++++++++++------- 1 file changed, 77 insertions(+), 49 deletions(-) diff --git a/packages/core/src/platform/patch/react/getDefaultOptions.ios.js b/packages/core/src/platform/patch/react/getDefaultOptions.ios.js index 4ad44a6dff..53e1090a42 100644 --- a/packages/core/src/platform/patch/react/getDefaultOptions.ios.js +++ b/packages/core/src/platform/patch/react/getDefaultOptions.ios.js @@ -1,7 +1,9 @@ import { useEffect, useLayoutEffect, useSyncExternalStore, useRef, createElement, memo, forwardRef, useImperativeHandle, useContext, createContext } from 'react' import * as ReactNative from 'react-native' import { ReactiveEffect } from '../../../observer/effect' -import { hasOwn, isFunction, noop, isObject, error, getByPath, collectDataset, isBoolean } from '@mpxjs/utils' +import { watch } from '../../../observer/watch' +import { reactive, set } from '../../../observer/reactive' +import { hasOwn, isFunction, noop, isObject, error, getByPath, collectDataset, isString } from '@mpxjs/utils' import MpxProxy from '../../../core/proxy' import { BEFOREUPDATE, ONLOAD, UPDATED, ONSHOW, ONHIDE } from '../../../core/innerLifecycle' import mergeOptions from '../../../core/mergeOptions' @@ -26,6 +28,18 @@ function getSystemInfo () { } } +function hasPageHook (rawOptions, hook = []) { + if (isString(hook)) { + hook = [hook] + } + const type = rawOptions.__type__ + if (type === 'page') { + return hook.some(h => isFunction(rawOptions[h]) || isFunction(rawOptions.methods[h])) + } else if (type === 'component') { + return hook.some(h => rawOptions.pageLifetimes && isFunction(rawOptions.pageLifetimes[h])) + } +} + function getRootProps (props) { const rootProps = {} for (const key in props) { @@ -226,65 +240,81 @@ function createInstance ({ propsRef, type, rawOptions, currentInject, validProps return instance } -const pageStatusContext = createContext(null) +const routeContext = createContext(null) const triggerPageStatusHook = (mpxProxy, event) => { - mpxProxy.callHook(event === 'show' ? ONSHOW : ONHIDE) - const pageLifetimes = mpxProxy.options.pageLifetimes - if (pageLifetimes) { - const instance = mpxProxy.target - isFunction(pageLifetimes[event]) && pageLifetimes[event].call(instance) + const type = mpxProxy.options.__type__ + if (type === 'page') { + mpxProxy.callHook(event === 'show' ? ONSHOW : ONHIDE) + } else { + const pageLifetimes = mpxProxy.options.pageLifetimes + if (pageLifetimes) { + const instance = mpxProxy.target + isFunction(pageLifetimes[event]) && pageLifetimes[event].call(instance) + } } } -function usePageStatus (mpxProxy) { - const { pageStatus } = useContext(pageStatusContext) || {} +function usePageStatus (mpxProxy, rawOptions) { + const { routeName } = useContext(routeContext) || {} useEffect(() => { - if (!isBoolean(pageStatus)) return - triggerPageStatusHook(mpxProxy, pageStatus ? 'show' : 'hide') - - const subscription = ReactNative.AppState.addEventListener('change', (currentState) => { - if (currentState === 'active') { - pageStatus && triggerPageStatusHook(mpxProxy, 'show') - } else if (currentState === 'background') { - pageStatus && triggerPageStatusHook(mpxProxy, 'hide') + let chnageSubscription + let resizeSubScription + let pageStatus + + const watcher = watch(() => pageStatusContext[routeName], (newVal) => { + pageStatus = newVal + triggerPageStatusHook(mpxProxy, pageStatus ? 'show' : 'hide') + }, { immediate: true }) + + if (hasPageHook(rawOptions, ['show', 'hide', ONSHOW, ONHIDE])) { + chnageSubscription = ReactNative.AppState.addEventListener('change', (currentState) => { + if (currentState === 'active') { + pageStatus && triggerPageStatusHook(mpxProxy, 'show') + } else if (currentState === 'background') { + pageStatus && triggerPageStatusHook(mpxProxy, 'hide') + } + }) + } + + if (hasPageHook(rawOptions, ['onResize', 'resize'])) { + let lastOrientation = getOrientation() + if (pageStatus) { + triggerResizeEvent(mpxProxy) } - }) + + resizeSubScription = ReactNative.Dimensions.addEventListener('change', ({ window }) => { + const orientation = getOrientation(window) + if (orientation === lastOrientation || !pageStatus) return + triggerResizeEvent(mpxProxy) + lastOrientation = orientation + }) + } + return () => { - subscription.remove() + chnageSubscription && chnageSubscription.remove() + resizeSubScription && resizeSubScription.remove() + watcher && watcher() } - }, [pageStatus]) + }, []) } const triggerResizeEvent = (mpxProxy) => { + const type = mpxProxy.options.__type__ const systemInfo = getSystemInfo() const target = mpxProxy.target - target.onResize && target.onResize(systemInfo) - const pageLifetimes = mpxProxy.options.pageLifetimes - pageLifetimes && isFunction(pageLifetimes.resize) && pageLifetimes.resize.call(target, systemInfo) + if (type === 'page') { + target.onResize && target.onResize(systemInfo) + } else { + const pageLifetimes = mpxProxy.options.pageLifetimes + pageLifetimes && isFunction(pageLifetimes.resize) && pageLifetimes.resize.call(target, systemInfo) + } } -function useWindowSize (mpxProxy) { - const { pageStatus } = useContext(pageStatusContext) || {} - - useEffect(() => { - let lastOrientation = getOrientation() - const isShow = isBoolean(pageStatus) && pageStatus - if (isShow) { - triggerResizeEvent(mpxProxy) - } - - const subscription = ReactNative.Dimensions.addEventListener('change', ({ window }) => { - const orientation = getOrientation(window) - if (orientation === lastOrientation || !isShow) return - triggerResizeEvent(mpxProxy) - lastOrientation = orientation - }) - return () => { - subscription.remove() - } - }, [pageStatus]) +const pageStatusContext = reactive({}) +function setPageStatus (routeName, val) { + set(pageStatusContext, routeName, val) } export function getDefaultOptions ({ type, rawOptions = {}, currentInject }) { @@ -319,9 +349,7 @@ export function getDefaultOptions ({ type, rawOptions = {}, currentInject }) { proxy.propsUpdated() } - usePageStatus(proxy) - - useWindowSize(proxy) + usePageStatus(proxy, rawOptions) useEffect(() => { if (proxy.pendingUpdatedFlag) { @@ -349,7 +377,7 @@ export function getDefaultOptions ({ type, rawOptions = {}, currentInject }) { const { Provider } = global.__navigationHelper const pageConfig = Object.assign({}, global.__mpxPageConfig, currentInject.pageConfig) const Page = ({ navigation, route }) => { - const isFocused = useIsFocused() + setPageStatus(route.name, useIsFocused()) useLayoutEffect(() => { navigation.setOptions({ headerTitle: pageConfig.navigationBarTitleText || '', @@ -369,9 +397,9 @@ export function getDefaultOptions ({ type, rawOptions = {}, currentInject }) { backgroundColor: pageConfig.backgroundColor || '#ffffff' } }, - createElement(pageStatusContext.Provider, + createElement(routeContext.Provider, { - value: { pageStatus: isFocused } + value: { routeName: route.name } }, createElement(defaultOptions, { From 6ad6f3051a869fb9fe5fd4990f76b7e95674d744 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Mon, 22 Jul 2024 10:28:42 +0800 Subject: [PATCH 08/18] [fix]edge case --- .../core/src/platform/patch/react/getDefaultOptions.ios.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/core/src/platform/patch/react/getDefaultOptions.ios.js b/packages/core/src/platform/patch/react/getDefaultOptions.ios.js index 53e1090a42..8beeee73c5 100644 --- a/packages/core/src/platform/patch/react/getDefaultOptions.ios.js +++ b/packages/core/src/platform/patch/react/getDefaultOptions.ios.js @@ -286,9 +286,11 @@ function usePageStatus (mpxProxy, rawOptions) { resizeSubScription = ReactNative.Dimensions.addEventListener('change', ({ window }) => { const orientation = getOrientation(window) - if (orientation === lastOrientation || !pageStatus) return - triggerResizeEvent(mpxProxy) + if (orientation === lastOrientation) return lastOrientation = orientation + if (pageStatus) { + triggerResizeEvent(mpxProxy) + } }) } From 7e0e83e1e493b625ecddba6eff6493c8a8a67fc9 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Mon, 29 Jul 2024 11:01:26 +0800 Subject: [PATCH 09/18] [update]support hook --- .../patch/react/getDefaultOptions.ios.js | 63 ++++++++++--------- 1 file changed, 35 insertions(+), 28 deletions(-) diff --git a/packages/core/src/platform/patch/react/getDefaultOptions.ios.js b/packages/core/src/platform/patch/react/getDefaultOptions.ios.js index 8beeee73c5..00a6560735 100644 --- a/packages/core/src/platform/patch/react/getDefaultOptions.ios.js +++ b/packages/core/src/platform/patch/react/getDefaultOptions.ios.js @@ -3,9 +3,9 @@ import * as ReactNative from 'react-native' import { ReactiveEffect } from '../../../observer/effect' import { watch } from '../../../observer/watch' import { reactive, set } from '../../../observer/reactive' -import { hasOwn, isFunction, noop, isObject, error, getByPath, collectDataset, isString } from '@mpxjs/utils' +import { hasOwn, isFunction, noop, isObject, error, getByPath, collectDataset } from '@mpxjs/utils' import MpxProxy from '../../../core/proxy' -import { BEFOREUPDATE, ONLOAD, UPDATED, ONSHOW, ONHIDE } from '../../../core/innerLifecycle' +import { BEFOREUPDATE, ONLOAD, UPDATED, ONSHOW, ONHIDE, ONRESIZE } from '../../../core/innerLifecycle' import mergeOptions from '../../../core/mergeOptions' import { queueJob } from '../../../observer/scheduler' import { useIsFocused } from '@react-navigation/native' @@ -28,15 +28,22 @@ function getSystemInfo () { } } -function hasPageHook (rawOptions, hook = []) { - if (isString(hook)) { - hook = [hook] +function hasPageHook (mpxProxy, hooks = [], componentHooks = [], pageHooks = []) { + if (hooks.some(h => mpxProxy.hasHook(h))) { + return true } - const type = rawOptions.__type__ + const options = mpxProxy.options + const type = options.__type__ if (type === 'page') { - return hook.some(h => isFunction(rawOptions[h]) || isFunction(rawOptions.methods[h])) + return pageHooks.some(h => { + if (h === 'onResize') { + return isFunction(options.methods[h]) + } else { + return mpxProxy.hasHook(h) + } + }) } else if (type === 'component') { - return hook.some(h => rawOptions.pageLifetimes && isFunction(rawOptions.pageLifetimes[h])) + return componentHooks.some(h => options.pageLifetimes && isFunction(options.pageLifetimes[h])) } } @@ -243,19 +250,15 @@ function createInstance ({ propsRef, type, rawOptions, currentInject, validProps const routeContext = createContext(null) const triggerPageStatusHook = (mpxProxy, event) => { - const type = mpxProxy.options.__type__ - if (type === 'page') { - mpxProxy.callHook(event === 'show' ? ONSHOW : ONHIDE) - } else { - const pageLifetimes = mpxProxy.options.pageLifetimes - if (pageLifetimes) { - const instance = mpxProxy.target - isFunction(pageLifetimes[event]) && pageLifetimes[event].call(instance) - } + mpxProxy.callHook(event === 'show' ? ONSHOW : ONHIDE) + const pageLifetimes = mpxProxy.options.pageLifetimes + if (pageLifetimes) { + const instance = mpxProxy.target + isFunction(pageLifetimes[event]) && pageLifetimes[event].call(instance) } } -function usePageStatus (mpxProxy, rawOptions) { +function usePageStatus (mpxProxy) { const { routeName } = useContext(routeContext) || {} useEffect(() => { @@ -268,7 +271,7 @@ function usePageStatus (mpxProxy, rawOptions) { triggerPageStatusHook(mpxProxy, pageStatus ? 'show' : 'hide') }, { immediate: true }) - if (hasPageHook(rawOptions, ['show', 'hide', ONSHOW, ONHIDE])) { + if (hasPageHook(mpxProxy, [ONSHOW, ONHIDE], ['show', 'hide'])) { chnageSubscription = ReactNative.AppState.addEventListener('change', (currentState) => { if (currentState === 'active') { pageStatus && triggerPageStatusHook(mpxProxy, 'show') @@ -278,20 +281,23 @@ function usePageStatus (mpxProxy, rawOptions) { }) } - if (hasPageHook(rawOptions, ['onResize', 'resize'])) { + if (hasPageHook(mpxProxy, [ONRESIZE], ['resize'], ['onResize'])) { let lastOrientation = getOrientation() if (pageStatus) { triggerResizeEvent(mpxProxy) } - resizeSubScription = ReactNative.Dimensions.addEventListener('change', ({ window }) => { - const orientation = getOrientation(window) - if (orientation === lastOrientation) return - lastOrientation = orientation - if (pageStatus) { - triggerResizeEvent(mpxProxy) + resizeSubScription = ReactNative.Dimensions.addEventListener( + 'change', + ({ window }) => { + const orientation = getOrientation(window) + if (orientation === lastOrientation) return + lastOrientation = orientation + if (pageStatus) { + triggerResizeEvent(mpxProxy) + } } - }) + ) } return () => { @@ -306,6 +312,7 @@ const triggerResizeEvent = (mpxProxy) => { const type = mpxProxy.options.__type__ const systemInfo = getSystemInfo() const target = mpxProxy.target + mpxProxy.callHook(ONRESIZE, [systemInfo]) if (type === 'page') { target.onResize && target.onResize(systemInfo) } else { @@ -351,7 +358,7 @@ export function getDefaultOptions ({ type, rawOptions = {}, currentInject }) { proxy.propsUpdated() } - usePageStatus(proxy, rawOptions) + usePageStatus(proxy) useEffect(() => { if (proxy.pendingUpdatedFlag) { From 85a4a264ba38e720e2fb6e9aaaec1303252ac6c9 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Mon, 19 Aug 2024 16:28:54 +0800 Subject: [PATCH 10/18] [optimize]optimize lifetimes --- packages/core/src/core/proxy.js | 16 +- .../patch/react/getDefaultOptions.ios.js | 144 +++++++++--------- 2 files changed, 88 insertions(+), 72 deletions(-) diff --git a/packages/core/src/core/proxy.js b/packages/core/src/core/proxy.js index d118968f4c..c6ab0c6772 100644 --- a/packages/core/src/core/proxy.js +++ b/packages/core/src/core/proxy.js @@ -385,7 +385,21 @@ export default class MpxProxy { } hasHook (hookName) { - return !!(this.options[hookName] || this.hooks[hookName]) + if (isString(hookName)) { + hookName = [hookName] + } + const type = this.options.__type__ + return hookName.some(h => { + if (this.options[h] || this.hooks[h]) { + return true + } + if (type === 'page') { + return isFunction(this.options.methods[h]) + } else if (type === 'component') { + return this.options.pageLifetimes && isFunction(this.options.pageLifetimes[h]) + } + return false + }) } render () { diff --git a/packages/core/src/platform/patch/react/getDefaultOptions.ios.js b/packages/core/src/platform/patch/react/getDefaultOptions.ios.js index 00a6560735..d61bf8a403 100644 --- a/packages/core/src/platform/patch/react/getDefaultOptions.ios.js +++ b/packages/core/src/platform/patch/react/getDefaultOptions.ios.js @@ -8,7 +8,6 @@ import MpxProxy from '../../../core/proxy' import { BEFOREUPDATE, ONLOAD, UPDATED, ONSHOW, ONHIDE, ONRESIZE } from '../../../core/innerLifecycle' import mergeOptions from '../../../core/mergeOptions' import { queueJob } from '../../../observer/scheduler' -import { useIsFocused } from '@react-navigation/native' function getOrientation (window = ReactNative.Dimensions.get('window')) { return window.width > window.height ? 'landscape' : 'portrait' @@ -28,25 +27,6 @@ function getSystemInfo () { } } -function hasPageHook (mpxProxy, hooks = [], componentHooks = [], pageHooks = []) { - if (hooks.some(h => mpxProxy.hasHook(h))) { - return true - } - const options = mpxProxy.options - const type = options.__type__ - if (type === 'page') { - return pageHooks.some(h => { - if (h === 'onResize') { - return isFunction(options.methods[h]) - } else { - return mpxProxy.hasHook(h) - } - }) - } else if (type === 'component') { - return componentHooks.some(h => options.pageLifetimes && isFunction(options.pageLifetimes[h])) - } -} - function getRootProps (props) { const rootProps = {} for (const key in props) { @@ -258,74 +238,95 @@ const triggerPageStatusHook = (mpxProxy, event) => { } } -function usePageStatus (mpxProxy) { +const triggerResizeEvent = (mpxProxy) => { + const type = mpxProxy.options.__type__ + const systemInfo = getSystemInfo() + const target = mpxProxy.target + mpxProxy.callHook(ONRESIZE, [systemInfo]) + if (type === 'page') { + target.onResize && target.onResize(systemInfo) + } else { + const pageLifetimes = mpxProxy.options.pageLifetimes + pageLifetimes && isFunction(pageLifetimes.resize) && pageLifetimes.resize.call(target, systemInfo) + } +} + +function usePageContext (mpxProxy) { const { routeName } = useContext(routeContext) || {} useEffect(() => { - let chnageSubscription - let resizeSubScription - let pageStatus - - const watcher = watch(() => pageStatusContext[routeName], (newVal) => { - pageStatus = newVal - triggerPageStatusHook(mpxProxy, pageStatus ? 'show' : 'hide') - }, { immediate: true }) - - if (hasPageHook(mpxProxy, [ONSHOW, ONHIDE], ['show', 'hide'])) { - chnageSubscription = ReactNative.AppState.addEventListener('change', (currentState) => { - if (currentState === 'active') { - pageStatus && triggerPageStatusHook(mpxProxy, 'show') - } else if (currentState === 'background') { - pageStatus && triggerPageStatusHook(mpxProxy, 'hide') - } - }) - } - - if (hasPageHook(mpxProxy, [ONRESIZE], ['resize'], ['onResize'])) { - let lastOrientation = getOrientation() - if (pageStatus) { + let watcher + const hasShowHook = mpxProxy.hasHook([ONSHOW, 'show']) + const hasHideHook = mpxProxy.hasHook([ONHIDE, 'hide']) + const hasResizeHook = mpxProxy.hasHook([ONRESIZE, 'resize', 'onResize']) + if (hasShowHook || hasHideHook || hasResizeHook) { + // wx 真机上 resize 初次就会触发 + if (hasResizeHook) { triggerResizeEvent(mpxProxy) } - - resizeSubScription = ReactNative.Dimensions.addEventListener( - 'change', - ({ window }) => { - const orientation = getOrientation(window) - if (orientation === lastOrientation) return - lastOrientation = orientation - if (pageStatus) { - triggerResizeEvent(mpxProxy) - } + watcher = watch(() => pageStatusContext[routeName], (newVal) => { + if (newVal === 'show' || newVal === 'hide') { + triggerPageStatusHook(mpxProxy, newVal) + } else if (/^resize/.test(newVal)) { + triggerResizeEvent(mpxProxy) } - ) + }, { immediate: true }) } return () => { - chnageSubscription && chnageSubscription.remove() - resizeSubScription && resizeSubScription.remove() watcher && watcher() } }, []) } -const triggerResizeEvent = (mpxProxy) => { - const type = mpxProxy.options.__type__ - const systemInfo = getSystemInfo() - const target = mpxProxy.target - mpxProxy.callHook(ONRESIZE, [systemInfo]) - if (type === 'page') { - target.onResize && target.onResize(systemInfo) - } else { - const pageLifetimes = mpxProxy.options.pageLifetimes - pageLifetimes && isFunction(pageLifetimes.resize) && pageLifetimes.resize.call(target, systemInfo) - } -} - const pageStatusContext = reactive({}) function setPageStatus (routeName, val) { set(pageStatusContext, routeName, val) } +function usePageStatus (navigation, route) { + let isFocused = true + setPageStatus(route.name, 'show') + useEffect(() => { + const focusSubscription = navigation.addListener('focus', () => { + setPageStatus(route.name, 'show') + isFocused = true + }) + const blurSubscription = navigation.addListener('blur', () => { + setPageStatus(route.name, 'hide') + isFocused = false + }) + const changeSubscription = ReactNative.AppState.addEventListener('change', (currentState) => { + if (currentState === 'active') { + isFocused && setPageStatus(route.name, 'show') + } else if (currentState === 'background') { + isFocused && setPageStatus(route.name, 'hide') + } + }) + + let count = 0 + let lastOrientation = getOrientation() + const resizeSubScription = ReactNative.Dimensions.addEventListener( + 'change', + ({ window }) => { + const orientation = getOrientation(window) + if (orientation === lastOrientation) return + lastOrientation = orientation + if (isFocused) { + setPageStatus(route.name, `resize${count++}`) + } + } + ) + + return () => { + focusSubscription() + blurSubscription() + changeSubscription && changeSubscription.remove() + resizeSubScription && resizeSubScription.remove() + } + }, [navigation]) +} + export function getDefaultOptions ({ type, rawOptions = {}, currentInject }) { rawOptions = mergeOptions(rawOptions, type, false) const components = Object.assign({}, rawOptions.components, currentInject.getComponents()) @@ -358,7 +359,7 @@ export function getDefaultOptions ({ type, rawOptions = {}, currentInject }) { proxy.propsUpdated() } - usePageStatus(proxy) + usePageContext(proxy) useEffect(() => { if (proxy.pendingUpdatedFlag) { @@ -386,7 +387,8 @@ export function getDefaultOptions ({ type, rawOptions = {}, currentInject }) { const { Provider } = global.__navigationHelper const pageConfig = Object.assign({}, global.__mpxPageConfig, currentInject.pageConfig) const Page = ({ navigation, route }) => { - setPageStatus(route.name, useIsFocused()) + usePageStatus(navigation, route) + useLayoutEffect(() => { navigation.setOptions({ headerTitle: pageConfig.navigationBarTitleText || '', From ba66a52a44334ddf421be56d458a07d87167e2d4 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Tue, 20 Aug 2024 16:40:35 +0800 Subject: [PATCH 11/18] [feat]support app onShow/onHide --- .../src/platform/api/app/index.android.js | 1 + .../src/platform/api/app/index.ios.js | 1 + .../src/platform/api/app/index.web.js | 9 ++--- packages/core/src/platform/createApp.ios.js | 36 +++++++++++++++++++ .../patch/react/getDefaultOptions.ios.js | 11 +++--- 5 files changed, 48 insertions(+), 10 deletions(-) create mode 100644 packages/api-proxy/src/platform/api/app/index.android.js create mode 100644 packages/api-proxy/src/platform/api/app/index.ios.js diff --git a/packages/api-proxy/src/platform/api/app/index.android.js b/packages/api-proxy/src/platform/api/app/index.android.js new file mode 100644 index 0000000000..cddf8e7080 --- /dev/null +++ b/packages/api-proxy/src/platform/api/app/index.android.js @@ -0,0 +1 @@ +export * from './index.web' diff --git a/packages/api-proxy/src/platform/api/app/index.ios.js b/packages/api-proxy/src/platform/api/app/index.ios.js new file mode 100644 index 0000000000..cddf8e7080 --- /dev/null +++ b/packages/api-proxy/src/platform/api/app/index.ios.js @@ -0,0 +1 @@ +export * from './index.web' diff --git a/packages/api-proxy/src/platform/api/app/index.web.js b/packages/api-proxy/src/platform/api/app/index.web.js index 096f8da3ba..2be7f32689 100644 --- a/packages/api-proxy/src/platform/api/app/index.web.js +++ b/packages/api-proxy/src/platform/api/app/index.web.js @@ -1,4 +1,5 @@ -import { isBrowser } from '../../../common/js' +import { isBrowser, isReact } from '@mpxjs/utils' + global.__mpxAppCbs = global.__mpxAppCbs || { show: [], hide: [], @@ -7,7 +8,7 @@ global.__mpxAppCbs = global.__mpxAppCbs || { } function onError (callback) { - if (isBrowser) { + if (isBrowser || isReact) { global.__mpxAppCbs.error.push(callback) } } @@ -19,7 +20,7 @@ function offError (callback) { } function onAppShow (callback) { - if (isBrowser) { + if (isBrowser || isReact) { global.__mpxAppCbs.show.push(callback) } } @@ -31,7 +32,7 @@ function offAppShow (callback) { } function onAppHide (callback) { - if (isBrowser) { + if (isBrowser || isReact) { global.__mpxAppCbs.hide.push(callback) } } diff --git a/packages/core/src/platform/createApp.ios.js b/packages/core/src/platform/createApp.ios.js index b1b7dc82f3..01273ba6a0 100644 --- a/packages/core/src/platform/createApp.ios.js +++ b/packages/core/src/platform/createApp.ios.js @@ -5,6 +5,8 @@ import { mergeLifecycle } from '../convertor/mergeLifecycle' import * as wxLifecycle from '../platform/patch/wx/lifecycle' import Mpx from '../index' import { createElement, memo, useRef, useEffect } from 'react' +import * as ReactNative from 'react-native' +import { ref } from '../observer/ref' const appHooksMap = makeMap(mergeLifecycle(wxLifecycle.LIFECYCLE).app) @@ -65,6 +67,13 @@ export default function createApp (option, config = {}) { } } + global.__mpxAppCbs = global.__mpxAppCbs || { + show: [], + hide: [], + error: [] + } + + global.__mpxAppFocusedState = ref('show') global.__mpxOptionsMap[currentInject.moduleId] = memo(() => { const instanceRef = useRef(null) if (!instanceRef.current) { @@ -82,6 +91,33 @@ export default function createApp (option, config = {}) { } global.__mpxEnterOptions = options defaultOptions.onLaunch && defaultOptions.onLaunch.call(instance, options) + if (defaultOptions.onShow) { + defaultOptions.onShow.call(instance, options) + global.__mpxAppCbs.show.push(defaultOptions.onShow.bind(instance)) + } + if (defaultOptions.onHide) { + global.__mpxAppCbs.hide.push(defaultOptions.onHide.bind(instance)) + } + if (defaultOptions.onError) { + global.__mpxAppCbs.error.push(defaultOptions.onError.bind(instance)) + } + + const changeSubscription = ReactNative.AppState.addEventListener('change', (currentState) => { + if (currentState === 'active') { + global.__mpxAppCbs.show.forEach((cb) => { + cb(options) + global.__mpxAppFocusedState.value = 'show' + }) + } else if (currentState === 'background') { + global.__mpxAppCbs.hide.forEach((cb) => { + cb() + global.__mpxAppFocusedState.value = 'hide' + }) + } + }) + return () => { + changeSubscription() + } }, []) return createElement(NavigationContainer, diff --git a/packages/core/src/platform/patch/react/getDefaultOptions.ios.js b/packages/core/src/platform/patch/react/getDefaultOptions.ios.js index d61bf8a403..1e81d81eb6 100644 --- a/packages/core/src/platform/patch/react/getDefaultOptions.ios.js +++ b/packages/core/src/platform/patch/react/getDefaultOptions.ios.js @@ -296,11 +296,10 @@ function usePageStatus (navigation, route) { setPageStatus(route.name, 'hide') isFocused = false }) - const changeSubscription = ReactNative.AppState.addEventListener('change', (currentState) => { - if (currentState === 'active') { - isFocused && setPageStatus(route.name, 'show') - } else if (currentState === 'background') { - isFocused && setPageStatus(route.name, 'hide') + + const appFocusedStateWatcher = watch(global.__mpxAppFocusedState, (value) => { + if (isFocused) { + setPageStatus(route.name, value) } }) @@ -321,7 +320,7 @@ function usePageStatus (navigation, route) { return () => { focusSubscription() blurSubscription() - changeSubscription && changeSubscription.remove() + appFocusedStateWatcher() resizeSubScription && resizeSubScription.remove() } }, [navigation]) From 829e00df39cc33f4a33b74b3044fa4fe022729c9 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Tue, 20 Aug 2024 20:54:49 +0800 Subject: [PATCH 12/18] [feat]optimize Dimensions change event --- packages/core/src/platform/createApp.ios.js | 14 +++++++++++++ .../patch/react/getDefaultOptions.ios.js | 21 +------------------ 2 files changed, 15 insertions(+), 20 deletions(-) diff --git a/packages/core/src/platform/createApp.ios.js b/packages/core/src/platform/createApp.ios.js index 01273ba6a0..8df76f1bba 100644 --- a/packages/core/src/platform/createApp.ios.js +++ b/packages/core/src/platform/createApp.ios.js @@ -10,6 +10,10 @@ import { ref } from '../observer/ref' const appHooksMap = makeMap(mergeLifecycle(wxLifecycle.LIFECYCLE).app) +function getOrientation (window = ReactNative.Dimensions.get('window')) { + return window.width > window.height ? 'landscape' : 'portrait' +} + function filterOptions (options, appData) { const newOptions = {} Object.keys(options).forEach(key => { @@ -115,8 +119,18 @@ export default function createApp (option, config = {}) { }) } }) + + let count = 0 + let lastOrientation = getOrientation() + const resizeSubScription = ReactNative.Dimensions.addEventListener('change', ({ window }) => { + const orientation = getOrientation(window) + if (orientation === lastOrientation) return + lastOrientation = orientation + global.__mpxAppFocusedState.value = `resize${count++}` + }) return () => { changeSubscription() + resizeSubScription && resizeSubScription.remove() } }, []) diff --git a/packages/core/src/platform/patch/react/getDefaultOptions.ios.js b/packages/core/src/platform/patch/react/getDefaultOptions.ios.js index 1e81d81eb6..49c577f88c 100644 --- a/packages/core/src/platform/patch/react/getDefaultOptions.ios.js +++ b/packages/core/src/platform/patch/react/getDefaultOptions.ios.js @@ -9,15 +9,11 @@ import { BEFOREUPDATE, ONLOAD, UPDATED, ONSHOW, ONHIDE, ONRESIZE } from '../../. import mergeOptions from '../../../core/mergeOptions' import { queueJob } from '../../../observer/scheduler' -function getOrientation (window = ReactNative.Dimensions.get('window')) { - return window.width > window.height ? 'landscape' : 'portrait' -} - function getSystemInfo () { const window = ReactNative.Dimensions.get('window') const screen = ReactNative.Dimensions.get('screen') return { - deviceOrientation: getOrientation(), + deviceOrientation: window.width > window.height ? 'landscape' : 'portrait', size: { screenWidth: screen.width, screenHeight: screen.height, @@ -303,25 +299,10 @@ function usePageStatus (navigation, route) { } }) - let count = 0 - let lastOrientation = getOrientation() - const resizeSubScription = ReactNative.Dimensions.addEventListener( - 'change', - ({ window }) => { - const orientation = getOrientation(window) - if (orientation === lastOrientation) return - lastOrientation = orientation - if (isFocused) { - setPageStatus(route.name, `resize${count++}`) - } - } - ) - return () => { focusSubscription() blurSubscription() appFocusedStateWatcher() - resizeSubScription && resizeSubScription.remove() } }, [navigation]) } From 6e2b70fef50d812d4210eb883364e4dd6ed349c5 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Thu, 22 Aug 2024 15:13:25 +0800 Subject: [PATCH 13/18] [update]hasHook & web resize --- packages/core/src/core/proxy.js | 16 +----- .../builtInMixins/pageStatusMixin.web.js | 23 ++++++-- .../patch/react/getDefaultOptions.ios.js | 53 +++++++++++++------ 3 files changed, 55 insertions(+), 37 deletions(-) diff --git a/packages/core/src/core/proxy.js b/packages/core/src/core/proxy.js index c6ab0c6772..d118968f4c 100644 --- a/packages/core/src/core/proxy.js +++ b/packages/core/src/core/proxy.js @@ -385,21 +385,7 @@ export default class MpxProxy { } hasHook (hookName) { - if (isString(hookName)) { - hookName = [hookName] - } - const type = this.options.__type__ - return hookName.some(h => { - if (this.options[h] || this.hooks[h]) { - return true - } - if (type === 'page') { - return isFunction(this.options.methods[h]) - } else if (type === 'component') { - return this.options.pageLifetimes && isFunction(this.options.pageLifetimes[h]) - } - return false - }) + return !!(this.options[hookName] || this.hooks[hookName]) } render () { diff --git a/packages/core/src/platform/builtInMixins/pageStatusMixin.web.js b/packages/core/src/platform/builtInMixins/pageStatusMixin.web.js index a52b8418e6..72bb03e239 100644 --- a/packages/core/src/platform/builtInMixins/pageStatusMixin.web.js +++ b/packages/core/src/platform/builtInMixins/pageStatusMixin.web.js @@ -20,7 +20,7 @@ function getCurrentPageInstance () { return pageInstance } -function onResize () { +function getSystemInfo () { // 设备屏幕状态 const deviceOrientation = window.screen.width > window.screen.height ? 'landscape' : 'portrait' @@ -35,11 +35,15 @@ function onResize () { } } + return systemInfo +} + +function onResize () { const _t = getCurrentPageInstance() if (_t) { _t.mpxPageStatus = `resize${count++}` - isFunction(_t.onResize) && _t.onResize(systemInfo) + isFunction(_t.onResize) && _t.onResize(getSystemInfo()) } } @@ -94,17 +98,26 @@ export default function pageStatusMixin (mixinType) { Object.assign(mixin, { [CREATED] () { if (isBrowser) { - const pageInstance = mixinType === 'page' ? this : this.$page + const isPage = mixinType === 'page' + const pageInstance = isPage ? this : this.$page if (pageInstance) { + const pageLifetimes = this.__mpxProxy.options.pageLifetimes + // wx 真机上页面/组件初次渲染就会触发 resize 事件 + if (isPage) { + isFunction(this.onResize) && this.onResize(getSystemInfo()) + } else { + if (pageLifetimes && isFunction(pageLifetimes.resize)) { + pageLifetimes.resize.call(this, getSystemInfo()) + } + } this.$watch(() => pageInstance.mpxPageStatus, status => { if (!status) return if (status === 'show') this.__mpxProxy.callHook(ONSHOW) if (status === 'hide') this.__mpxProxy.callHook(ONHIDE) - const pageLifetimes = this.__mpxProxy.options.pageLifetimes if (pageLifetimes) { if (/^resize/.test(status) && isFunction(pageLifetimes.resize)) { // resize - pageLifetimes.resize.call(this, systemInfo) + pageLifetimes.resize.call(this, getSystemInfo()) } else if (isFunction(pageLifetimes[status])) { // show & hide pageLifetimes[status].call(this) diff --git a/packages/core/src/platform/patch/react/getDefaultOptions.ios.js b/packages/core/src/platform/patch/react/getDefaultOptions.ios.js index 49c577f88c..6a8f0176e7 100644 --- a/packages/core/src/platform/patch/react/getDefaultOptions.ios.js +++ b/packages/core/src/platform/patch/react/getDefaultOptions.ios.js @@ -223,6 +223,22 @@ function createInstance ({ propsRef, type, rawOptions, currentInject, validProps return instance } +function hasPageHook (mpxProxy, hookNames) { + const options = mpxProxy.options + const type = options.__type__ + return hookNames.some(h => { + if (mpxProxy.hasHook(h)) { + return true + } + if (type === 'page') { + return isFunction(options.methods && options.methods[h]) + } else if (type === 'component') { + return options.pageLifetimes && isFunction(options.pageLifetimes[h]) + } + return false + }) +} + const routeContext = createContext(null) const triggerPageStatusHook = (mpxProxy, event) => { @@ -251,26 +267,28 @@ function usePageContext (mpxProxy) { const { routeName } = useContext(routeContext) || {} useEffect(() => { - let watcher - const hasShowHook = mpxProxy.hasHook([ONSHOW, 'show']) - const hasHideHook = mpxProxy.hasHook([ONHIDE, 'hide']) - const hasResizeHook = mpxProxy.hasHook([ONRESIZE, 'resize', 'onResize']) + let unWatch + const hasShowHook = hasPageHook(mpxProxy, [ONSHOW, 'show']) + const hasHideHook = hasPageHook(mpxProxy, [ONHIDE, 'hide']) + const hasResizeHook = hasPageHook(mpxProxy, [ONRESIZE, 'resize', 'onResize']) if (hasShowHook || hasHideHook || hasResizeHook) { - // wx 真机上 resize 初次就会触发 - if (hasResizeHook) { - triggerResizeEvent(mpxProxy) - } - watcher = watch(() => pageStatusContext[routeName], (newVal) => { - if (newVal === 'show' || newVal === 'hide') { - triggerPageStatusHook(mpxProxy, newVal) - } else if (/^resize/.test(newVal)) { + if (hasOwn(pageStatusContext, routeName)) { + // wx 真机上 resize 初次就会触发 + if (hasResizeHook) { triggerResizeEvent(mpxProxy) } - }, { immediate: true }) + unWatch = watch(() => pageStatusContext[routeName], (newVal) => { + if (newVal === 'show' || newVal === 'hide') { + triggerPageStatusHook(mpxProxy, newVal) + } else if (/^resize/.test(newVal)) { + triggerResizeEvent(mpxProxy) + } + }) + } } return () => { - watcher && watcher() + unWatch && unWatch() } }, []) } @@ -282,8 +300,9 @@ function setPageStatus (routeName, val) { function usePageStatus (navigation, route) { let isFocused = true - setPageStatus(route.name, 'show') + setPageStatus(route.name, '') useEffect(() => { + setPageStatus(route.name, 'show') const focusSubscription = navigation.addListener('focus', () => { setPageStatus(route.name, 'show') isFocused = true @@ -293,7 +312,7 @@ function usePageStatus (navigation, route) { isFocused = false }) - const appFocusedStateWatcher = watch(global.__mpxAppFocusedState, (value) => { + const unWatchAppFocusedState = watch(global.__mpxAppFocusedState, (value) => { if (isFocused) { setPageStatus(route.name, value) } @@ -302,7 +321,7 @@ function usePageStatus (navigation, route) { return () => { focusSubscription() blurSubscription() - appFocusedStateWatcher() + unWatchAppFocusedState() } }, [navigation]) } From 4c693576bf95395341b0f2f3de2ba8f0952739bb Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Thu, 22 Aug 2024 18:37:12 +0800 Subject: [PATCH 14/18] [optimize]resize event --- .../builtInMixins/pageStatusMixin.web.js | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/packages/core/src/platform/builtInMixins/pageStatusMixin.web.js b/packages/core/src/platform/builtInMixins/pageStatusMixin.web.js index 72bb03e239..99d5ed4e13 100644 --- a/packages/core/src/platform/builtInMixins/pageStatusMixin.web.js +++ b/packages/core/src/platform/builtInMixins/pageStatusMixin.web.js @@ -82,6 +82,10 @@ export default function pageStatusMixin (mixinType) { // onLoad应该在用户声明周期CREATED后再执行,故此处使用原生created声明周期来触发onLoad const query = this.$root.$options?.router?.currentRoute?.query || {} this.__mpxProxy.callHook(ONLOAD, [query]) + }, + mounted () { + this.mpxPageStatus = `resize${count++}` + isFunction(this.onResize) && this.onResize(getSystemInfo()) } }) } @@ -98,22 +102,13 @@ export default function pageStatusMixin (mixinType) { Object.assign(mixin, { [CREATED] () { if (isBrowser) { - const isPage = mixinType === 'page' - const pageInstance = isPage ? this : this.$page + const pageInstance = mixinType === 'page' ? this : this.$page if (pageInstance) { - const pageLifetimes = this.__mpxProxy.options.pageLifetimes - // wx 真机上页面/组件初次渲染就会触发 resize 事件 - if (isPage) { - isFunction(this.onResize) && this.onResize(getSystemInfo()) - } else { - if (pageLifetimes && isFunction(pageLifetimes.resize)) { - pageLifetimes.resize.call(this, getSystemInfo()) - } - } this.$watch(() => pageInstance.mpxPageStatus, status => { if (!status) return if (status === 'show') this.__mpxProxy.callHook(ONSHOW) if (status === 'hide') this.__mpxProxy.callHook(ONHIDE) + const pageLifetimes = this.__mpxProxy.options.pageLifetimes if (pageLifetimes) { if (/^resize/.test(status) && isFunction(pageLifetimes.resize)) { // resize From 5d0bcbfff9f544bc1ed1a83055cdbd717f06d5cf Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Fri, 23 Aug 2024 15:27:00 +0800 Subject: [PATCH 15/18] [optimize]remove resize event when the component first render --- .../core/src/platform/builtInMixins/pageStatusMixin.web.js | 1 - .../core/src/platform/patch/react/getDefaultOptions.ios.js | 6 +----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/packages/core/src/platform/builtInMixins/pageStatusMixin.web.js b/packages/core/src/platform/builtInMixins/pageStatusMixin.web.js index 99d5ed4e13..8e9d0e41a6 100644 --- a/packages/core/src/platform/builtInMixins/pageStatusMixin.web.js +++ b/packages/core/src/platform/builtInMixins/pageStatusMixin.web.js @@ -85,7 +85,6 @@ export default function pageStatusMixin (mixinType) { }, mounted () { this.mpxPageStatus = `resize${count++}` - isFunction(this.onResize) && this.onResize(getSystemInfo()) } }) } diff --git a/packages/core/src/platform/patch/react/getDefaultOptions.ios.js b/packages/core/src/platform/patch/react/getDefaultOptions.ios.js index 6a8f0176e7..beece5acdc 100644 --- a/packages/core/src/platform/patch/react/getDefaultOptions.ios.js +++ b/packages/core/src/platform/patch/react/getDefaultOptions.ios.js @@ -270,13 +270,9 @@ function usePageContext (mpxProxy) { let unWatch const hasShowHook = hasPageHook(mpxProxy, [ONSHOW, 'show']) const hasHideHook = hasPageHook(mpxProxy, [ONHIDE, 'hide']) - const hasResizeHook = hasPageHook(mpxProxy, [ONRESIZE, 'resize', 'onResize']) + const hasResizeHook = hasPageHook(mpxProxy, [ONRESIZE, 'resize']) if (hasShowHook || hasHideHook || hasResizeHook) { if (hasOwn(pageStatusContext, routeName)) { - // wx 真机上 resize 初次就会触发 - if (hasResizeHook) { - triggerResizeEvent(mpxProxy) - } unWatch = watch(() => pageStatusContext[routeName], (newVal) => { if (newVal === 'show' || newVal === 'hide') { triggerPageStatusHook(mpxProxy, newVal) From a941259270ded80a20af2bfc6d998f897203d155 Mon Sep 17 00:00:00 2001 From: xiaolei <1017653702@qq.com> Date: Fri, 23 Aug 2024 17:05:52 +0800 Subject: [PATCH 16/18] [revert]web resize event --- .../core/src/platform/builtInMixins/pageStatusMixin.web.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/core/src/platform/builtInMixins/pageStatusMixin.web.js b/packages/core/src/platform/builtInMixins/pageStatusMixin.web.js index 1128cc57d6..18a0c395ad 100644 --- a/packages/core/src/platform/builtInMixins/pageStatusMixin.web.js +++ b/packages/core/src/platform/builtInMixins/pageStatusMixin.web.js @@ -79,9 +79,6 @@ export default function pageStatusMixin (mixinType) { // onLoad应该在用户声明周期CREATED后再执行,故此处使用原生created声明周期来触发onLoad const query = this.$root.$options?.router?.currentRoute?.query || {} this.__mpxProxy.callHook(ONLOAD, [query]) - }, - mounted () { - this.mpxPageStatus = `resize${count++}` } }) } From 911812d06244e4dbdf54d8340f6561006328c942 Mon Sep 17 00:00:00 2001 From: yandadaFreedom <525966780@qq.com> Date: Mon, 26 Aug 2024 15:21:06 +0800 Subject: [PATCH 17/18] =?UTF-8?q?fix:=20rn=20trigger=20event=20=E6=97=A0?= =?UTF-8?q?=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/src/platform/patch/react/getDefaultOptions.ios.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/core/src/platform/patch/react/getDefaultOptions.ios.js b/packages/core/src/platform/patch/react/getDefaultOptions.ios.js index 6bd98ade3c..727a0d685b 100644 --- a/packages/core/src/platform/patch/react/getDefaultOptions.ios.js +++ b/packages/core/src/platform/patch/react/getDefaultOptions.ios.js @@ -120,8 +120,7 @@ function createInstance ({ propsRef, type, rawOptions, currentInject, validProps }, triggerEvent (eventName, eventDetail) { const props = propsRef.current - const handlerName = eventName.replace(/^./, matched => matched.toUpperCase()).replace(/-([a-z])/g, (match, p1) => p1.toUpperCase()) - const handler = props && (props['bind' + handlerName] || props['catch' + handlerName] || props['capture-bind' + handlerName] || props['capture-catch' + handlerName]) + const handler = props && (props['bind' + eventName] || props['catch' + eventName] || props['capture-bind' + eventName] || props['capture-catch' + eventName]) if (handler && typeof handler === 'function') { const timeStamp = +new Date() const dataset = collectDataset(props) From 3810c610b5700a1f66e9ca43b3926fcbcfe9d100 Mon Sep 17 00:00:00 2001 From: wangxiaokou Date: Mon, 26 Aug 2024 15:39:44 +0800 Subject: [PATCH 18/18] =?UTF-8?q?=E4=B8=8B=E6=8E=89expo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../screen-brightness/rnScreenBrightness.js | 69 +++++++++++-------- 1 file changed, 42 insertions(+), 27 deletions(-) diff --git a/packages/api-proxy/src/platform/api/screen-brightness/rnScreenBrightness.js b/packages/api-proxy/src/platform/api/screen-brightness/rnScreenBrightness.js index 907245018a..f9bea8bc10 100644 --- a/packages/api-proxy/src/platform/api/screen-brightness/rnScreenBrightness.js +++ b/packages/api-proxy/src/platform/api/screen-brightness/rnScreenBrightness.js @@ -1,35 +1,50 @@ -import * as Brightness from 'expo-brightness' +// import * as Brightness from 'expo-brightness' import { successHandle, failHandle } from '../../../common/js' +// +// function getScreenBrightness (options) { +// const { success, fail, complete } = options +// Brightness.getBrightnessAsync().then(value => { +// const result = { +// errMsg: 'getScreenBrightness:ok', +// value +// } +// successHandle(result, success, complete) +// }).catch(() => { +// const result = { +// errMsg: 'getScreenBrightness:fail' +// } +// failHandle(result, fail, complete) +// }) +// } +// +// function setScreenBrightness (options) { +// const { value, success, fail, complete } = options +// Brightness.setBrightnessAsync(value).then(() => { +// const result = { +// errMsg: 'setScreenBrightness:ok' +// } +// successHandle(result, success, complete) +// }).catch(() => { +// const result = { +// errMsg: 'setScreenBrightness:fail' +// } +// failHandle(result, fail, complete) +// }) +// } function getScreenBrightness (options) { - const { success, fail, complete } = options - Brightness.getBrightnessAsync().then(value => { - const result = { - errMsg: 'getScreenBrightness:ok', - value - } - successHandle(result, success, complete) - }).catch(() => { - const result = { - errMsg: 'getScreenBrightness:fail' - } - failHandle(result, fail, complete) - }) + const { success, complete } = options + const result = { + errMsg: 'getScreenBrightness:ok' + } + successHandle(result, success, complete) } - function setScreenBrightness (options) { - const { value, success, fail, complete } = options - Brightness.setBrightnessAsync(value).then(() => { - const result = { - errMsg: 'setScreenBrightness:ok' - } - successHandle(result, success, complete) - }).catch(() => { - const result = { - errMsg: 'setScreenBrightness:fail' - } - failHandle(result, fail, complete) - }) + const { fail, complete } = options + const result = { + errMsg: 'setScreenBrightness:fail' + } + failHandle(result, fail, complete) } export {