113 lines
3.3 KiB
Java
113 lines
3.3 KiB
Java
// #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;
|