|
|
// #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;
|