diff --git a/src/platforms/mp-baidu/runtime/wrapper/component-parser.js b/src/platforms/mp-baidu/runtime/wrapper/component-parser.js index a9740face01f1a7514d5c473b8c221a584cffbf0..cda77ff0670abcc040367c8e8f1aebaaf61dca64 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 f8a07f563e5e9cb37d10542099fdd2b9b7cab8ae..425752d97e9cc73d19ddae184a492325dfe47320 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 0000000000000000000000000000000000000000..a7539cc113d3c62b453088c6e1927100417efdef --- /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 + } +}