vue3實現(xiàn)父組件提交校驗多個子組件
實現(xiàn)功能:在父組件提交事件中校驗多個子組件中的form
父組件:
<script setup lang="ts">
import {ref, reactive} from 'vue'
import childForm from './childForm.vue'
import childForm2 from './childForm2.vue'
let approvalRef = ref()
let approvalRef2 = ref()
let resultArr= reactive([])//存放子組件的數(shù)組
let errListMsg =ref("")//用來存儲錯誤提示
//這個方法是固定的,用來創(chuàng)建 Promise 實例,為多個組件校驗使用
const checkForm = (formChild) =>{
let result = new Promise((resolve,reject)=>{
formChild.validate((valid,fields)=>{
if (valid) {
console.log('submit');
resolve()
}else{
console.log('error');
Object.keys(fields).forEach((v,index)=>{
if (index==0) {
const PropName = fields[v][0].field
formChild.scrollToField(PropName)
errListMsg.value = fields[v][0].message
}
})
reject()
}
})
})
resultArr.push(result)
}
//提交按鈕事件
const taskFun = ()=>{
//獲取該子組件暴露出來的form 的 ref
const approvalRefChild = approvalRef.value.forms
const approvalRefChild2 = approvalRef2.value.ruleFormRef
//調(diào)用上面創(chuàng)建好的方法
checkForm(approvalRefChild)
checkForm(approvalRefChild2)
Promise.all(resultArr).then((results)=>{
console.log('這里是接口請求');
//校驗通過
}).catch(err=>{
//校驗不通過提示
console.log(errListMsg.value);
})
resultArr=[]//每次請求完要清空數(shù)組
errListMsg.value=""http://提示也需要清空
}
</script>
<template>
<childForm ref="approvalRef"></childForm>
<childForm2 ref="approvalRef2"></childForm2>
<button @click="taskFun">提交</button>
</template>子組件一:
這個是表格可以增刪改的情況,對表格添加輸入校驗
<script setup lang="ts">
import {ref, reactive} from 'vue'
import type { FormInstance } from 'element-plus'
const forms = ref<FormInstance>()
let info:any = reactive({
data:[{name:'1'}]
})
const formRules = reactive({
name: [{ required: true, message: '請輸入姓名', trigger: 'change' }],
role: [{ required: true, message: '請選擇', trigger: 'blur' }]
})
defineExpose({
forms
})
</script>
<template>
<el-form :model="info" ref="forms">
<el-table
ref="tableRef"
:data="info.data"
border>
<el-table-column align="center" property="name" label="*姓名">
<template #default="{row,$index}">
<el-form-item :prop="`data[${$index}].name`" :rules="formRules.name">
<el-input placeholder="請輸入姓名" v-model="info.data[$index].name" />
</el-form-item>
</template>
</el-table-column>
<el-table-column align="center" property="role" label="角色">
<template #default="{row,$index}">
<el-form-item :prop="`data[${$index}].role`" :rules="formRules.role">
<el-input placeholder="請輸角色" v-model="info.data[$index].role" />
</el-form-item>
</template>
</el-table-column>
</el-table>
</el-form>
</template>子組件二:
這個是普通的form表單情況
<template>
第二個組件
<el-form
ref="ruleFormRef"
:model="ruleForm"
:rules="rules"
label-width="120px"
class="demo-ruleForm"
:size="formSize"
status-icon
>
<el-form-item label="Activity name" prop="name">
<el-input v-model="ruleForm.name" />
</el-form-item>
</el-form>
</template>
<script lang="ts" setup>
import { reactive, ref } from 'vue'
import type { FormInstance, FormRules } from 'element-plus'
interface RuleForm {
name: string
}
const formSize = ref('default')
const ruleFormRef = ref<FormInstance>()
const ruleForm = reactive<RuleForm>({
name: 'Hello'
})
const rules = reactive<FormRules<RuleForm>>({
name: [
{ required: true, message: '請輸入Activity name', trigger: 'blur' },
{ min: 3, max: 5, message: '長度再3-5位', trigger: 'blur' },
]
})
defineExpose({ruleFormRef})
</script>注意:
1、子組件中的form要添加ref屬性,并使用defineExpose暴露出去,這樣父組件才能獲取到子組件中的ref,才能進行校驗
2、當對表格輸入內(nèi)容做校驗時prop和v-model綁定的是同一個才能校驗通過
3、當發(fā)現(xiàn)校驗一直不通過時可以查看控制臺打印的的結果,看哪個校驗沒通過
校驗不通過


到此這篇關于vue3實現(xiàn)父組件提交校驗多個子組件的文章就介紹到這了,更多相關vue3父組件校驗多個子組件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
VS-Code中Vue3項目創(chuàng)建vite方式
用戶詳細說明了使用Node.js和Vite創(chuàng)建Vue3項目的過程,包括安裝依賴、項目結構解析(如src/main.ts、App.vue、components、assets等),以及VSCode插件配置建議,強調(diào)核心插件安裝和依賴管理的重要性2025-08-08
vue嵌套路由與404重定向?qū)崿F(xiàn)方法分析
這篇文章主要介紹了vue嵌套路由與404重定向?qū)崿F(xiàn)方法,結合實例形式分析了vue.js嵌套路由與404重定向的概念、原理、實現(xiàn)步驟與相關操作技巧,需要的朋友可以參考下2018-05-05
Vue3使用video-player實現(xiàn)視頻播放
video-player是一個基于video.js的視頻播放器組件,本文主要介紹了Vue3使用video-player實現(xiàn)視頻播放,具有一定的參考價值,感興趣的可以了解一下2024-01-01
VScode更新后安裝vetur仍無法格式化vue文件的解決
這篇文章主要介紹了VScode更新后安裝vetur仍無法格式化vue文件的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10
解決antd日期選擇組件,添加value就無法點擊下一年和下一月問題
這篇文章主要介紹了解決antd日期選擇組件,添加value就無法點擊下一年和下一月問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
vue實現(xiàn)登錄數(shù)據(jù)的持久化的使用示例
在Vue.js中,實現(xiàn)登錄數(shù)據(jù)的持久化需要使用瀏覽器提供的本地存儲功能,Vue.js支持使用localStorage和sessionStorage來實現(xiàn)本地存儲,本文就來介紹一下如何實現(xiàn),感興趣的可以了解一下2023-10-10
Vue輸入框狀態(tài)切換&自動獲取輸入框焦點的實現(xiàn)方法
這篇文章主要介紹了Vue輸入框狀態(tài)切換&自動獲取輸入框焦點的實現(xiàn),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05

