@sinosun/lib
Version:
sinosun jsbridge and net toolkit
374 lines (305 loc) • 11.3 kB
JavaScript
"use strict";
/*
* @Description: 所有router页面基础类, 封装处理 back、refresh、setMenu等浏览器基本操作
*/
/*
子类按需重写 @override 这些function:
// 浏览器返回事件触发
onBack()
// 页面刷新事件处理
onRefresh(refreshData)
// 返回需要注册到浏览器上的菜单、按钮
getMenuList()
*/
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
var _typeof2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/typeof"));
require("core-js/modules/es.function.name.js");
require("core-js/modules/es.regexp.exec.js");
require("core-js/modules/es.string.replace.js");
var _defineProperty = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/define-property"));
var _assign = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/assign"));
var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));
var __importDefault = void 0 && (void 0).__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
(0, _defineProperty["default"])(exports, "__esModule", {
value: true
});
var EventType_1 = __importDefault(require("./EventType"));
var baseUtils_1 = require("./baseUtils");
var BaseRouter = {
inject: ["getThemeConfig"],
data: function data() {
return {
// 当前的url参数
currentUrlParams: {}
};
},
created: function created() {
this.dealUrlParams();
this.setTitleBar(); //监听浏览器事件处理
this.observeBrowserOption();
},
// keep-alive 路由需要重新注册title和菜单
activated: function activated() {
// 缓存路由页面
if ((this.$route.meta || {}).keepAlive) {
// 重置 titleBar设置
this.setComplete = false;
this.dealUrlParams();
this.setTitleBar();
this.registerBrowserMenuList();
}
},
methods: {
// 获取路由参数
dealUrlParams: function dealUrlParams() {
this.currentUrlParams = baseUtils_1.getUrlParams() || {};
},
// 设置title定制
setTitleBar: function setTitleBar() {
var metaConfig = this.$route.meta || {};
var title = metaConfig.title || "";
if (title) {
this.setTitle(title);
}
var titleBarConfig = metaConfig.titleBarConfig || {};
if (titleBarConfig && typeof titleBarConfig.backgroundColor === 'function') {
titleBarConfig.backgroundColor = titleBarConfig.backgroundColor();
}
titleBarConfig = (0, _assign["default"])({}, this.getThemeConfig(), titleBarConfig); // 设置是否有变化 需要判断已经变化之后的 不然页面scroll变化之后的值没有记录
if ((0, _stringify["default"])(window.STORECURRENTTITLEBARCONFIG) === (0, _stringify["default"])(titleBarConfig)) {
return;
}
window.TITLEBARCONFIG = titleBarConfig;
window.STORECURRENTTITLEBARCONFIG = titleBarConfig;
BrowserApi.setTitleBarTheme(titleBarConfig);
},
/**
* 监听浏览器事件处理
* TODO 如果子类不需要注册这些事件,或者不在create生命周期regist,可以重写该function, 按需regist
* @abstract
*/
observeBrowserOption: function observeBrowserOption() {
this.observeBackEvent();
this.observeRefreshPageEvent();
this.observeAppPause();
this.observeAppResume();
this.observeSwitchCompany(); // 页面没有keep-alive
if (!(this.$route.meta || {}).keepAlive) {
this.registerBrowserMenuList();
}
},
/**
* 获取事件名称
*/
getEventName: function getEventName(type) {
var path = this.$route.path ? this.$route.path : "/";
return this.$route.name + "_" + path + "_" + type;
},
// 回退预处理
preBack: function preBack() {
var flag = false;
var forceExitPageName = this.currentUrlParams.forceExitPageName || "";
var exitPage = this.isRouterPageBack(forceExitPageName);
if (exitPage) {
this.goBack();
flag = true;
}
return flag;
},
/**
* 监听浏览器返回事件
*/
observeBackEvent: function observeBackEvent() {
var _this = this;
var name = this.getEventName(EventType_1["default"].NOTIFYAPPBACK); // 先移除监听
this.$EventBus.$off(name); // 监听回退事件
this.$EventBus.$on(name, baseUtils_1.scrollThrottle(function (data) {
if (_this.preBack()) {
return;
}
_this.onBack(data);
}, 400));
},
/**
* 监听页面刷新事件
*/
observeRefreshPageEvent: function observeRefreshPageEvent() {
var _this = this;
var name = this.getEventName(EventType_1["default"].REFRESHPAGE); // 先移除监听
this.$EventBus.$off(name); // 监听回退事件
this.$EventBus.$on(name, baseUtils_1.scrollThrottle(function (data) {
_this.onRefreshPrev();
_this.onRefresh(data);
}, 400));
},
/**
* 注册app切到后台
*/
observeAppPause: function observeAppPause() {
var _this = this;
var name = this.getEventName(EventType_1["default"].APPPAUSE); // 先移除监听
this.$EventBus.$off(name); // 监听回退事件
this.$EventBus.$on(name, function (data) {
_this.onAppPause(data);
});
},
/**
* 注册app切到前台
*/
observeAppResume: function observeAppResume() {
var _this = this;
var name = this.getEventName(EventType_1["default"].APPRESUME); // 先移除监听
this.$EventBus.$off(name); // 监听回退事件
this.$EventBus.$on(name, function (data) {
_this.onAppResume(data);
});
},
/**
* @description:
* @param {*}
*/
observeSwitchCompany: function observeSwitchCompany() {
var _this = this;
var name = this.getEventName(EventType_1["default"].SWITCHCOMPANY); // 先移除监听
this.$EventBus.$off(name); // 监听回退事件
this.$EventBus.$on(name, function (data) {
_this.onSwitchCompany(data);
});
},
/**
* 子页面回退逻辑处理,子类可以实现该方法
* @abstract
*/
onBack: function onBack() {
this.routerBack();
},
/**
* @description: 处理多页面进入非首页路由退出页面处理 并且页面内有路由跳转
* @param {type}
* @return boolean 是否执行回退
*/
isRouterPageBack: function isRouterPageBack(exitPageName) {
var exitRouterName = this.$route.name || (this.$route.path || "").replace("/", "");
if (exitPageName === exitRouterName) {
return true;
}
return false;
},
/**
* @description: 处理多页面进入非首页路由退出页面处理 页面不可跳转别的页面
* @param {type}
*/
isPageBack: function isPageBack(exitPage) {
if (exitPage && exitPage == 1) {
return true;
}
return false;
},
/**
* @param
* url:目标页面的url, 为''时关闭当前页
* backSteps:当前页面回退步数
* loadData:传递给目标页面的数据
*/
goBack: function goBack(url, backSteps, loadData) {
if (url === void 0) {
url = "";
}
BrowserApi.goBack(url, backSteps, loadData);
},
// 页面跳转 之前的公共处理 针对keepAlive
beforeRouterChange: function beforeRouterChange() {
this.$modal && this.$modal.close(); // 当前页面活动元素
if (document.activeElement) {
var tagName = document.activeElement.tagName;
if (tagName === "INPUT" || tagName === "TEXTAREA") {
document.activeElement.blur && typeof document.activeElement.blur === "function" && document.activeElement.blur();
}
}
},
/**
* 路由页面回退
*/
routerBack: function routerBack() {
this.$router.goBack();
},
// APP切换后台
onAppPause: function onAppPause() {},
// APP切换前台
onAppResume: function onAppResume() {},
// 切换企业
onSwitchCompany: function onSwitchCompany() {},
/**
* @description: 需要重薪设置titlebar数据
*/
onRefreshPrev: function onRefreshPrev() {
try {
var titleInfo = BrowserApi.getCurrentTitleInfo();
this.setTitle(titleInfo);
var menuList = BrowserApi.getCurrentMenuList();
BrowserApi.registerMenu(menuList);
var titleBarTheme = BrowserApi.getCurrentTitleBarTheme();
BrowserApi.setTitleBarTheme(titleBarTheme);
} catch (err) {
console.log("onRefreshPrev @@Error", err);
}
},
/**
* 子页面刷新逻辑处理,子类可以实现该方法 默认页面回退设置title和menu
* @abstract
*/
onRefresh: function onRefresh() {},
/**
* 设置页面title
*/
setTitle: function setTitle(data) {
var titleInfo = {};
if ((0, _typeof2["default"])(data) !== "object") {
titleInfo.title = data;
} else {
titleInfo = data;
}
BrowserApi.setTitle(titleInfo);
},
/**
* 注册app菜单监听事件,子类没有重写 getMenuList() 方法的不额外加 menu 菜单项
*/
registerBrowserMenuList: function registerBrowserMenuList() {
BrowserApi.registerMenu(this.getMenuList());
},
/**
* 注册菜单
* MenuItem {
String name; // 如果是菜单,用name显示菜单文字
String iconNormalBase64; // 如果是图标按钮,用来显示 正常图标(JS交互时,用base64转码,如果图片超过5k,提出来让UI重新切图)
String iconPressedBase64; // 如果是图标按钮,用来显示 按下效果 图标(JS交互时,用base64转码,如果图片超过5k,提出来让UI重新切图)
String menuId; //必填 菜单ID (不区分是 图标按钮 或是 菜单项),列表中的menuId必须相互唯一
Int type; // 必填 类型 1 ActionBar上的图标按钮,2 下拉菜单项 3 title显示(设置title请使用BrowserApi.setTitle('title')接口)(一般情况下,只有一个图标按钮,可以有多个下拉菜单项)
function func; // 菜单点击回调
}
注意
name 和 iconNormalBase64 至少需要填写一个;
name 和iconNormalBase64 都有值时ActionBar上的按钮优先显示name,下拉菜单项会左边显示图标,右边显示name;
当有多个type 为1的item时,app会取第一个值;
下拉菜单项显示顺序默认按menuList的顺序排序;
example:
[{name:'设置',menuId:'but_1_1',type: 1,func:function(){openPage('setting.html')}}];
*/
getMenuList: function getMenuList() {
return [];
} /////// --- end 浏览器基本操作方法,子类view应当按需重写 @override ///////////////////////////////////
},
watch: {
/**
* 设置进入、回退页面动画
*/
$route: function $route() {
this.beforeRouterChange();
}
}
};
exports["default"] = BaseRouter;