vue3 使用element-plus 封裝表單組件

form組件

<template>

? ? <el-form :model="ruleForm" :rules="rules" ref="ruleFormRef" label-width="150px">

? ? ? ? <el-row>

? ? ? ? ? ? <el-col v-for="(item, index) in fromTypeList" :key="index" :span="item.span">

? ? ? ? ? ? ? ? <el-form-item :label="item.label" :prop="item.isRequire ? item.valueKey : null">

? ? ? ? ? ? ? ? ? ? <!-- 單選 -->

? ? ? ? ? ? ? ? ? ? <el-radio-group :disabled="item.disabled ? true : false" v-if="item.type == 'radio'"

? ? ? ? ? ? ? ? ? ? ? ? v-model="ruleForm[item.valueKey]">

? ? ? ? ? ? ? ? ? ? ? ? <el-radio v-for="(dict, num) in item.options" :key="num" :value="dict.value">{{ dict.label

? ? ? ? ? ? ? ? ? ? ? ? ? ? }}</el-radio>

? ? ? ? ? ? ? ? ? ? </el-radio-group>

? ? ? ? ? ? ? ? ? ? <!-- 下拉框 -->

? ? ? ? ? ? ? ? ? ? <el-select v-else-if="item.type == 'select'" :disabled="item.disabled ? true : false"

? ? ? ? ? ? ? ? ? ? ? ? v-model="ruleForm[item.valueKey]" :placeholder="item.placeholder"

? ? ? ? ? ? ? ? ? ? ? ? @change="(val) => changeSelect(val, item)">

? ? ? ? ? ? ? ? ? ? ? ? <el-option v-for="(dict, num) in item.options" :key="num" :value="dict.value"

? ? ? ? ? ? ? ? ? ? ? ? ? ? :label="dict.label" />

? ? ? ? ? ? ? ? ? ? </el-select>

? ? ? ? ? ? ? ? ? ? <!-- 日期 -->

? ? ? ? ? ? ? ? ? ? <el-date-picker v-else-if="item.type == 'dateTime'" v-model="ruleForm[item.valueKey]"

? ? ? ? ? ? ? ? ? ? ? ? :disabled="item.disabled ? true : false" :format="item.format" :value-format="item.format"

? ? ? ? ? ? ? ? ? ? ? ? type="date" :placeholder="item.placeholder" style="width: 100%"

? ? ? ? ? ? ? ? ? ? ? ? @change="(event) => changeDate(event, item)" />

? ? ? ? ? ? ? ? ? ? <!-- 復(fù)選框 -->

? ? ? ? ? ? ? ? ? ? <el-checkbox-group v-else-if="item.type == 'checkBox'" v-model="ruleForm[item.valueKey]"

? ? ? ? ? ? ? ? ? ? ? ? :disabled="item.disabled ? true : false">

? ? ? ? ? ? ? ? ? ? ? ? <el-checkbox v-for="(dict, num) in item.options" :key="num" :value="dict.value" name="type">

? ? ? ? ? ? ? ? ? ? ? ? ? ? {{ dict.label }}

? ? ? ? ? ? ? ? ? ? ? ? </el-checkbox>

? ? ? ? ? ? ? ? ? ? </el-checkbox-group>

? ? ? ? ? ? ? ? ? ? <!-- 文本框 -->

? ? ? ? ? ? ? ? ? ? <el-input v-else-if="item.type == 'textarea'" type="textarea" :maxlength="item.maxlength"

? ? ? ? ? ? ? ? ? ? ? ? :show-word-limit="item.maxlength ? true : false" :disabled="item.disabled ? true : false"

? ? ? ? ? ? ? ? ? ? ? ? v-model.trim="ruleForm[item.valueKey]" :placeholder="item.placeholder">

? ? ? ? ? ? ? ? ? ? </el-input>

? ? ? ? ? ? ? ? ? ? <!-- 上傳附件 -->

? ? ? ? ? ? ? ? ? ? <div v-else-if="item.type == 'files'" style="width: 100%;">

? ? ? ? ? ? ? ? ? ? ? ? <upload-files v-model="ruleForm[item.valueKey]" :fileShowType="item.fileShowType"

? ? ? ? ? ? ? ? ? ? ? ? ? ? :disabled="item.disabled ? true : false"></upload-files>

? ? ? ? ? ? ? ? ? ? </div>

? ? ? ? ? ? ? ? ? ? <!-- 輸入框 -->

? ? ? ? ? ? ? ? ? ? <el-input v-else-if="item.type == 'activeInput'" :disabled="item.disabled ? true : false"

? ? ? ? ? ? ? ? ? ? ? ? v-model.trim="ruleForm[item.valueKey]" :placeholder="item.placeholder"

? ? ? ? ? ? ? ? ? ? ? ? @focus="(event) => focusClick(event, item)">

