From d6f6befaeefccdd34d88ab802f20983e8fae244f Mon Sep 17 00:00:00 2001 From: qiang Date: Thu, 15 Jul 2021 16:07:16 +0800 Subject: [PATCH] =?UTF-8?q?fix(mp-kuaishou):=20=E4=BF=AE=E5=A4=8D=E5=BF=AB?= =?UTF-8?q?=E6=89=8B=E5=B0=8F=E7=A8=8B=E5=BA=8F=E9=83=A8=E5=88=86=E6=83=85?= =?UTF-8?q?=E5=86=B5=E6=95=B0=E6=8D=AE=E6=97=A0=E6=B3=95=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../runtime/wrapper/component-parser.js | 24 ++++-------- .../runtime/wrapper/component-parser.js | 23 +++++++++++- .../mp-weixin/runtime/wrapper/fix-set-data.js | 37 +++++++++++++++++++ 3 files changed, 66 insertions(+), 18 deletions(-) create mode 100644 src/platforms/mp-weixin/runtime/wrapper/fix-set-data.js diff --git a/src/platforms/mp-baidu/runtime/wrapper/component-parser.js b/src/platforms/mp-baidu/runtime/wrapper/component-parser.js index a9740face..cda77ff06 100644 --- a/src/platforms/mp-baidu/runtime/wrapper/component-parser.js +++ b/src/platforms/mp-baidu/runtime/wrapper/component-parser.js @@ -16,6 +16,11 @@ 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') @@ -39,22 +44,7 @@ export default function parseComponent (vueOptions) { } // 处理百度小程序 onInit 生命周期调用 setData 无效的问题 - const setData = this.setData - const setDataArgs = [] - this.setData = function () { - setDataArgs.push(arguments) - } - this.__fixInitData = function () { - delete this.__fixInitData - this.setData = setData - if (setDataArgs.length) { - this.groupSetData(() => { - setDataArgs.forEach(args => { - setData.apply(this, args) - }) - }) - } - } + fixSetDataStart(this) oldAttached.call(this) this.pageinstance.$vm = this.$vm this.$vm.__call_hook('onInit', query) @@ -64,7 +54,7 @@ export default function parseComponent (vueOptions) { oldAttached.call(this) } else { initMocks(this.$vm, mocks) - this.__fixInitData && this.__fixInitData() + fixSetDataEnd(this) } if (isPage.call(this)) { // 百度 onLoad 在 attached 之前触发(基础库小于 3.70) // 百度 当组件作为页面时 pageinstancce 不是原来组件的 instance diff --git a/src/platforms/mp-kuaishou/runtime/wrapper/component-parser.js b/src/platforms/mp-kuaishou/runtime/wrapper/component-parser.js index f8a07f563..425752d97 100644 --- a/src/platforms/mp-kuaishou/runtime/wrapper/component-parser.js +++ b/src/platforms/mp-kuaishou/runtime/wrapper/component-parser.js @@ -1,5 +1,26 @@ import parseBaseComponent from '../../../mp-weixin/runtime/wrapper/component-parser' +import { isPage } from '../../../mp-weixin/runtime/wrapper/util' + +import { + fixSetDataStart, + fixSetDataEnd +} from '../../../mp-weixin/runtime/wrapper/fix-set-data' + +const SDKVersion = __GLOBAL__.getSystemInfoSync().SDKVersion + export default function parseComponent (vueComponentOptions) { - return parseBaseComponent(vueComponentOptions) + const componentOptions = parseBaseComponent(vueComponentOptions) + const oldAttached = componentOptions.lifetimes.attached + componentOptions.lifetimes.attached = function attached () { + if (isPage.call(this) && parseFloat(SDKVersion) <= 1.13) { + // 解决快手小程序页面 attached 生命周期 setData 导致数据同步异常的问题 + fixSetDataStart(this) + setTimeout(() => { + fixSetDataEnd(this) + }, 0) + } + oldAttached.call(this) + } + return componentOptions } diff --git a/src/platforms/mp-weixin/runtime/wrapper/fix-set-data.js b/src/platforms/mp-weixin/runtime/wrapper/fix-set-data.js new file mode 100644 index 000000000..a7539cc11 --- /dev/null +++ b/src/platforms/mp-weixin/runtime/wrapper/fix-set-data.js @@ -0,0 +1,37 @@ +/** + * 用于延迟调用 setData + * 在 setData 真实调用的时机需执行 fixSetDataEnd + * @param {*} mpInstance + */ +export 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 + */ +export function fixSetDataEnd (mpInstance) { + if (mpInstance.__fixInitData) { + mpInstance.__fixInitData() + delete mpInstance.__fixInitData + } +} -- GitLab