feat(components): 新增通用表单和搜索组件
- 添加了 Forms 和 Search 组件 - Forms组件支持动态生成表单字段,包含输入框、下拉框等 - Search 组件支持动态生成搜索条件,包含输入框、下拉框、日期选择框等- 在 main.js 中全局注册了这两个组件 Signed-off-by: 1iyc <5212514+liycone@user.noreply.gitee.com>main
parent
00ae5a8a61
commit
6cf1c43eb0
@ -0,0 +1,107 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<el-form :model="formModel" :rules="rules" ref="formRef" label-width="120px">
|
||||||
|
<el-form-item
|
||||||
|
v-for="(field, index) in formFields"
|
||||||
|
:key="index"
|
||||||
|
:label="field.label"
|
||||||
|
:prop="field.prop"
|
||||||
|
:required="field.required"
|
||||||
|
>
|
||||||
|
<component
|
||||||
|
:is="getComponentType(field.type)"
|
||||||
|
v-bind="field"
|
||||||
|
v-model="formModel[field.prop]"
|
||||||
|
:placeholder="field.placeholder"
|
||||||
|
>
|
||||||
|
<!-- 下拉框选项 -->
|
||||||
|
<el-option
|
||||||
|
v-if="field.type === 'select'"
|
||||||
|
v-for="option in field.options"
|
||||||
|
:key="option.value"
|
||||||
|
:label="option.label"
|
||||||
|
:value="option.value"
|
||||||
|
></el-option>
|
||||||
|
</component>
|
||||||
|
</el-form-item>
|
||||||
|
|
||||||
|
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" @click="submitForm">提交</el-button>
|
||||||
|
<el-button @click="resetForm">重置</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
formFields: {
|
||||||
|
type: Array,
|
||||||
|
required: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
formModel: {},
|
||||||
|
rules: {}
|
||||||
|
};
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.initFormModel();
|
||||||
|
this.initRules();
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
getComponentType(type) {
|
||||||
|
switch (type) {
|
||||||
|
case 'input':
|
||||||
|
return 'el-input';
|
||||||
|
case 'select':
|
||||||
|
return 'el-select';
|
||||||
|
case 'textarea':
|
||||||
|
return 'el-input';
|
||||||
|
case 'button':
|
||||||
|
return 'el-button';
|
||||||
|
default:
|
||||||
|
return 'el-input';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
initFormModel() {
|
||||||
|
this.formModel = this.formFields.reduce((acc, field) => {
|
||||||
|
acc[field.prop] = '';
|
||||||
|
return acc;
|
||||||
|
}, {});
|
||||||
|
},
|
||||||
|
initRules() {
|
||||||
|
this.rules = this.formFields.reduce((acc, field) => {
|
||||||
|
if (field.rules) {
|
||||||
|
acc[field.prop] = field.rules;
|
||||||
|
}
|
||||||
|
return acc;
|
||||||
|
}, {});
|
||||||
|
},
|
||||||
|
submitForm() {
|
||||||
|
this.$refs.formRef.validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
this.$emit('submit', this.formModel);
|
||||||
|
} else {
|
||||||
|
console.log('表单验证失败!');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
resetForm() {
|
||||||
|
this.$refs.formRef.resetFields();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.el-form {
|
||||||
|
width: 100%;
|
||||||
|
max-width: 600px;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
</style>
|
@ -0,0 +1,84 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
|
||||||
|
<el-form-item
|
||||||
|
v-for="(field, index) in searchFields"
|
||||||
|
:key="index"
|
||||||
|
:label="field.label"
|
||||||
|
:prop="field.prop"
|
||||||
|
>
|
||||||
|
<component
|
||||||
|
:is="getComponentType(field.type)"
|
||||||
|
v-model="queryParams[field.prop]"
|
||||||
|
:placeholder="field.placeholder"
|
||||||
|
:clearable="field.clearable"
|
||||||
|
:style="field.style"
|
||||||
|
@keyup.enter.native="handleQuery"
|
||||||
|
>
|
||||||
|
<!-- 下拉框选项 -->
|
||||||
|
<el-option
|
||||||
|
v-if="field.type === 'select'"
|
||||||
|
v-for="option in field.options"
|
||||||
|
:key="option.value"
|
||||||
|
:label="option.label"
|
||||||
|
:value="option.value"
|
||||||
|
/>
|
||||||
|
</component>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
||||||
|
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
props: {
|
||||||
|
searchFields: {
|
||||||
|
type: Array,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
queryParams: {
|
||||||
|
type: Object,
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
showSearch: {
|
||||||
|
type: Boolean,
|
||||||
|
default: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
getComponentType(type) {
|
||||||
|
switch (type) {
|
||||||
|
case 'input':
|
||||||
|
return 'el-input';
|
||||||
|
case 'select':
|
||||||
|
return 'el-select';
|
||||||
|
case 'datePicker':
|
||||||
|
return 'el-date-picker';
|
||||||
|
default:
|
||||||
|
return 'el-input';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
handleQuery() {
|
||||||
|
this.$refs.queryForm.validate(valid => {
|
||||||
|
if (valid) {
|
||||||
|
// 处理查询逻辑
|
||||||
|
console.log('查询参数:', this.queryParams);
|
||||||
|
} else {
|
||||||
|
console.log('验证失败');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
resetQuery() {
|
||||||
|
this.$refs.queryForm.resetFields();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
/* 添加一些样式 */
|
||||||
|
</style>
|
Loading…
Reference in New Issue