From 32d2e292be458cdbb25ca2ab9db42a04da30a496 Mon Sep 17 00:00:00 2001
From: Tevin <tingquanren@163.com>
Date: Tue, 18 Mar 2025 10:25:32 +0800
Subject: [PATCH] 知识库规则文档调整

---
 bases/Pilot.js |   85 ++++++++++++++++++++++++++++++++----------
 1 files changed, 65 insertions(+), 20 deletions(-)

diff --git a/bases/Pilot.js b/bases/Pilot.js
index d7d3966..6dcacf0 100644
--- a/bases/Pilot.js
+++ b/bases/Pilot.js
@@ -3,9 +3,8 @@
  * @author Tevin
  */
 
-import Taro, { getCurrentInstance } from '@tarojs/taro';
-import { Fetcher } from './Fetcher';
-import { Tools } from '@components/common/Tools';
+import Taro, { getCurrentInstance, getCurrentPages } from '@tarojs/taro';
+import { $hostBoot } from '@components/bases/HostBoot';
 import project from '@project';
 
 export class Pilot {
@@ -22,10 +21,15 @@
             methods: {},
         };
         const names = [];
+        let parent = null;
         // 实例本身的字段
         Object.getOwnPropertyNames(this).forEach(name => names.push(name));
-        // 类的字段
-        Object.getOwnPropertyNames(Object.getPrototypeOf(this)).forEach(name => names.push(name));
+        // 基类的字段,直到Pilot为止(不含Pilot)
+        parent = Object.getPrototypeOf(this);
+        while (parent instanceof Pilot) {
+            Object.getOwnPropertyNames(parent).forEach(name => names.push(name));
+            parent = Object.getPrototypeOf(parent);
+        }
         // 传递
         names.forEach(name => {
             // 构造器忽略,如果存在属性 $methods 也忽略
@@ -58,30 +62,71 @@
     }
 
     _bindTaroPage(options) {
-        // 非App内嵌模式,不执行
-        if (!project.appHybrid) {
-            return;
-        }
         // 绑定页面实例到Page
-        const { onLoad, onUnload, onBridge } = options;
+        const { created, beforeDestroy, onMessage, onBridge } = options;
         const option2 = {
-            onLoad() {
+            created() {
                 const instance = getCurrentInstance();
                 instance.page.$component = this;
-                onLoad && onLoad.call(this);
-                // 绑定 onBridge 到页面实例
-                this.$onBridge = onBridge || (() => {
-                });
+                // 绑定方法到页面实例
+                this.$poster = Pilot.createPoster(this);
+                this.$onMessage = onMessage || (() => null);
+                this.$onBridge = onBridge || (() => null);
+                // 实际生命周期回调
+                created && created.call(this);
             },
-            onUnload() {
+            beforeDestroy() {
                 const instance = getCurrentInstance();
                 delete instance.page.$component;
-                onUnload && onUnload.call(this);
+                // 实际生命周期回调
+                beforeDestroy && beforeDestroy.call(this);
+                // 取消绑定
+                this.$onMessage = null;
+                this.$poster = null;
+                this.$onBridge = null;
             },
         };
-        options.onLoad = option2.onLoad;
-        options.onUnload = option2.onUnload;
+        options.created = option2.created;
+        options.beforeDestroy = option2.beforeDestroy;
+        delete options.onMessage;
+        delete options.poster;
         delete options.onBridge;
+    }
+
+    // 创建页面通讯器
+    static createPoster($vm) {
+        return (pageType, action, data) => {
+            // 解除引用关系
+            const nextData = JSON.parse(JSON.stringify(data || {}));
+            // 下一页
+            if (pageType === 'nextPage') {
+                // 持续 3 秒,检测下一页是否存在
+                let count = 0;
+                const timer = setInterval(() => {
+                    if (++count > 60) {
+                        clearInterval(timer);
+                    }
+                    const currentPages = getCurrentPages();
+                    const pageIndex = currentPages.findIndex(page => page.$component === $vm);
+                    const nextPage = currentPages[pageIndex + 1];
+                    if (nextPage) {
+                        clearInterval(timer);
+                        nextPage.$component?.$onMessage(action, nextData);
+                    }
+                }, 50);
+            } else if (pageType === 'prevPage') {
+                const currentPages = getCurrentPages();
+                const pageIndex = currentPages.findIndex(page => page.$component === $vm);
+                const prevPage = currentPages[pageIndex - 1];
+                if (prevPage) {
+                    prevPage.$component?.$onMessage(action, nextData);
+                }
+            } else if (pageType === 'rootPage') {
+                const currentPages = getCurrentPages();
+                const rootPage = currentPages[0];
+                rootPage.$component?.$onMessage(action, nextData);
+            }
+        };
     }
 
     /**
@@ -104,7 +149,7 @@
             }
             // 小程序
             else if (process.env.TARO_ENV === 'weapp') {
-                assets2[key] = Fetcher.host + project.host.assetsPath + asset;
+                assets2[key] = $hostBoot.getHost() + project.host.assetsPath + asset;
             }
         });
         return assets2;

--
Gitblit v1.9.1