mirror of
https://gitee.com/dromara/mayfly-go
synced 2025-11-03 07:50:25 +08:00
213 lines
5.8 KiB
Vue
Executable File
213 lines
5.8 KiB
Vue
Executable File
<template>
|
||
<div class="dynamic-form">
|
||
<el-form
|
||
:model="form"
|
||
ref="dynamicForm"
|
||
:label-width="formInfo.labelWidth ? formInfo.labelWidth : '100px'"
|
||
:size="formInfo.size ? formInfo.size : 'small'"
|
||
>
|
||
<el-row v-for="fr in formInfo.formRows" :key="fr.key">
|
||
<el-col v-for="item in fr" :key="item.key" :span="item.span ? item.span : 24 / fr.length">
|
||
<el-form-item :prop="item.name" :label="item.label" :label-width="item.labelWidth" :required="item.required" :rules="item.rules">
|
||
<!-- input输入框 -->
|
||
<el-input
|
||
v-if="item.type === 'input'"
|
||
v-model.trim="form[item.name]"
|
||
:placeholder="item.placeholder"
|
||
:type="item.inputType"
|
||
clearable
|
||
|
||
@change="item.change ? item.change(form) : ''"
|
||
></el-input>
|
||
|
||
<!-- 普通文本信息(可用于不可修改字段等) -->
|
||
<span v-else-if="item.type === 'text'">{{ form[item.name] }}</span>
|
||
|
||
<!-- select选择框 -->
|
||
<!-- optionProps.label: 指定option中的label为options对象的某个属性值,默认就是label字段 -->
|
||
<!-- optionProps.value: 指定option中的value为options对象的某个属性值,默认就是value字段 -->
|
||
<el-select
|
||
v-else-if="item.type === 'select'"
|
||
v-model.trim="form[item.name]"
|
||
:placeholder="item.placeholder"
|
||
:filterable="item.filterable"
|
||
:remote="item.remote"
|
||
:remote-method="item.remoteMethod"
|
||
@focus="item.focus ? item.focus(form) : ''"
|
||
clearable
|
||
:disabled="item.updateDisabled && form.id != null"
|
||
style="width: 100%"
|
||
>
|
||
<el-option
|
||
v-for="i in item.options"
|
||
:key="i.key"
|
||
:label="i[item.optionProps ? item.optionProps.label || 'label' : 'label']"
|
||
:value="i[item.optionProps ? item.optionProps.value || 'value' : 'value']"
|
||
></el-option>
|
||
</el-select>
|
||
</el-form-item>
|
||
</el-col>
|
||
</el-row>
|
||
|
||
<el-row type="flex" justify="center">
|
||
<slot name="btns" :submitDisabled="submitDisabled" :data="form" :submit="submit">
|
||
<el-button @click="reset" size="mini">重 置</el-button>
|
||
<el-button type="primary" @click="submit" size="mini">保 存</el-button>
|
||
</slot>
|
||
</el-row>
|
||
</el-form>
|
||
</div>
|
||
</template>
|
||
|
||
<script lang="ts">
|
||
import { watch, ref, toRefs, reactive, onMounted, defineComponent } from 'vue';
|
||
import { ElMessage } from 'element-plus';
|
||
|
||
export default defineComponent({
|
||
name: 'DynamicForm',
|
||
|
||
props: {
|
||
formInfo: { type: Object },
|
||
formData: { type: [Object, Boolean] },
|
||
},
|
||
|
||
setup(props: any, context) {
|
||
const dynamicForm: any = ref();
|
||
const state = reactive({
|
||
form: {},
|
||
submitDisabled: false,
|
||
});
|
||
|
||
watch(props.formData, (newValue, oldValue) => {
|
||
if (props.formData) {
|
||
state.form = { ...props.formData };
|
||
}
|
||
});
|
||
|
||
const submit = () => {
|
||
dynamicForm.value.validate((valid: boolean) => {
|
||
if (valid) {
|
||
// 提交的表单数据
|
||
const subform = { ...state.form };
|
||
const operation = state.form['id'] ? props.formInfo['updateApi'] : props.formInfo['createApi'];
|
||
if (operation) {
|
||
state.submitDisabled = true;
|
||
operation.request(state.form).then(
|
||
(res: any) => {
|
||
ElMessage.success('保存成功');
|
||
context.emit('submitSuccess', subform);
|
||
state.submitDisabled = false;
|
||
// this.cancel()
|
||
},
|
||
(e: any) => {
|
||
state.submitDisabled = false;
|
||
}
|
||
);
|
||
} else {
|
||
ElMessage.error('表单未设置对应的提交权限');
|
||
}
|
||
} else {
|
||
return false;
|
||
}
|
||
});
|
||
};
|
||
|
||
const reset = () => {
|
||
context.emit('reset');
|
||
resetFieldsAndData();
|
||
};
|
||
|
||
/**
|
||
* 重置表单以及表单数据
|
||
*/
|
||
const resetFieldsAndData = () => {
|
||
// 对整个表单进行重置,将所有字段值重置为初始值并移除校验结果
|
||
const df: any = dynamicForm;
|
||
df.resetFields();
|
||
// 重置表单数据
|
||
state.form = {};
|
||
};
|
||
|
||
return {
|
||
...toRefs(state),
|
||
dynamicForm,
|
||
submit,
|
||
reset,
|
||
resetFieldsAndData,
|
||
};
|
||
},
|
||
});
|
||
// @Component({
|
||
// name: 'DynamicForm'
|
||
// })
|
||
// export default class DynamicForm extends Vue {
|
||
// @Prop()
|
||
// formInfo: object
|
||
// @Prop()
|
||
// formData: [object,boolean]|undefined
|
||
|
||
// form = {}
|
||
// submitDisabled = false
|
||
|
||
// @Watch('formData', { deep: true })
|
||
// onRoleChange() {
|
||
// if (this.formData) {
|
||
// this.form = { ...this.formData }
|
||
// }
|
||
// }
|
||
|
||
// submit() {
|
||
// const dynamicForm: any = this.$refs['dynamicForm']
|
||
// dynamicForm.validate((valid: boolean) => {
|
||
// if (valid) {
|
||
// // 提交的表单数据
|
||
// const subform = { ...this.form }
|
||
// const operation = this.form['id']
|
||
// ? this.formInfo['updateApi']
|
||
// : this.formInfo['createApi']
|
||
// if (operation) {
|
||
// this.submitDisabled = true
|
||
// operation.request(this.form).then(
|
||
// (res: any) => {
|
||
// ElMessage.success('保存成功')
|
||
// this.$emit('submitSuccess', subform)
|
||
// this.submitDisabled = false
|
||
// // this.cancel()
|
||
// },
|
||
// (e: any) => {
|
||
// this.submitDisabled = false
|
||
// }
|
||
// )
|
||
// } else {
|
||
// ElMessage.error('表单未设置对应的提交权限')
|
||
// }
|
||
// } else {
|
||
// return false
|
||
// }
|
||
// })
|
||
// }
|
||
|
||
// reset() {
|
||
// this.$emit('reset')
|
||
// this.resetFieldsAndData()
|
||
// }
|
||
|
||
// /**
|
||
// * 重置表单以及表单数据
|
||
// */
|
||
// resetFieldsAndData() {
|
||
// // 对整个表单进行重置,将所有字段值重置为初始值并移除校验结果
|
||
// const df: any = this.$refs['dynamicForm']
|
||
// df.resetFields()
|
||
// // 重置表单数据
|
||
// this.form = {}
|
||
// }
|
||
|
||
// mounted() {
|
||
// // 组件可能还没有初始化,第一次初始化的时候无法watch对象
|
||
// this.form = { ...this.formData }
|
||
// }
|
||
|
||
// }
|
||
</script>
|