当前位置:   article > 正文

vue element-ui 表单验证 第一次表单验证的结果,在第二次表单验证时仍然存在(需要清除上一次的验证结果)_初次未填写校验不通过后填写数据未清空校验提示

初次未填写校验不通过后填写数据未清空校验提示

首先我们还是看一下文章:https://blog.csdn.net/weixin_37930716/article/details/90234705  的内容

笔者在参考该文章的时候,踩了一个坑,是vue父子组件通信中使用ref传参的问题!

关键点:

该文章的作者的弹框组件是和父组件写在同一个vue文件里的,也就是没有单独把弹框的页面代码写在另一个vue文件里。这样在父子组件通信的时候其实只有两级通信,如果写在单独的一个vue文件里,实际上就是三级通信。

清除上一次验证结果的代码就应该是:

  1. if (this.$refs.子组件名称.$refs.editForm)
  2. this.$refs.子组件名称.$refs.editForm.resetFields();

完整的案例展示:

代码1:对话框和父组件的页面代码是在同一个vue文件里

  1. <template>
  2. <basic-container>
  3. <el-row>
  4. <el-col :span="22"></el-col
  5. ><el-col :span="2"
  6. ><el-button type="primary" round @click="handleAddDialogOpen"
  7. >添加</el-button
  8. ></el-col
  9. >
  10. </el-row>
  11. <el-dialog
  12. title="测试对话框"
  13. top="200px"
  14. width="40%"
  15. :fullscreen="false"
  16. :visible.sync="visible"
  17. :close-on-click-modal="true"
  18. >
  19. <el-row
  20. ><el-form :model="test" ref="refdata"
  21. ><el-form-item
  22. label="测试输入框"
  23. prop="testinput"
  24. :rules="[{ required: true, message: '不能为空' }]"
  25. ><el-input v-model="test.testinput"></el-input></el-form-item
  26. ></el-form>
  27. </el-row>
  28. </el-dialog>
  29. </basic-container>
  30. </template>

 此时只有两级通信,在【添加】按钮点击事件中添加如下代码即可:

  1. handleAddDialogOpen() {
  2. if (this.$refs.refdata) {
  3. this.$refs.refdata.clearValidate();
  4. }
  5. this.visible = true;
  6. },

 代码2:对话框是单独的一个vue文件,和父组件不是在同一个vue文件里

【添加】按钮所在的 父组件的代码(简单示意)

  1. <template>
  2. <basic-container>
  3. <el-row>
  4. <el-col :span="22"></el-col
  5. ><el-col :span="2"
  6. ><el-button type="primary" round @click="handleAddDialogOpen"
  7. >添加</el-button
  8. ></el-col
  9. >
  10. </el-row>
  11. <testDialog ref="testDlg"> </testDialog>
  12. </basic-container>
  13. </template>
  14. <script>
  15. import testDialog from "./testDialog";
  16. export default {
  17. components: { testDialog }
  18. data() {
  19. return {
  20. ... //此处省略
  21. }
  22. },
  23. methods: {
  24. handleAddDialogOpen(row) {
  25. ...//此处省略
  26. }
  27. }
  28. }
  29. </script>

 testDialog 对话框子组件的另一个vue文件的代码:(注意ref参数)

  1. <template>
  2. <basic-container>
  3. <el-dialog
  4. title="测试对话框"
  5. top="200px"
  6. width="40%"
  7. :fullscreen="false"
  8. :visible.sync="visible"
  9. :close-on-click-modal="true"
  10. >
  11. <el-row
  12. ><el-form :model="test" ref="testForm"
  13. ><el-form-item
  14. label="测试输入框"
  15. prop="testinput"
  16. :rules="[{ required: true, message: '不能为空' }]"
  17. ><el-input v-model="test.testinput"></el-input></el-form-item
  18. ></el-form>
  19. </el-row>
  20. </el-dialog>
  21. </basic-container>
  22. </template>

此时,是三级组件的通信,注意看ref参数的定义。也就是说,对于【添加】按钮所在的父组件来说,testDlg是它的儿子,testForm是它的孙子。

如果要实现testForm里面的输入框的表单验证条件结果的清除,【添加】按钮的事件中的代码应该这样写:

  1. handleAddDialogOpen() {
  2. if (this.$refs.testDlg.$refs.testForm) {
  3. this.$refs.testDlg.$refs.testForm.clearValidate();
  4. }
  5. this.visible = true;
  6. },

笔者正是犯了这个错误,没有意识到是三级通信,还是按照那篇博客那样的写法,导致清除不掉。

还应该注意clearValidate()和resetFields()方法的区别:一个是只清除验证条件的结果,一个是清除表单的全部内容,包括验证结果和内容。

 

最后,关于表单验证值得参考的几篇博客:

可以参考学习这几篇博客:(笔者搜索过程中发现的几篇不错的,值得学习的,放在这里方便以后学习)

vue中ref的作用:https://www.cnblogs.com/xumqfaith/p/7743387.html   搞懂ref和$refs

elementUI 表单验证的三种方式:https://segmentfault.com/a/1190000020410128?utm_source=tag-newest

给一个表单设置自定义规则或多个验证规则:https://blog.csdn.net/qq_41862017/article/details/82223713###

表单验证的触发:https://blog.csdn.net/sunmeng_sunmeng/article/details/103893823

多表单的验证:https://blog.csdn.net/u011210017/article/details/80221315

 

有问题欢迎来微信找我!一起学习成长,交个朋友!^_^

微信搜索:acoolgiser,或者直接扫描

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/112906
推荐阅读
相关标签
  

闽ICP备14008679号