| | |
| | | */ |
| | | |
| | | import Taro, { getCurrentInstance, getCurrentPages } from '@tarojs/taro'; |
| | | import { Fetcher } from './Fetcher'; |
| | | import { Tools } from '@components/common/Tools'; |
| | | import { $hostBoot } from '@components/bases/HostBoot'; |
| | | import project from '@project'; |
| | | |
| | | export class Pilot { |
| | | |
| | | constructor() { |
| | | } |
| | | constructor() {} |
| | | |
| | | $data() { |
| | | return {}; |
| | |
| | | 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 也忽略 |
| | |
| | | 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); |
| | |
| | | // 创建页面通讯器 |
| | | static createPoster($vm) { |
| | | return (pageType, action, data) => { |
| | | // 解除引用关系 |
| | | // 解除原引用关系、移除非数据内容 |
| | | const nextData = JSON.parse(JSON.stringify(data || {})); |
| | | // 下一页 |
| | | // 传递消息到下一页 |
| | | if (pageType === 'nextPage') { |
| | | // 持续 3 秒,检测下一页是否存在 |
| | | // 持续 3 秒,检测下一页是否存在,如果 3 秒内未创建下一页,忽略 |
| | | let count = 0; |
| | | const timer = setInterval(() => { |
| | | if (++count > 60) { |
| | |
| | | const nextPage = currentPages[pageIndex + 1]; |
| | | if (nextPage) { |
| | | clearInterval(timer); |
| | | nextPage.$component.$onMessage(action, nextData); |
| | | setTimeout(() => { |
| | | nextPage.$component?.$onMessage(action, nextData); |
| | | }, 0); |
| | | } |
| | | }, 50); |
| | | } else if (pageType === 'prevPage') { |
| | | } |
| | | // 传递消息到上一页,上一页的上一页,依次直到首页 |
| | | else if (pageType === 'prevPage') { |
| | | const currentPages = getCurrentPages(); |
| | | let pageIndex = currentPages.findIndex(page => page.$component === $vm); |
| | | while (pageIndex - 1 >= 0) { |
| | | const prevPage = currentPages[pageIndex - 1]; |
| | | if (prevPage) { |
| | | prevPage.$component?.$onMessage(action, nextData); |
| | | } |
| | | pageIndex--; |
| | | } |
| | | } |
| | | // 传递消息到原地新页(redirectTo原地新开页面) |
| | | else if (pageType === 'sitePage') { |
| | | 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); |
| | | const pagePath = currentPages[pageIndex].$taroPath |
| | | // 持续 3 秒,检查当前页是否新开,如果 3 秒内没有新开,忽略 |
| | | let count = 0; |
| | | const timer = setInterval(() => { |
| | | if (++count > 60) { |
| | | clearInterval(timer); |
| | | } |
| | | const currentPages = getCurrentPages(); |
| | | const sitePage = currentPages[pageIndex]; |
| | | if (sitePage.$component !== $vm || sitePage.$taroPath !== pagePath) { |
| | | clearInterval(timer); |
| | | setTimeout(() => { |
| | | sitePage.$component?.$onMessage(action, nextData); |
| | | }, 0); |
| | | } |
| | | }, 50); |
| | | } |
| | | }; |
| | | } |
| | |
| | | } |
| | | // 小程序 |
| | | 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; |
| | | } |
| | | |
| | | } |
| | | } |