import { isPage } from 'uni-helpers/index' import { initEvents, processEvent } from './events' import initBehaviors from './behaviors' import { createComponentDescriptor } from './wxs/component-descriptor' function pageMounted () { // 通知 Service,View 层已 ready UniViewJSBridge.publishHandler('onPageReady', {}, this.$page.id) } /** * View 层 Vue 插件 * 1.init events * 2.$trigger * 3.$handleProxy */ export default { install (Vue, { routes } = {}) { initEvents() const findUniTarget = function ($event, $el) { let target = $event.target for (; target && target !== $el; target = target.parentNode) { if (target.tagName && target.tagName.indexOf('UNI-') === 0) { break } } return target } Vue.prototype.$handleEvent = function ($event) { if ($event instanceof Event) { // 未处理的 event 对象 需要对 target 校正及包装 // 查找 uniTarget const target = findUniTarget($event, this.$el) $event = processEvent.call(this, $event.type, $event, {}, target || $event.target, $event.currentTarget) } return $event } Vue.prototype.$getComponentDescriptor = function (vm, isOwnerInstance) { return createComponentDescriptor(vm || this, isOwnerInstance) } Object.defineProperty(Vue.prototype, '$ownerInstance', { get () { return this.$getComponentDescriptor(this) } }) Vue.prototype.$handleWxsEvent = function ($event) { if ($event instanceof Event) { // 未处理的 event 对象 需要对 target 校正及包装 const currentTarget = $event.currentTarget // vue component / web component const component = currentTarget && (currentTarget.__vue__ || currentTarget) const instance = currentTarget && component.$getComponentDescriptor && component.$getComponentDescriptor(component, false) const $origEvent = $event $event = processEvent.call(this, $origEvent.type, $origEvent, {}, findUniTarget($origEvent, this.$el) || $origEvent.target, $origEvent.currentTarget) $event.instance = instance $event.preventDefault = function () { return $origEvent.preventDefault() } $event.stopPropagation = function () { return $origEvent.stopPropagation() } } return $event } Vue.mixin({ beforeCreate () { const options = this.$options const wxs = options.wxs if (wxs) { Object.keys(wxs).forEach(module => { this[module] = wxs[module] }) } if (options.behaviors && options.behaviors.length) { initBehaviors(options, this) } if (__PLATFORM__ === 'h5' && isPage(this)) { options.mounted = options.mounted ? [].concat(pageMounted, options.mounted) : [pageMounted] } } }) } }