From b5272891fa6583046c54ed05b69b0152262a273d Mon Sep 17 00:00:00 2001 From: DCloud_LXH <283700113@qq.com> Date: Thu, 2 Sep 2021 14:52:26 +0800 Subject: [PATCH] fix(mp-baidu): onInit --- packages/uni-mp-baidu/dist/uni.api.esm.js | 4 +- packages/uni-mp-baidu/dist/uni.mp.esm.js | 62 ++++++++++++++++++- .../src/runtime/parseComponentOptions.ts | 33 +++++++++- 3 files changed, 92 insertions(+), 7 deletions(-) diff --git a/packages/uni-mp-baidu/dist/uni.api.esm.js b/packages/uni-mp-baidu/dist/uni.api.esm.js index d60c8db10..bebc81822 100644 --- a/packages/uni-mp-baidu/dist/uni.api.esm.js +++ b/packages/uni-mp-baidu/dist/uni.api.esm.js @@ -49,8 +49,8 @@ function onAppLaunch(hook) { swan.appLaunchHooks.push(hook); } -function getBaseSystemInfo() { - return swan.getSystemInfoSync() +function getBaseSystemInfo() { + return swan.getSystemInfoSync() } function validateProtocolFail(name, msg) { diff --git a/packages/uni-mp-baidu/dist/uni.mp.esm.js b/packages/uni-mp-baidu/dist/uni.mp.esm.js index 5b4735415..52e502491 100644 --- a/packages/uni-mp-baidu/dist/uni.mp.esm.js +++ b/packages/uni-mp-baidu/dist/uni.mp.esm.js @@ -1179,6 +1179,45 @@ var parseAppOptions = /*#__PURE__*/Object.freeze({ parse: parse$2 }); +/** + * 用于延迟调用 setData + * 在 setData 真实调用的时机需执行 fixSetDataEnd + * @param {*} mpInstance + */ +function fixSetDataStart(mpInstance) { + const setData = mpInstance.setData; + const setDataArgs = []; + mpInstance.setData = function () { + setDataArgs.push(arguments); + }; + mpInstance.__fixInitData = function () { + this.setData = setData; + const fn = () => { + setDataArgs.forEach((args) => { + setData.apply(this, args); + }); + }; + if (setDataArgs.length) { + if (this.groupSetData) { + this.groupSetData(fn); + } + else { + fn(); + } + } + }; +} +/** + * 恢复真实的 setData 方法 + * @param {*} mpInstance + */ +function fixSetDataEnd(mpInstance) { + if (mpInstance.__fixInitData) { + mpInstance.__fixInitData(); + delete mpInstance.__fixInitData; + } +} + function initLifetimes({ mocks, isPage, initRelation, vueOptions, }) { return { attached() { @@ -1250,10 +1289,29 @@ function parse$1(componentOptions) { // lifetimes:attached --> methods:onShow --> methods:onLoad --> methods:onReady // 这里在强制将onShow挪到onLoad之后触发,另外一处修改在page-parser.js const oldAttached = lifetimes.attached; - lifetimes.attached = function attached() { + // 百度小程序基础库 3.260 以上支持页面 onInit 生命周期,提前创建 vm 实例 + 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); + }; + lifetimes.attached = function attached() { + if (!this.$vm) { + oldAttached.call(this); + } + else { + initMocks(this.$vm.$, this, mocks); + fixSetDataEnd(this); + } if (isPage(this) && this.$vm) { - // 百度 onLoad 在 attached 之前触发 + // 百度 onLoad 在 attached 之前触发(基础库小于 3.70) // 百度 当组件作为页面时 pageinstance 不是原来组件的 instance const pageInstance = this.pageinstance; pageInstance.$vm = this.$vm; diff --git a/packages/uni-mp-baidu/src/runtime/parseComponentOptions.ts b/packages/uni-mp-baidu/src/runtime/parseComponentOptions.ts index 800b4edb5..2fc0929da 100644 --- a/packages/uni-mp-baidu/src/runtime/parseComponentOptions.ts +++ b/packages/uni-mp-baidu/src/runtime/parseComponentOptions.ts @@ -1,7 +1,15 @@ import { hasOwn } from '@vue/shared' -import { MPComponentInstance, MPComponentOptions } from '@dcloudio/uni-mp-core' +import { + MPComponentInstance, + MPComponentOptions, + initMocks, +} from '@dcloudio/uni-mp-core' import { ON_LOAD, ON_SHOW } from '@dcloudio/uni-shared' +import { + fixSetDataStart, + fixSetDataEnd, +} from '../../../uni-mp-weixin/src/runtime/fixSetData' export { handleLink, initLifetimes } from '@dcloudio/uni-mp-weixin' @@ -28,10 +36,29 @@ export function parse(componentOptions: MPComponentOptions) { // lifetimes:attached --> methods:onShow --> methods:onLoad --> methods:onReady // 这里在强制将onShow挪到onLoad之后触发,另外一处修改在page-parser.js const oldAttached = lifetimes.attached - lifetimes.attached = function attached(this: MPComponentInstance) { + // 百度小程序基础库 3.260 以上支持页面 onInit 生命周期,提前创建 vm 实例 + lifetimes.onInit = function onInit(query: any) { + // 百度小程序后续可能移除 pageinstance 属性,为向后兼容进行补充 + if (!this.pageinstance || !this.pageinstance.setData) { + const pages = getCurrentPages() + this.pageinstance = pages[pages.length - 1] + } + + // 处理百度小程序 onInit 生命周期调用 setData 无效的问题 + fixSetDataStart(this as MPComponentInstance) oldAttached.call(this) + this.pageinstance.$vm = this.$vm + this.$vm.__call_hook('onInit', query) + } + lifetimes.attached = function attached(this: MPComponentInstance) { + if (!this.$vm) { + oldAttached.call(this) + } else { + initMocks(this.$vm.$, this, mocks) + fixSetDataEnd(this) + } if (isPage(this) && this.$vm) { - // 百度 onLoad 在 attached 之前触发 + // 百度 onLoad 在 attached 之前触发(基础库小于 3.70) // 百度 当组件作为页面时 pageinstance 不是原来组件的 instance const pageInstance = (this as any).pageinstance pageInstance.$vm = this.$vm -- GitLab