赞
踩
今天遇到的需求是做一个添加试题的功能,于是用了表单。
然后因为我需要每一个块内都有删除可以删除对应模块。所以根据文档的那种循环没法弄。
就直接把from表单循环了。后来就发现循环表单的话用官网的验证方法怎么都不生效,要不就是报错,然后网上也没找到,因为百度我看着都是循环的el-from-item的,没有直接循环from的
所以跟我的都不适用。我就自己慢慢琢磨出来了写法,记录一下
1,prop的名字一定要和你的下面input的model变量名一样。不然就会出现你不管填不填值都有提示显示,因为检测不到。这个坑了我好久。
2,验证功能思路:因为把from放在了循环内。所以直接用官网的方法会分不清是哪一个的。因为返回的是一个数组就会报错,所以当我们用this.$refs[formName][0].validate((valid) => {}时可以验证到数组内的第一个,但是这样就会一直验证第一个也就是角标0的那一条。其他的不验证。所以我用循环直接每一条都验证一遍,这里的n是用来计数的,因为如果没有n的话他第一条验证通过了之后直接就会执行成功的方法,这不对,应该所有的全部验证通过才执行,所以我再每次验证成功的时候就n+1。然后通过判断如果n也就是成功的次数和循环的数组长度一致就代表全部验证成功。那就执行方法。而我们每次都会点击提交,触发后n就会=0,所以也不用担心会一直加下去的情况,必须要点击一次循环全部成功,才可能对上。
<template class="judge_wrap"> <div> <div class="judge" @click="dialogFormVisible = true">判断题</div> <el-dialog title="选择题" :visible.sync="dialogFormVisible" :modal="false" top="3vh" width="600px" > <div style="border-bottom: 1px #ccc solid; margin-bottom: 25px"> <el-button type="primary" icon="el-icon-circle-plus-outline" class="from_btn" @click="addTopic" >新增题目</el-button > </div> <div class="dialog_height"> <div class="from_box" v-for="(item, index) in topicList" :key="index"> <el-form :model="item.dynamicValidateForm" ref="dynamicValidateForm" label-width="100px" class="demo-dynamic" :rules="rules" > <el-form-item prop="title" label="题目"> <el-input v-model="item.dynamicValidateForm.title" style="width: 320px" ></el-input> </el-form-item> <el-form-item label="选项"> <el-input :disabled="true" v-model="item.dynamicValidateForm.domain[0]" style="width: 320px" ></el-input> </el-form-item> <el-form-item label="选项"> <el-input :disabled="true" v-model="item.dynamicValidateForm.domain[1]" style="width: 320px" ></el-input> </el-form-item> <el-form-item label="正确答案" prop="answer"> <el-radio-group v-model="item.dynamicValidateForm.answer"> <el-radio label="正确"></el-radio> <el-radio label="错误"></el-radio> </el-radio-group> </el-form-item> <el-form-item> <el-button type="danger" icon="el-icon-delete" @click="remove_dom(item)" >删除题目</el-button > </el-form-item> </el-form> </div> </div> <div slot="footer" class="dialog-footer"> <el-button @click="dialogFormVisible = false">取 消</el-button> <el-button type="primary" @click="submitForm('dynamicValidateForm')" >提 交</el-button > </div> </el-dialog> </div> </template> <script> export default { data() { return { //弹框显示隐藏 dialogFormVisible: false, //选项值 topicList: [ { key: Date.now(), dynamicValidateForm: { domain: ["正确", "错误"], title: "", answer: "", }, }, ], rules: { title: [{ required: true, message: "请输入题目", trigger: "blur" }], answer: [ { required: true, message: "请选择活动资源", trigger: "change" }, ], }, }; }, methods: {, //提交按钮 submitForm(formName) { let n=0 this.topicList.forEach((item, index) => { this.$refs[formName][index].validate((valid) => { if (valid) { n++ if(n==this.topicList.length){ alert('提交成功') } } else { console.log("error submit!!"); return false; } }); }); }, }, }; </script> <style scoped lang='scss'> .judge { width: 300px; height: 200px; margin: auto; margin-top: 180px; text-align: center; line-height: 200px; font-size: 38px; color: #fff; font-weight: bold; border-radius: 30px; cursor: pointer; margin-bottom: 25px; box-shadow: 0px 0px 15px 5px #97d9e1; background-image: linear-gradient(#32cbc6, #2d94a7); } .judge:hover { background-image: linear-gradient(#0093e9, #2d94a7); box-shadow: 0px 0px 15px 5px #0093e9; } .from_box { border-bottom: 1px #ccc solid; margin-bottom: 20px; } .from_btn { margin-left: 410px; margin-bottom: 5px; } .dialog_height { height: 430px; overflow: auto; } </style> <style > .judge_wrap .el-dialog { border-radius: 20px; } </style>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。