fix: formItem not update when a-form-item in child component #446
parent
56e68f19a7
commit
c9d3f7b79c
|
@ -139,9 +139,31 @@ const Form = {
|
|||
createForm(context, options = {}) {
|
||||
return new Vue(Form.create({ ...options, templateContext: context })());
|
||||
},
|
||||
created() {
|
||||
this.formItemContexts = new Map();
|
||||
},
|
||||
provide() {
|
||||
return {
|
||||
FormProps: this.$props,
|
||||
// https://github.com/vueComponent/ant-design-vue/issues/446
|
||||
collectFormItemContext:
|
||||
this.form && this.form.templateContext
|
||||
? (c, type = 'add') => {
|
||||
const formItemContexts = this.formItemContexts;
|
||||
const number = formItemContexts.get(c) || 0;
|
||||
if (type === 'delete') {
|
||||
if (number <= 1) {
|
||||
formItemContexts.delete(c);
|
||||
} else {
|
||||
formItemContexts.set(c, number - 1);
|
||||
}
|
||||
} else {
|
||||
if (c !== this.form.templateContext) {
|
||||
formItemContexts.set(c, number + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
: () => {},
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
|
@ -149,6 +171,13 @@ const Form = {
|
|||
this.$forceUpdate();
|
||||
},
|
||||
},
|
||||
beforeUpdate() {
|
||||
this.formItemContexts.forEach((number, c) => {
|
||||
if (c.$forceUpdate) {
|
||||
c.$forceUpdate();
|
||||
}
|
||||
});
|
||||
},
|
||||
updated() {
|
||||
if (this.form && this.form.cleanUpUselessFields) {
|
||||
this.form.cleanUpUselessFields();
|
||||
|
@ -232,7 +261,6 @@ const Form = {
|
|||
/>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<form onSubmit={onSubmit} class={formClassName}>
|
||||
{$slots.default}
|
||||
|
|
|
@ -19,6 +19,7 @@ import BaseMixin from '../_util/BaseMixin';
|
|||
import { cloneElement, cloneVNodes } from '../_util/vnode';
|
||||
import Icon from '../icon';
|
||||
|
||||
function noop(){}
|
||||
export const FormItemProps = {
|
||||
id: PropTypes.string,
|
||||
prefixCls: PropTypes.string,
|
||||
|
@ -47,10 +48,15 @@ export default {
|
|||
inject: {
|
||||
FormProps: { default: {} },
|
||||
decoratorFormProps: { default: {} },
|
||||
collectFormItemContext: { default: () => noop },
|
||||
},
|
||||
data() {
|
||||
this.collectFormItemContext(this.$vnode.context);
|
||||
return { helpShow: false };
|
||||
},
|
||||
beforeDestroy() {
|
||||
this.collectFormItemContext(this.$vnode.context, 'delete');
|
||||
},
|
||||
mounted() {
|
||||
warning(
|
||||
this.getControls(this.slotDefault, true).length <= 1,
|
||||
|
|
|
@ -56,7 +56,7 @@ function createBaseForm(option = {}, mixins = []) {
|
|||
data() {
|
||||
const fields = mapPropsToFields && mapPropsToFields(this.$props);
|
||||
this.fieldsStore = createFieldsStore(fields || {});
|
||||
|
||||
this.templateContext = templateContext;
|
||||
this.instances = {};
|
||||
this.cachedBind = {};
|
||||
this.clearedFieldMetaCache = {};
|
||||
|
|
Loading…
Reference in New Issue