static

AiotForm.vue 3.4KB

    <!-- * @Author: Devin * @Date: 2022-11-15 11:23:35 * @LastEditors: Devin * @LastEditTime: 2023-01-11 14:34:53 * @Description: ts工程开发 --> <template> <el-form ref="ruleFormRef" :inline="true" label-width="auto"> <!--form--> <template v-if="formType === 'form'"> <el-row class="row" :gutter="20"> <el-col v-for="(form, index) in forms" :key="index" :span="form?.['span'] || 12" > <form-item :form-item="form" @change-event="changeEvent" @input-event="inputEvent" ></form-item> </el-col> <el-col></el-col> </el-row> </template> <!-- 1. 搜索项 forms.length < 4, 展示搜索和重置按钮 2. 搜索项forms.length >= 4, 按钮展示更多,并首行只展示3个搜索项,其余收起; --> <!-- search --> <template v-else> <el-row :gutter="20"> <template v-if="showSearch"> <el-col v-for="formItem in forms" :key="formItem['name']" :span="formItem['col']" > <form-item :form-item="formItem" @change-event="changeEvent" @input-event="inputEvent" ></form-item> </el-col> <el-col :span="6" class="form-last-btn-col"> <el-form-item class="form-last-btns"> <slot name="btns"></slot> </el-form-item> </el-col> </template> <template v-else> <!-- 收起 --> <el-col v-for="formItem in forms.slice(0, 3)" :key="formItem['name']" :span="formItem['col']" > <form-item :form-item="formItem" @change-event="changeEvent" @input-event="inputEvent" ></form-item> </el-col> <el-col :span="6"> <el-form-item class="form-last-btns"> <slot name="btns"></slot> </el-form-item> </el-col> </template> </el-row> </template> </el-form> </template> <script lang="ts" setup> import { ref } from 'vue'; import type { FormInstance } from 'element-plus'; import FormItem from './FormItem.vue'; defineProps({ forms: { type: Array, default: () => [] }, formType: { type: String, default: () => 'form' }, // 是否隐藏筛选项 showSearch: { type: Boolean, default: () => false } }); const emits = defineEmits(['changeEvent', 'blurEvent']); const enteredNum = ref(0); const isTextarea = ref(false); const surplusNum = ref(0); // 触发change事件 const changeEvent = (form: any) => { emits('changeEvent', form); }; function inputEvent(form: any) { if (form?.type === 'input') { if (form?.attrs?.type === 'textarea' && form?.attrs?.maxlength > 0) { enteredNum.value = form.value?.length || 0; isTextarea.value = true; surplusNum.value = Number(form.attrs?.maxlength) - Number(enteredNum.value); } } } // 校验规则 const ruleFormRef = ref<FormInstance>(); function checkRules() { ruleFormRef.value.validate((valid) => { if (valid) { return true; } return false; }); } defineExpose({ ruleFormRef, checkRules }); </script> <style lang="scss" scoped> .row { margin-bottom: 20px; } .el-form-item { width: calc(100% - 24px); margin-top: 18px; } .form-last-btn-col { margin-left: auto; } </style>