如上:
數據源和格式化分別在不同的兩個子組件中,同時引用在了父組件中,需要在父組件中點擊確定按鈕時,校驗父組件及兩個子組件中的表單是否均滿足校驗。
使用el-form的:rules="rules"結合this.$refs[formName].validate((valid) => {}來做。
實現代碼:
1.父組件設置rules規則,然后傳入每個子組件:
引用子組件
<!-- 數據源 --> <div class="data_source"> <Com-template-data-source ref="ComTemplateDataSourceRef" :rules="rules" :component-type="componentType" :sourceType="sourceType" /> </div> <!-- 格式化 --> <div class="formatting"> <div class="top_title">格式化</div> <Com-template-format ref="ComTemplateFormatRef" :rules="rules" :component-type="componentType" /> </div>
父組件中設置rules規則
rules: { componentName: [ // 組件名稱 { required: true, message: "請輸入組件名稱", trigger: "blur" }, ], reportId: [ // 報表id { required: true, message: "請選擇報表id", trigger: "blur" }, ], groupOne: [ // 一級分組 { required: true, message: "請選擇一級分組", trigger: "blur" }, ], valueData: [ // 統計值 { required: true, message: "請選擇統計值", trigger: "blur" }, ], unit: [ // 顯示單位 { required: true, message: "請選擇顯示單位", trigger: "blur" }, ], sortingCondition: [ // 排序條件 { required: true, message: "請選擇排序條件", trigger: "blur" }, ], },
2.在父組件中點擊確定時判斷是否均滿足校驗:
// 當前彈框form校驗 const p1 = new Promise((resolve, reject) => { this.$refs["form"].validate((valid) => { if (valid) resolve(); }); }); // 數據源組件form校驗 const p2 = new Promise((resolve, reject) => { this.$refs["ComTemplateDataSourceRef"].$refs["form"].validate( (valid) => { if (valid) resolve(); } ); }); // 格式化組件form校驗 const p3 = new Promise((resolve, reject) => { this.$refs["ComTemplateFormatRef"].$refs["form"].validate((valid) => { if (valid) resolve(); }); }); Promise.all([p1, p2, p3]).then(async () => { // 做處理 });
注意:
1.在elementui中只有對一個表單的校驗,當對多個表單校驗且屬於不同的組件中時,可以采用上述辦法,通過refs獲取到對應的子組件,然后在el-form中設置ref="form",在獲取到子組件時再通過refs獲取到組件中的form表單,即可判斷是否滿足校驗規則了。
2.其實不分為多個子組件來寫也是可以的,這樣可以直接在一個form中做校驗,但是由於考慮到數據操作方法過多,會比較不好維護辨認,所以分離出多個子組件來做。
2.設置校驗需要幾部分::rules="rules"、ref="form"、prop="name"、this.$refs[formName].validate((valid)。
3.參考博客:https://www.cnblogs.com/junechen/p/11005324.html