|
|
@@ -1,5 +1,5 @@
|
|
|
import { Transfer } from "@/types";
|
|
|
-import { onLoad } from "@dcloudio/uni-app";
|
|
|
+import { onLoad, onUnload } from "@dcloudio/uni-app";
|
|
|
import { routes } from "@/common/routes";
|
|
|
export const useTransferPage = <T1 = any, T2 = any>() => {
|
|
|
const funcMap = {
|
|
|
@@ -12,6 +12,7 @@ export const useTransferPage = <T1 = any, T2 = any>() => {
|
|
|
let prevData = ref<T1>({} as T1);
|
|
|
let transferResolver: ((value: unknown) => void) | null = null;
|
|
|
let eventChannel: UniApp.EventChannel | null = null;
|
|
|
+ const eventId = ref<string | null>(null);
|
|
|
// onMounted(() => {
|
|
|
// 使用instance获取getOpenerEventChannel在非页面级组件中会报错
|
|
|
// const instance = getCurrentInstance().proxy
|
|
|
@@ -24,13 +25,18 @@ export const useTransferPage = <T1 = any, T2 = any>() => {
|
|
|
data?: T2 | null,
|
|
|
type?: Transfer.TransferType,
|
|
|
bigData?: Record<string, any> | null,
|
|
|
- callback?: Callback
|
|
|
+ callback?: Callback,
|
|
|
+ crossTrigger?: boolean // 当出现A navTo C redirectTo B又需要把参数回传给 A 时,可设置此参数为 true 实现跨页面传递
|
|
|
}
|
|
|
|
|
|
- onLoad((opt) => {
|
|
|
+ const getEventChannel = () => {
|
|
|
const pages = getCurrentPages();
|
|
|
const page = pages[pages.length - 1];
|
|
|
- eventChannel = (page as any).getOpenerEventChannel();
|
|
|
+ return (page as any).getOpenerEventChannel();
|
|
|
+ }
|
|
|
+
|
|
|
+ onLoad((opt) => {
|
|
|
+ eventChannel = getEventChannel();
|
|
|
emit('onPageOpen');
|
|
|
for (const key in opt) {
|
|
|
if (opt.hasOwnProperty(key) && !['data', 'storageKey'].includes(key)) {
|
|
|
@@ -52,7 +58,9 @@ export const useTransferPage = <T1 = any, T2 = any>() => {
|
|
|
Object.assign(prevData.value, storageData);
|
|
|
}
|
|
|
});
|
|
|
-
|
|
|
+ onUnload(() => {
|
|
|
+ eventId.value = null;
|
|
|
+ });
|
|
|
function getTransferUrl(url: string, data: any, bigData: any) {
|
|
|
const urlParams = {
|
|
|
data: data ? encodeURIComponent(JSON.stringify(data)) : null,
|
|
|
@@ -89,7 +97,7 @@ export const useTransferPage = <T1 = any, T2 = any>() => {
|
|
|
return queryString ? `${baseUrl}?${queryString}` : baseUrl;
|
|
|
}
|
|
|
|
|
|
- function transferTo(url: string, { data = null, type = 'navigateTo', bigData = null, callback = null }: TransferOptions = {}) {
|
|
|
+ function transferTo(url: string, { data = null, type = 'navigateTo', bigData = null, callback = null, crossTrigger = false }: TransferOptions = {}) {
|
|
|
return new Promise((resolve, reject) => {
|
|
|
transferResolver = resolve;
|
|
|
if (bigData) {
|
|
|
@@ -98,9 +106,16 @@ export const useTransferPage = <T1 = any, T2 = any>() => {
|
|
|
// clear big data by force
|
|
|
uni.removeStorageSync('transferBigData');
|
|
|
}
|
|
|
- const nextUrl = getTransferUrl(url, data, bigData);
|
|
|
+ let nextUrl = getTransferUrl(url, data, bigData);
|
|
|
// 单独处理,函数签名不一样
|
|
|
if (type === 'navigateTo') {
|
|
|
+ if (crossTrigger) {
|
|
|
+ eventId.value = Date.now().toString();
|
|
|
+ uni.$once(`${eventId.value}_TransferEnd`, (data: any) => {
|
|
|
+ transferResolver?.(data);
|
|
|
+ });
|
|
|
+ nextUrl += `&crossPageEventId=${eventId.value}`;
|
|
|
+ }
|
|
|
uni.navigateTo({
|
|
|
url: nextUrl,
|
|
|
events: {
|
|
|
@@ -113,12 +128,16 @@ export const useTransferPage = <T1 = any, T2 = any>() => {
|
|
|
}
|
|
|
}
|
|
|
},
|
|
|
- fail: (err) => {
|
|
|
+ fail: (err) => {
|
|
|
+ eventId.value = null;
|
|
|
console.log('transferTo fail', err);
|
|
|
}
|
|
|
});
|
|
|
} else {
|
|
|
const routeFunc = funcMap[type as keyof typeof funcMap];
|
|
|
+ if (prevData.value.crossPageEventId) {
|
|
|
+ nextUrl += `&crossPageEventId=${prevData.value.crossPageEventId}`;
|
|
|
+ }
|
|
|
routeFunc({
|
|
|
url: nextUrl,
|
|
|
fail: (err) => {
|
|
|
@@ -131,8 +150,11 @@ export const useTransferPage = <T1 = any, T2 = any>() => {
|
|
|
|
|
|
});
|
|
|
}
|
|
|
- function transferBack(data:any = null, delta = 1) {
|
|
|
+ function transferBack(data: any = null, delta = 1) {
|
|
|
emit('transferEnd', data);
|
|
|
+ if (prevData.value.crossPageEventId) {
|
|
|
+ uni.$emit(`${prevData.value.crossPageEventId}_TransferEnd`, data);
|
|
|
+ }
|
|
|
// force clear big data
|
|
|
uni.removeStorageSync('transferBigData');
|
|
|
const pages = getCurrentPages();
|
|
|
@@ -169,6 +191,7 @@ export const useTransferPage = <T1 = any, T2 = any>() => {
|
|
|
prevData,
|
|
|
transferTo,
|
|
|
transferBack,
|
|
|
- routes
|
|
|
+ routes,
|
|
|
+ eventChannel
|
|
|
}
|
|
|
};
|