From f9398ce73a1bccff71218117ae963ea2ecd6809b Mon Sep 17 00:00:00 2001
From: Tevin <tingquanren@163.com>
Date: Thu, 24 Mar 2022 12:16:04 +0800
Subject: [PATCH] 优化跨页面数据传递

---
 bases/Pilot.js |   83 +++++++++++++++++++++++++++++++++++++++--
 1 files changed, 79 insertions(+), 4 deletions(-)

diff --git a/bases/Pilot.js b/bases/Pilot.js
index 3499be7..32f2394 100644
--- a/bases/Pilot.js
+++ b/bases/Pilot.js
@@ -3,6 +3,7 @@
  * @author Tevin
  */
 
+import Taro, { getCurrentInstance, getCurrentPages } from '@tarojs/taro';
 import { Fetcher } from './Fetcher';
 import { Tools } from '@components/common/Tools';
 import project from '@project';
@@ -35,11 +36,11 @@
                 if (name === '$data' && typeof dataAdd !== 'undefined') {
                     // 转换 dataAdd 中 assets 属性下的图片地址值
                     if (typeof dataAdd.assets !== 'undefined') {
-                        dataAdd.assets = this._transDataAdd(dataAdd.assets);
+                        dataAdd.assets = Pilot.transAssets(dataAdd.assets);
                     }
-                    // 当有传data值进来,初始值必须带data中的字段
-                    const dataOrig = this.$data();
                     options.data = () => {
+                        // 当有传data值进来,初始值必须带data中的字段
+                        const dataOrig = this.$data();
                         return {
                             ...dataOrig,
                             ...dataAdd,
@@ -52,10 +53,84 @@
                 options.methods[name] = this[name];
             }
         });
+        this._bindTaroPage(options);
         return options;
     }
 
-    _transDataAdd(assets = {}) {
+    _bindTaroPage(options) {
+        // 绑定页面实例到Page
+        const { created, beforeDestroy, onMessage, onBridge } = options;
+        const option2 = {
+            created() {
+                const instance = getCurrentInstance();
+                instance.page.$component = this;
+                // 绑定方法到页面实例
+                this.$poster = Pilot.createPoster(this);
+                this.$onMessage = onMessage || (() => null);
+                this.$onBridge = onBridge || (() => null);
+                // 实际生命周期回调
+                created && created.call(this);
+            },
+            beforeDestroy() {
+                const instance = getCurrentInstance();
+                delete instance.page.$component;
+                // 实际生命周期回调
+                beforeDestroy && beforeDestroy.call(this);
+                // 取消绑定
+                this.$onMessage = null;
+                this.$poster = null;
+                this.$onBridge = null;
+            },
+        };
+        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);
+            }
+        };
+    }
+
+    /**
+     * 转换静态图片引用
+     * @param assets
+     * @return {{}}
+     */
+    static transAssets(assets = {}) {
         const assets2 = {};
         Object.keys(assets).forEach(key => {
             let asset = '';

--
Gitblit v1.9.1