AIoT前端公共UI

Form.vue 2.6KB

    <!-- * @Author: Devin * @Date: 2022-11-15 11:23:35 * @LastEditors: Devin * @LastEditTime: 2023-02-22 14:51:28 * @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" :form-values="formValues" @change-event="changeEvent" @input-event="inputEvent" ></form-item> </el-col> <el-col></el-col> </el-row> </template> <!-- search --> <template v-else> <el-row :gutter="20"> <el-col v-for="(form, index) in forms" :key="index" :span="form['span'] || 6" > <form-item :form-item="form" :form-values="formValues" @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> </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<any>, default: () => [] }, formValues: { type: Object, default: () => {} }, formType: { type: String, default: () => 'form' } }); 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> <script lang="ts"> export default { name: 'CommonForm' }; </script> <style lang="scss" scoped> .row { margin-bottom: 20px; } .el-form-item { width: calc(100% - 24px); margin-top: 18px; } </style>