? ? ? ? ? ? ? ? ? ? ? ? <template #suffix v-if="item.icon">

? ? ? ? ? ? ? ? ? ? ? ? ? ? <el-icon class="el-input__icon" v-if="item.icon == 'ArrowDownBold'">

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <ArrowDownBold />

? ? ? ? ? ? ? ? ? ? ? ? ? ? </el-icon>

? ? ? ? ? ? ? ? ? ? ? ? </template>

? ? ? ? ? ? ? ? ? ? </el-input>

? ? ? ? ? ? ? ? ? ? <!-- 數(shù)字輸入框 -->

? ? ? ? ? ? ? ? ? ? <el-input-number :max="item.max" v-else-if="item.type == 'numberInput'" style="width: 100%;"

? ? ? ? ? ? ? ? ? ? ? ? :controls="false" :disabled="item.disabled ? true : false" v-model="ruleForm[item.valueKey]"

? ? ? ? ? ? ? ? ? ? ? ? :placeholder="item.placeholder" />

? ? ? ? ? ? ? ? ? ? <el-table v-else-if="item.type == 'table'" :data="item.dataSource" border>

? ? ? ? ? ? ? ? ? ? ? ? <el-table-column label="序號" width="100" align="center">

? ? ? ? ? ? ? ? ? ? ? ? ? ? <template #default="scope">

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {{ scope.$index + 1 }}

? ? ? ? ? ? ? ? ? ? ? ? ? ? </template>

? ? ? ? ? ? ? ? ? ? ? ? </el-table-column>

? ? ? ? ? ? ? ? ? ? ? ? <el-table-column v-for="(ele, nums) in item.columnList" :key="nums" :prop="ele.prop"

? ? ? ? ? ? ? ? ? ? ? ? ? ? :label="ele.label" :align="ele.align" :width="ele.width">

? ? ? ? ? ? ? ? ? ? ? ? ? ? <template #default="scope">

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <span v-if="ele.type == 'date'">

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {{ parseTime(scope.row[ele.prop], '{y}-{m}-u0z1t8os') }}

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? </span>

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <span v-else>{{ scope.row[ele.prop] }}</span>

? ? ? ? ? ? ? ? ? ? ? ? ? ? </template>

? ? ? ? ? ? ? ? ? ? ? ? </el-table-column>

? ? ? ? ? ? ? ? ? ? </el-table>

? ? ? ? ? ? ? ? ? ? <el-input v-else :disabled="item.disabled ? true : false" v-model.trim="ruleForm[item.valueKey]"

? ? ? ? ? ? ? ? ? ? ? ? :placeholder="item.placeholder">

? ? ? ? ? ? ? ? ? ? </el-input>

? ? ? ? ? ? ? ? </el-form-item>

? ? ? ? ? ? </el-col>

? ? ? ? </el-row>

? ? </el-form>

</template>

<script setup name="newFrom">

import { defineProps, ref } from 'vue'

const emit = defineEmits([])

const props = defineProps({

? ? fromList: {

? ? ? ? type: Array,

? ? ? ? default: [],

? ? },

? ? fromRules: {

? ? ? ? type: Object,

? ? ? ? default: () => { },

? ? }

})

console.log(props.fromList);

const { fromList: fromTypeList, fromRules: rules } = toRefs(reactive(props))

const data = reactive({

? ? ruleForm: {}

});

const { ruleForm } = toRefs(data);

const ruleFormRef = ref(null)

const submitFrom = () => {

? ? return ruleFormRef.value.validate((valid, fields) => {

? ? ? ? return valid

? ? })

}

const getData = () => {

? ? return ruleForm.value

}

function changeDate(val, item) {

? ? emit('updateData', { value: val, item: item })

}

function focusClick(event, item) {

? ? event.target.blur()

? ? emit('updateData', { value: event, item: item })

}

function changeSelect(val, item) {

? ? emit('updateData', { value: val, item: item })

}

function resetForm (){

? ? ruleFormRef.value.resetFields()

}

// 設(shè)置表單數(shù)據(jù)

function setFormData(data) {

? ? console.log(data);

? ? for (let key in data) {

? ? ? ? ruleForm.value[key] = data[key]

? ? }

}

defineExpose({ submitFrom, getData, setFormData, resetForm })

</script>

父組件使用

<template>

? ? ? <newFrom ref="newFromRef" :fromList="fromList" :fromRules="rules"></newFrom>

? ? ?<button @click="submit"></button>

</template>

<script setup>

const fromList = ref([

{ label: '表格1:', type: 'input', isRequire: true, span: 20, valueKey: 'aaaaa', placeholder: '密碼' }

])

const?rules = {

aaaaa: [{ required: true, message: '校驗信息', trigger: 'blur' }],

}

function?submit(){

接受檢驗的傳參ture通過校驗

const validate = await proxy.$refs.newFromRef.submitFrom()

}

</script>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容