/** * BridgeCenterBase - 跨端通讯,通知接收基类 * @author Tevin */ import Taro from '@tarojs/taro'; import { $bridge } from '@components/common/Bridge'; import { Fetcher } from '@components/bases/Fetcher'; export class BridgeCenterBase { constructor(tellings) { this._init(tellings); } _init(tellings) { tellings.forEach(method => { const name = Fetcher.prototype.stringToCamel(method); if (typeof this[name] === 'undefined') { console.warn('BridgeTelling:未发现“' + method + '”对应接收器!'); } else { // 注册App通知接收器 $bridge.register(method, (res, callback) => { this[name](method, res, callback); }); } }); } /** * 获取当前页面 * @return {Taro.Page} */ $getCurrentPage() { const pages = Taro.getCurrentPages(); return pages[pages.length - 1]; } /** * 获取当前页面路径 * @return {String} */ $getCurrentPagePath() { return this.$getCurrentPage().path.split('?')[0]; } /** * 判断地址是否为当前页面 * @param {String} url * @return {Taro.Page|null} */ $isCurrentPage(url) { const pages = Taro.getCurrentPages(); const curPage = pages[pages.length - 1]; if (curPage.path.split('?')[0] === url.split('?')[0]) { return curPage; } else { return null; } } /** * 判断当前页面是否在列表中 * @param {Array} allows=[] * @return {boolean} */ $isCurPageInside(allows = []) { const url = this.$getCurrentPagePath(); return allows.indexOf(url) >= 0; } _checkPage(url, callback) { let curPage = this.$isCurrentPage(url); if (curPage) { callback(curPage); } else { setTimeout(() => { this._checkPage(url, callback); }, 100); } } /** * 打开指定页面 * @param {String} url * @param {Function} callback */ $openPage(url, callback) { const curPage = this.$isCurrentPage(url); // 需打开的是当前页面 if (curPage) { callback(curPage); } else { Taro.navigateTo({ url, success: () => { this._checkPage(url, callback); }, }); } } /** * 当前页下发通讯 * @param {String} method * @param {Object} res * @param {Function} [callback] */ $curPageBridge(method, res, callback) { this.$pageBridge(this.$getCurrentPage(), method, res, callback); } /** * 对某个页面下发通知 * @param {Taro.Page} page * @param {String} method * @param {Object} res * @param {Function} [callback] */ $pageBridge(page, method, res, callback) { if (!page.$component || !page.$component.$onBridge) { return; } try { res = typeof res === 'string' ? JSON.parse(res) : res; } catch (e) { } page.$component.$onBridge(method, res, callback); } }