Files
xzlz_ksWeb/src/components/aboutTable/FormMessage.vue

200 lines
8.3 KiB
Vue
Raw Normal View History

2025-07-16 19:49:47 +08:00
<template>
<el-form ref="elform" :model="listQuery" :disabled="disabled" :label-width="props.labelWidth" :rules="props.rules"
:inline="true" label-position="right">
<div class="form-row" v-for="(child, idx) in props.formList" :key="idx"
:style="{ width: Object.prototype.toString.call(child) === '[object Object]' ? child.width : '' }">
<template v-if="Array.isArray(child)">
<el-form-item v-for="(item, childIdx) in child" :key="childIdx" :prop="item.prop" :label="item.label"
:label-width="item.labelWidth" :style="{ width: child.width }">
<!-- input表单 input lx:textarea || number-->
<MOSTY.Other v-if="item.type == 'input'" :type="item.lx" :rows="item.rows || 4" width="100%" clearable
v-model="listQuery[item.prop]" :placeholder="`请输入${item.label}`" />
<!-- 数值 number-->
<el-input-number v-else-if="item.type == 'number'" @change="handleNum" v-model="listQuery[item.prop]"
style="width:100%" :min="item.min || 0" :max="item.max || 1000" />
<!--选择 select-->
<MOSTY.Select v-else-if="item.type == 'select'" @change="handleNum" filterable :multiple="item.multiple"
v-model="listQuery[item.prop]" :dictEnum="item.options" width="100%" clearable
:placeholder="`请选择${item.label}`" />
<!-- 选择性别 -->
<MOSTY.Sex v-else-if="item.type == 'Sex'" v-model:sex="listQuery[item.prop]" width="100%" clearable
:placeholder="`请选择${item.label}`" />
<!--其他类型other lxEDUCATION文化程度NATION民族-->
<MOSTY.PackageSelect v-else-if="item.type == 'other'" :dictEnum="item.lx" width="100%"
v-model="listQuery[item.prop]" clearable filterable />
<!-- 部门department -->
<MOSTY.Department style="width:100%" v-else-if="item.type === 'department'" clearable :placeholder="listQuery.ssbm ? listQuery.ssbm : `请选择${item.label}`"
v-model="listQuery[item.prop]" />
<!-- 时间选择 type: date/time/datetime/datetimerange/daterange-->
<MOSTY.Date v-else-if="item.type == 'date'" :type="item.lx ? item.lx : 'date'" width="100%" clearable
v-model="listQuery[item.prop]" />
<!-- 上传 upload limit:'限制张数'-->
<MOSTY.Upload v-else-if="item.type == 'upload'" :isImg="item.isImg" :limit="item.limit" width="100%"
v-model="listQuery[item.prop]" />
<!--选择checkbox -->
<MOSTY.CheckBox v-else-if="item.type == 'checkbox'" width="100%" clearable v-model="listQuery[item.prop]"
:checkList="item.options" :placeholder="`请选择${item.label}`" />
<!-- 单选radio -->
<el-radio-group v-else-if="item.type == 'radio'" v-model="listQuery[item.prop]">
<el-radio v-for="obj in item.options" :key="obj.value" :label="obj.value">{{ obj.label }}</el-radio>
</el-radio-group>
<!-- 开关 switch -->
<el-switch v-else-if="item.type == 'switch'" v-model="listQuery[item.prop]" class="ml-2"
style="--el-switch-on-color: #13ce66; --el-switch-off-color: #ff4949" />
<!-- 日期段选择器 -->
<el-date-picker v-else-if="item.type === 'daterange'" v-model="searchObj[item.prop]" type="daterange"
unlink-panels :range-separator="item.rangeSeparator" :start-placeholder="item.startPlaceholder"
:end-placeholder="item.endPlaceholder" :shortcuts="item.shortcuts" value-format="YYYY-MM-DD" />
<el-date-picker v-else-if="item.type == 'datetime'" v-model="searchObj[item.prop]" type="datetime"
value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择时间" />
<el-date-picker v-else-if="item.type === 'date'" v-model="searchObj[item.prop]" type="date"
:placeholder="item.placeholder" :shortcuts="item.shortcuts" value-format="YYYY-MM-DD">
</el-date-picker>
<!-- 插槽 slot -->
<template v-else-if="item.type === 'slot'">
<slot :name="item.prop"></slot>
</template>
</el-form-item>
</template>
<template v-else>
<el-form-item v-if="child.type != 'slot'" :prop="child.prop" :label="child.label"
:style="{ width: child.width }">
<!-- input表单 input lx:textarea || number-->
<MOSTY.Other v-if="child.type == 'input'" :type="child.lx" :rows="child.rows || 4" width="100%" clearable
v-model="listQuery[child.prop]" :placeholder="`请输入${child.label}`" />
<!-- 数值 number-->
<el-input-number v-else-if="child.type == 'number'" @change="handleNum" v-model="listQuery[child.prop]"
style="width:100%" :min="child.min || 0" :max="child.max || 1000" />
<!--选择 select-->
<MOSTY.Select v-else-if="child.type == 'select'" @change="handleNum" filterable :multiple="child.multiple"
v-model="listQuery[child.prop]" :dictEnum="child.options" width="100%" clearable
:placeholder="`请选择${child.label}`" />
<!-- 部门department -->
<MOSTY.Department style="width:100%" v-else-if="child.type === 'department'" clearable
v-model="listQuery[child.prop]" />
<!-- 时间选择 type: date/time/datetime/datetimerange/daterange-->
<MOSTY.Date v-else-if="child.type == 'date'" :type="child.lx ? child.lx : 'date'" width="100%" clearable
v-model="listQuery[child.prop]" />
<!-- 上传 upload limit:'限制张数'-->
<MOSTY.Upload v-else-if="child.type == 'upload'" :isImg="child.isImg" :limit="child.limit" width="100%"
v-model="listQuery[child.prop]" />
<!--选择checkbox -->
<MOSTY.CheckBox v-else-if="child.type == 'checkbox'" width="100%" clearable v-model="listQuery[child.prop]"
:checkList="child.options" :placeholder="`请选择${child.label}`" />
<!-- 单选radio -->
<el-radio-group v-else-if="child.type == 'radio'" v-model="listQuery[child.prop]">
<el-radio v-for="obj in child.options" :key="obj.value" :label="obj.value">{{ obj.label }}</el-radio>
</el-radio-group>
<!-- 开关 switch -->
<el-switch v-else-if="child.type == 'switch'" v-model="listQuery[child.prop]" class="ml-2"
style="--el-switch-on-color: #13ce66; --el-switch-off-color: #ff4949" />
</el-form-item>
<!-- 插槽 slot -->
<template v-if="child.type === 'slot'">
<slot></slot>
</template>
</template>
</div>
</el-form>
</template>
<script setup>
import * as MOSTY from "@/components/MyComponents/index";
import { ref, defineProps, defineEmits, defineExpose, watch } from "vue";
const props = defineProps({
//循环的值
formList: {
default: [[]], //二维数组
type: Array
},
rules: {
default: {},
type: Object
},
labelWidth: {
default: "100px",
type: String
},
disabled: {
type: Boolean,
default: false
},
modelValue: {
type: Object,
default: {}
},
});
const elform = ref();
const listQuery = ref({});
const emits = defineEmits(["update:modelValue", 'change']);
// 提交
const submit = (resfun) => {
elform.value.validate((valid) => {
if (!valid) return false;
resfun(listQuery.value);
});
};
const reset = () => {
listQuery.value = {};
elform.value.resetFields();
};
// // 处理表单数据变化
const handleNum = (val) => {
emits('change', listQuery.value);
};
watch(() => props.modelValue, (newVal) => {
listQuery.value = newVal; //赋值
}, { immediate: true, deep: true });
watch(() => listQuery.value, (newVal) => {
emits('update:modelValue', newVal)
}, { immediate: true, deep: true });
defineExpose({ submit, reset });
</script>
<style lang="scss" scoped>
:deep(.el-form-item__label) {
// background-color: #F7FAFB;
// padding: 0px 8px;
// color: #000;
// font-weight: 500;
// border: 1px solid #E3E7ED;
}
.form-row {
width: 100%;
display: flex;
color: #333;
.el-form-item {
flex: 1;
}
}
.upload-group {
display: flex;
.el-form-item {
flex: 1;
}
}
::v-deep .el-input__inner {
height: 36px !important;
line-height: 36px !important;
border-radius: 0;
color: #777575;
}
::v-deep .el-textarea__inner {
border-radius: 0;
}
.el-form-item--default {
// margin-bottom: 0px;
}
</style>