// #ifdef H5 import { DOM } from '../component/h5-dom'; import init from '../vueRouter/init'; // #endif import { warn } from '../helpers/warn'; class Patch { constructor(H5) { this.H5 = H5; this.isLoading = true; this.loadingCount = 0; // 在APP.vue中进行跳转时,DOMContentLoaded过慢。使用索引来判断 } on(fun, args, callback) { if (this.H5) { return this[fun](args); } if (callback) { callback(); } } /** *把vueRouter的生命周期代理过来 * @param {Object} Router * @param {Object} vueRouter * @param {VueComponent} vueVim */ // eslint-disable-next-line registerHook(Router, vueRouter, vueVim) { init(Router, vueRouter, vueVim); } /** * H5 专属 history.back API * @param {Number} backLayer 需要返回的层级必须是正整数 * 2020年1月14日14:39:38 修复 https://github.com/SilurianYang/uni-simple-router/issues/73 */ // eslint-disable-next-line historyBack({ backLayer, delta = { from: 'navigateBack' } } = {}) { const pages = getCurrentPages(); const page = pages[pages.length - 1]; const { onBackPress } = page.$options; if (onBackPress != null && onBackPress.constructor === Array) { const callFun = onBackPress[onBackPress.length - 1]; const isNext = callFun.call(page, delta); if (isNext) { return true; } } // eslint-disable-next-line history.go(-backLayer); } /** * 把加载动画添加到dom下面,为什么一定要先添加,后移除。保证动画的连续性 */ appendHTML({ style, html, script, }) { window.addEventListener('DOMContentLoaded', () => { const body = document.querySelector('body'); body.appendChild(style); body.appendChild(html); body.appendChild(script); this.toogle('startLodding', true); }); } /** * 页面是否加载完毕触发对应事件 */ toogle(toogle, DOMContentLoaded = false) { if (DOMContentLoaded && this.loadingCount !== 0) { this.loadingCount += 1; return false; } try { this.loadingCount += 1; if (this.isLoading) { window[toogle](); } } catch (error) { warn('你使用了 addRoutes API 提前进行了生命周期 并触发了startLodding'); } } async setLoadingStatus({ loading, replaceStyle, resetStyle, }) { this.isLoading = loading; if (loading) { // 确认需要加载样式 开始插入节点 const userStyle = resetStyle(); const userStyleKeys = Object.keys(userStyle); for (let i = 0; i < userStyleKeys.length; i += 1) { const key = userStyleKeys[i]; let html = userStyle[key]; if (key === 'style' && !replaceStyle) { // 开发者设置为追加style html = DOM[key].innerHTML + html; } DOM[key].innerHTML = html; } this.appendHTML(DOM); } } } export default Patch;