From c5dbdd2aecd24f86ce92f43c8550579b3ed6ead0 Mon Sep 17 00:00:00 2001 From: 2betop <2betop.cn@gmail.com> Date: Mon, 6 Jan 2020 12:27:09 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20combo=20=E7=9A=84=20onInit?= =?UTF-8?q?=20=E9=80=81=E5=87=BA=E6=9D=A5=E8=BF=98=E6=98=AF=E6=97=A7?= =?UTF-8?q?=E5=80=BC=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/renderers/Form/Combo.tsx | 28 +++++++++++++++++++--------- src/renderers/Form/index.tsx | 17 +++++++++++++++-- src/store/form.ts | 4 ---- src/store/iRenderer.ts | 2 ++ 4 files changed, 36 insertions(+), 15 deletions(-) diff --git a/src/renderers/Form/Combo.tsx b/src/renderers/Form/Combo.tsx index 74ae97fa..69a7302e 100644 --- a/src/renderers/Form/Combo.tsx +++ b/src/renderers/Form/Combo.tsx @@ -175,6 +175,17 @@ export default class ComboControl extends React.Component { if (store.activeKey >= values.length) { store.setActiveKey(Math.max(0, values.length - 1)); } + + // combo 进来了新的值,且这次 form 初始化时带来的新值变化,但是之前的值已经 onInit 过了 + // 所以,之前 onInit 设置进去的初始值是过时了的。这个时候修复一下。 + if (nextProps.value !== props.value && !props.formInited && nextProps.formInited && this.subFormDefaultValues.length) { + this.subFormDefaultValues = this.subFormDefaultValues.map((item, index) => { + return { + ...item, + values: values[index] + } + }) + } } } @@ -364,17 +375,13 @@ export default class ComboControl extends React.Component { setPrinstineValue } = this.props; - if (syncDefaultValue === false || disabled) { - return; - } - this.subFormDefaultValues.push({ index, values, setted: false }); - if (this.subFormDefaultValues.length !== this.subForms.length) { + if (syncDefaultValue === false || disabled || this.subFormDefaultValues.length !== this.subForms.length) { return; } @@ -411,11 +418,14 @@ export default class ComboControl extends React.Component { } handleSingleFormInit(values: any) { - this.props.syncDefaultValue !== false && - this.props.setPrinstineValue && - this.props.setPrinstineValue({ + const {syncDefaultValue, setPrinstineValue, value} = this.props; + + + if (syncDefaultValue !== false && isObjectShallowModified(value, values) && setPrinstineValue) { + setPrinstineValue({ ...values - }); + }) + } } handleAction(action: Action): any { diff --git a/src/renderers/Form/index.tsx b/src/renderers/Form/index.tsx index 9c59f226..5fbd80f6 100644 --- a/src/renderers/Form/index.tsx +++ b/src/renderers/Form/index.tsx @@ -158,7 +158,8 @@ export default class Form extends React.Component { 'canAccessSuperData', 'lazyChange', 'formLazyChange', - 'lazyLoad' + 'lazyLoad', + 'formInited' ]; hooks: { @@ -330,12 +331,24 @@ export default class Form extends React.Component { // 先拿出来数据,主要担心 form 被什么东西篡改了,然后又应用出去了 // 之前遇到过问题,所以拿出来了。但是 options loadOptions 默认值失效了。 // 所以目前需要两个都要设置一下,再 init Hook 里面。 - const data = cloneObject(store.data); + let data = cloneObject(store.data); + const initedAt = store.initedAt; store.setInited(true); const hooks: Array<(data: any) => Promise> = this.hooks['init'] || []; await Promise.all(hooks.map(hook => hook(data))); + if (store.initedAt !== initedAt) { + // 说明,之前的数据已经失效了。 + // 比如 combo 一开始设置了初始值,然后 form 的 initApi 又返回了新的值。 + // 这个时候 store 的数据应该已经 init 了新的值。但是 data 还是老的,这个时候 + // onInit 出去就是错误的。 + data = { + ...data, + ...store.data + }; + } + onInit && onInit(data, this.props); submitOnInit && diff --git a/src/store/form.ts b/src/store/form.ts index 4578d311..d29f7a93 100644 --- a/src/store/form.ts +++ b/src/store/form.ts @@ -94,10 +94,6 @@ export const FormStore = ServiceStore.named('FormStore') isPristine: boolean = false, force: boolean = false ) { - if (name === 'strategy_json') { - debugger; - } - // 没有变化就不跑了。 const origin = getVariable(self.data, name, false); diff --git a/src/store/iRenderer.ts b/src/store/iRenderer.ts index e9bf8c29..b420f42f 100644 --- a/src/store/iRenderer.ts +++ b/src/store/iRenderer.ts @@ -11,6 +11,7 @@ export const iRendererStore = types storeType: types.string, hasRemoteData: types.optional(types.boolean, false), data: types.optional(types.frozen(), {}), + initedAt: 0, // 初始 init 的时刻 updatedAt: 0, // 从服务端更新时刻 pristine: types.optional(types.frozen(), {}), disposed: false, @@ -52,6 +53,7 @@ export const iRendererStore = types return { initData(data: object = {}) { + self.initedAt = Date.now(); self.pristine = data; self.data = data; },