<template>
|
<a-form @submit="handleSubmit"
|
style="margin-top: 8px"
|
:autoFormCreate="(form)=>{this.form = form}"
|
v-bind="formOption">
|
|
<dy-item :properties="rootProperties"></dy-item>
|
|
<a-form-item style="margin-top: 32px">
|
<a-button type="primary" htmlType="submit" :loading="submiting">
|
提交
|
</a-button>
|
<a-button style="margin-left: 8px">保存</a-button>
|
</a-form-item>
|
|
</a-form>
|
</template>
|
|
<style lang="less">
|
|
</style>
|
|
<script lang="tsx">
|
import {
|
Component,
|
Prop,
|
Vue,
|
Emit,
|
} from 'vue-property-decorator';
|
import {
|
State,
|
Mutation,
|
namespace,
|
} from 'vuex-class';
|
|
import DyFormitem from './DyFormitem.vue';
|
import { DFSchema } from './schema/DfSchema';
|
import { DFUISchema } from './schema/UiSchema';
|
import FormProperty from './domain/FormProperty';
|
|
@Component({
|
components: {
|
'dy-item': DyFormitem,
|
},
|
})
|
export default class DyForm extends Vue {
|
|
/**
|
* json schema 描述的表单结构
|
*/
|
@Prop({
|
type: Object,
|
default() {
|
return {};
|
},
|
})
|
private formSchema!: DFSchema;
|
|
/**
|
* UI schema 描述表单渲染
|
*/
|
@Prop({
|
type: Object,
|
default() {
|
return {};
|
},
|
})
|
private uiSchema!: DFUISchema;
|
|
/**
|
* 表单选项,未使用
|
*/
|
@Prop({
|
type: Object,
|
default() {
|
return {};
|
},
|
})
|
private formOption!: any;
|
|
/**
|
* 表单是否提交中
|
*/
|
@Prop({
|
type: Boolean,
|
default: false,
|
})
|
private submiting!: boolean;
|
|
private form: any = null;
|
|
private rootProperties: FormProperty[] = [];
|
|
private mounted() {
|
this.rootProperties = this.createRootProperties();
|
}
|
|
/**
|
* 创建属性
|
*/
|
private createRootProperties() {
|
const properties: any = this.formSchema.properties;
|
const rootProperties = Object.keys(properties)
|
.map((key: any) => {
|
const item = properties[key];
|
const uiItem = this.uiSchema[key];
|
return new FormProperty(key, item, uiItem, this.formSchema.required);
|
});
|
return rootProperties;
|
}
|
|
/**
|
* 表单提交
|
*/
|
private handleSubmit(e: any) {
|
e.preventDefault();
|
|
this.form.validateFieldsAndScroll((err: any, values: any) => {
|
if (err) {
|
return;
|
}
|
this.success(values);
|
});
|
|
}
|
|
@Emit('onSuccess')
|
private success(values: any) {
|
|
}
|
|
}
|
</script>
|