diff --git a/src/core/service/plugins/index.js b/src/core/service/plugins/index.js index f6c2ceea89acc0d03adcac4948e0f51dcefad871..9c13783e38609c8ccf7bbad1b0fcd8b780cfdf3b 100644 --- a/src/core/service/plugins/index.js +++ b/src/core/service/plugins/index.js @@ -16,6 +16,10 @@ import { createPageMixin } from './page' +import { + lifecycleMixin +} from './lifecycle' + import { getTabBarScrollPosition } from './app/router-guard' @@ -55,7 +59,9 @@ function getLocation (base = '/') { export default { install (Vue, { routes - } = {}) { + } = {}) { + lifecycleMixin(Vue) + const minId = getMinId(routes) const router = new VueRouter({ id: minId, diff --git a/src/core/service/plugins/lifecycle.js b/src/core/service/plugins/lifecycle.js new file mode 100644 index 0000000000000000000000000000000000000000..620f7cae4155a08a9a6c5a02361c0f0aa43a050f --- /dev/null +++ b/src/core/service/plugins/lifecycle.js @@ -0,0 +1,57 @@ +/* @flow */ + +const LIFECYCLE_HOOKS = [ + // App + 'onLaunch', + 'onShow', + 'onHide', + 'onUniNViewMessage', + 'onError', + // Page + 'onLoad', + // 'onShow', + 'onReady', + // 'onHide', + 'onUnload', + 'onPullDownRefresh', + 'onReachBottom', + 'onTabItemTap', + 'onShareAppMessage', + 'onResize', + 'onPageScroll', + 'onNavigationBarButtonTap', + 'onBackPress', + 'onNavigationBarSearchInputChanged', + 'onNavigationBarSearchInputConfirmed', + 'onNavigationBarSearchInputClicked', + // Component + // 'onReady', // 兼容旧版本,应该移除该事件 + 'onPageShow', + 'onPageHide', + 'onPageResize' +] +export function lifecycleMixin (Vue) { + // fixed vue-class-component + const oldExtend = Vue.extend + Vue.extend = function (extendOptions) { + extendOptions = extendOptions || {} + + const methods = extendOptions.methods + if (methods) { + Object.keys(methods).forEach(methodName => { + if (LIFECYCLE_HOOKS.indexOf(methodName) !== -1) { + extendOptions[methodName] = methods[methodName] + delete methods[methodName] + } + }) + } + + return oldExtend.call(this, extendOptions) + } + + const strategies = Vue.config.optionMergeStrategies + const mergeHook = strategies.created + LIFECYCLE_HOOKS.forEach(hook => { + strategies[hook] = mergeHook + }) +} diff --git a/src/core/service/plugins/util.js b/src/core/service/plugins/util.js index 55819da95ec37d670efd5db59ffa61c6b1443db2..b9f484167124825c5fd6b3d484683e85c26c3bf6 100644 --- a/src/core/service/plugins/util.js +++ b/src/core/service/plugins/util.js @@ -1,9 +1,5 @@ -import { - isFn -} from 'uni-shared' - function callHook (vm, hook, params) { - return isFn(vm.$options[hook]) && vm.$options[hook].apply(vm, params) + return vm.__call_hook(hook, params) } export function callAppHook (vm, hook, ...params) { @@ -20,12 +16,12 @@ export function callPageHook (vm, hook, ...params) { vm.$mp.query = params[0] UniServiceJSBridge.publishHandler('onPageLoad', vm, vm.$page.id) } - if (hook === 'onShow') { - if ( - vm.$route.meta.isTabBar && - vm.$route.params.detail - ) { - UniServiceJSBridge.emit('onTabItemTap', vm.$route.params.detail) + if (hook === 'onShow') { + if ( + vm.$route.meta.isTabBar && + vm.$route.params.detail + ) { + UniServiceJSBridge.emit('onTabItemTap', vm.$route.params.detail) } UniServiceJSBridge.publishHandler('onPageShow', vm, vm.$page.id) } @@ -34,4 +30,4 @@ export function callPageHook (vm, hook, ...params) { console.debug(`${vm.$page.route}[${vm.$page.id}]:${hook} have been invoked`) } return callHook(vm, hook, params) -} +}