修复 combo 的 onInit 送出来还是旧值的问题

This commit is contained in:
2betop 2020-01-06 12:27:09 +08:00
parent 94cbacef61
commit c5dbdd2aec
4 changed files with 36 additions and 15 deletions

View File

@ -175,6 +175,17 @@ export default class ComboControl extends React.Component<ComboProps> {
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<ComboProps> {
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<ComboProps> {
}
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 {

View File

@ -158,7 +158,8 @@ export default class Form extends React.Component<FormProps, object> {
'canAccessSuperData',
'lazyChange',
'formLazyChange',
'lazyLoad'
'lazyLoad',
'formInited'
];
hooks: {
@ -330,12 +331,24 @@ export default class Form extends React.Component<FormProps, object> {
// 先拿出来数据,主要担心 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<any>> = 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 &&

View File

@ -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);

View File

@ -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;
},