diff --git a/src/core/runtime/wrapper/util.js b/src/core/runtime/wrapper/util.js index 5e409ba9f4e408f8010fbee8491728ca2aabe39d..7b53ef48139de1697c2b760edc1d4a793ef34105 100644 --- a/src/core/runtime/wrapper/util.js +++ b/src/core/runtime/wrapper/util.js @@ -69,6 +69,35 @@ export function initHooks (mpOptions, hooks, vueOptions) { }) } +export function initUnknownHooks (mpOptions, vueOptions, excludes = []) { + findHooks(vueOptions).forEach((hook) => initHook(mpOptions, hook, excludes)) +} + +function findHooks (vueOptions, hooks = []) { + if (vueOptions) { + Object.keys(vueOptions).forEach((name) => { + if (name.indexOf('on') === 0 && isFn(vueOptions[name])) { + hooks.push(name) + } + }) + } + return hooks +} + +function initHook (mpOptions, hook, excludes) { + if (excludes.indexOf(hook) === -1 && !hasOwn(mpOptions, hook)) { + mpOptions[hook] = function (args) { + if ( + (__PLATFORM__ === 'mp-toutiao' || __PLATFORM__ === 'mp-lark') && + hook === 'onError' + ) { + return getApp().$vm.$callHook(hook, args) + } + return this.$vm && this.$vm.__call_hook(hook, args) + } + } +} + export function initVueComponent (Vue, vueOptions) { vueOptions = vueOptions.default || vueOptions let VueComponent diff --git a/src/platforms/mp-alipay/runtime/wrapper/page-parser.js b/src/platforms/mp-alipay/runtime/wrapper/page-parser.js index 756a6534f70efff0de49b47d20ccf4bf3ddbd910..69f3997b4f97c01a091041600a9b1c3fc08c6dea 100644 --- a/src/platforms/mp-alipay/runtime/wrapper/page-parser.js +++ b/src/platforms/mp-alipay/runtime/wrapper/page-parser.js @@ -7,6 +7,7 @@ import { import { initData, initHooks, + initUnknownHooks, handleEvent, initBehaviors, initVueComponent, @@ -93,6 +94,7 @@ export default function parsePage (vuePageOptions) { } initHooks(pageOptions, hooks, vuePageOptions) + initUnknownHooks(pageOptions, vuePageOptions) if (Array.isArray(vueOptions.wxsCallMethods)) { vueOptions.wxsCallMethods.forEach(callMethod => { diff --git a/src/platforms/mp-weixin/runtime/wrapper/app-base-parser.js b/src/platforms/mp-weixin/runtime/wrapper/app-base-parser.js index d8659b99c9ec7066767febbb5a8d4676c948ac6d..762c3c740ab7aa5a40bf76bad5398abf44459112 100644 --- a/src/platforms/mp-weixin/runtime/wrapper/app-base-parser.js +++ b/src/platforms/mp-weixin/runtime/wrapper/app-base-parser.js @@ -2,6 +2,7 @@ import Vue from 'vue' import { initHooks, + initUnknownHooks, initMocks } from 'uni-wrapper/util' @@ -190,6 +191,7 @@ export default function parseBaseApp (vm, { initAppLocale(Vue, vm, normalizeLocale(__GLOBAL__.getSystemInfoSync().language) || LOCALE_EN) initHooks(appOptions, hooks) + initUnknownHooks(appOptions, vm.$options) return appOptions } diff --git a/src/platforms/mp-weixin/runtime/wrapper/page-base-parser.js b/src/platforms/mp-weixin/runtime/wrapper/page-base-parser.js index 7d908d9f0ebfa11e8c0b15d63183b589235a0ded..71f57dfb30f61512439d2744aeeb35b74d2d1b7f 100644 --- a/src/platforms/mp-weixin/runtime/wrapper/page-base-parser.js +++ b/src/platforms/mp-weixin/runtime/wrapper/page-base-parser.js @@ -4,6 +4,7 @@ import { import { initHooks, + initUnknownHooks, PAGE_EVENT_HOOKS } from 'uni-wrapper/util' @@ -27,6 +28,7 @@ export default function parseBasePage (vuePageOptions, { }) initHooks(pageOptions.methods, hooks, vuePageOptions) + initUnknownHooks(pageOptions.methods, vuePageOptions) pageOptions.methods.onLoad = function (query) { this.options = query @@ -40,4 +42,4 @@ export default function parseBasePage (vuePageOptions, { } return pageOptions -} +} diff --git a/src/platforms/mp-xhs/runtime/wrapper/page-parser.js b/src/platforms/mp-xhs/runtime/wrapper/page-parser.js index f60f8f69ed1d9bf8e4da26d2a59ee44640e8f3cb..de62a01c0dff5f75d6908969f4fd81b6b6218dcd 100644 --- a/src/platforms/mp-xhs/runtime/wrapper/page-parser.js +++ b/src/platforms/mp-xhs/runtime/wrapper/page-parser.js @@ -7,6 +7,7 @@ import { import { initData, initHooks, + initUnknownHooks, handleEvent, initBehaviors, initVueComponent, @@ -80,6 +81,7 @@ export default function parsePage (vuePageOptions) { } initHooks(pageOptions, hooks, vuePageOptions) + initUnknownHooks(pageOptions, vuePageOptions) if (Array.isArray(vueOptions.wxsCallMethods)) { vueOptions.wxsCallMethods.forEach(callMethod => {