Sfoglia il codice sorgente

增加transferPage跨页面传递参数机制

shmily1213 1 mese fa
parent
commit
44b7806496

+ 33 - 10
src/hooks/useTransferPage.ts

@@ -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
   }
 };

+ 1 - 1
src/pagesMain/pages/volunteer/volunteer.vue

@@ -19,7 +19,7 @@
     <volunteer-menu />
     <ie-gap />
     <volunteer-policy />
-    <volunteer-tier v-if="userStore.isHN" />
+    <volunteer-tier v-if="userStore.isLogin && userStore.isHN" />
     <template #tabbar>
       <ie-tabbar :active="1" />
     </template>

+ 1 - 1
src/pagesOther/pages/skill/index/index.vue

@@ -62,7 +62,7 @@ const handleSelect = async () => {
         selectedMajorId: target.value?.majorId,
         useRedirect: true
     }
-    const picked = await transferTo(routes.universityPicker, {data: option})
+    const picked = await transferTo(routes.universityPicker, {data: option, crossTrigger: true})
     if (!picked) return
     target.value = picked as SelectedUniversityMajor
     uni.$ie.showLoading()

+ 2 - 1
src/pagesStudy/pages/targeted-add/targeted-add.vue

@@ -188,8 +188,9 @@ const handleAdd = async () => {
             prevData.value.selectedMajorId === form.value.majorId) {
             return uni.$ie.showToast('请勿选择相同院校专业')
         }
-        // TODO: 如果该页面是从 routes.universityPicker 通过 redirectTo 跳转,则前页面接收不到eventChannel的回传事件
+        // 如果该页面是从 routes.universityPicker 通过 redirectTo 跳转,则前页面接收不到eventChannel的回传事件
         // wx日志:上级页面丢失,无法触发transferEnd
+        // 已通过 transferPage hooks 内部解决
         return transferBack(form.value)
     }
     // 检查数据是否已存在