import { hasOwn } from 'uni-shared' import { stringifyQuery } from 'uni-shared/query' import { isPage, initRelation, mocks } from './util' import { initMocks } from 'uni-wrapper/util' import { fixSetDataStart, fixSetDataEnd } from '../../../mp-weixin/runtime/wrapper/fix-set-data' import parseBaseComponent from '../../../mp-weixin/runtime/wrapper/component-base-parser' const newLifecycle = swan.canIUse('lifecycle-2-0') export default function parseComponent (vueComponentOptions, needVueOptions) { const [componentOptions, vueOptions] = parseBaseComponent(vueComponentOptions, { isPage, initRelation }, true) // 关于百度小程序生命周期的说明(组件作为页面时): // lifetimes:attached --> methods:onShow --> methods:onLoad --> methods:onReady // 这里在强制将onShow挪到onLoad之后触发,另外一处修改在page-parser.js const oldAttached = componentOptions.lifetimes.attached // 百度小程序基础库 3.260 以上支持页面 onInit 生命周期,提前创建 vm 实例 componentOptions.lifetimes.onInit = function onInit (query) { // 百度小程序后续可能移除 pageinstance 属性,为向后兼容进行补充 if (!this.pageinstance || !this.pageinstance.setData) { const pages = getCurrentPages() this.pageinstance = pages[pages.length - 1] } // 处理百度小程序 onInit 生命周期调用 setData 无效的问题 fixSetDataStart(this) oldAttached.call(this) this.pageinstance.$vm = this.$vm this.$vm.__call_hook('onInit', query) } componentOptions.lifetimes.attached = function attached () { if (!this.$vm) { oldAttached.call(this) } else { initMocks(this.$vm, mocks) fixSetDataEnd(this) } if (isPage.call(this)) { // 百度 onLoad 在 attached 之前触发(基础库小于 3.70) // 百度 当组件作为页面时 pageinstancce 不是原来组件的 instance this.pageinstance.$vm = this.$vm if (hasOwn(this.pageinstance, '_$args')) { const query = this.pageinstance._$args const copyQuery = Object.assign({}, query) delete copyQuery.__id__ this.pageinstance.$page = this.$page = { fullPath: '/' + this.pageinstance.route + stringifyQuery(copyQuery) } this.$vm.$mp.query = query this.$vm.__call_hook('onLoad', query) this.$vm.__call_hook('onShow') delete this.pageinstance._$args } } else { // 百度小程序组件不触发methods内的onReady if (this.$vm) { this.$vm._isMounted = true this.$vm.__call_hook('mounted') } } } if (newLifecycle) { componentOptions.methods.onReady = componentOptions.lifetimes.ready delete componentOptions.lifetimes.ready } componentOptions.messages = { __l: componentOptions.methods.__l } delete componentOptions.methods.__l return needVueOptions ? [componentOptions, vueOptions] : componentOptions }