基于element-plus封装一个表单组件
在components目录下新建一个Form.vue
javascript
<template>
<section class="form-wrap">
<el-form
:model="formDatas"
label-width="100"
label-position="right" ref="form"
:rules="rules">
<el-row :gutter="8">
<template v-for="item in propList" :key="item.id">
<el-col :span="8">
<el-form-item
v-if="item.show"
:key="item.id"
:prop="item.prop"
:label="item.label">
// input
<el-input
v-else="item.type == 'input'"
v-model="formDatas[item.prop]"
:placeholder="item.placeholder"
:disabled="item.disabled"
:style="{ width: item.width }"
clearable>
</el-input>
// select
<el-select
v-if="item.type == 'select'"
v-model="formDatas[item.prop]"
:placeholder="item.placeholder"
:style="{ width: item.width }"
clearable>
<el-option
v-for="option in item.options"
:label="option.label"
:value="option.value"
:key="option.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
</template>
</el-row>
// 插槽
<slot></slot>
</el-form>
</section>
</template>
<script setup>
import { ref, reactive, toRefs, inject, onMounted } from 'vue'
import { ElMessage } from 'element-plus'
const form = ref(null)
const emits = defineEmits(['close'])
const data = reactive({
formDatas: {}
})
// 因为是在Dialog组件中的 form 所以通过依赖注入的方式通信
// 解构注入的属性
const { title, formData, addData } = inject('formObj')
onMounted(() => {
const dataForm = formData
formDatas.value = dataForm
})
// 定义表单属性校验
const rules = reactive({
name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
username: [{ required: true, message: '请输入用户名', trigger: 'blur' }],
phone: [{ required: true, message: '请输入联系电话', trigger: 'blur' }]
})
const { formDatas } = toRefs(data)
// 表单验证
const formValidate = async () => {
await form.value.validate((valid, fields) => {
if (valid) {
const editFormData = formDatas.value
addData(editFormData)
if (title === '编辑') {
ElMessage({
message: '修改成功',
type: 'success',
})
} else {
ElMessage({
message: '新增成功',
type: 'success',
})
}
emits('close')
}
})
}
function resetForm() {
form.value.resetFields()
}
defineProps({
propList: Array,
formDatas: Object
})
defineExpose({
formValidate,
resetForm
})
</script>
<style lang="scss" scoped>
.form-wrap {
display: flex;
flex-direction: row;
flex-wrap: wrap;
padding: 5px;
}
</style>