Vue中使用 Element-ui form和 el-dialog 进行自定义表单校验&清除表单状态

文章目录

问题

在使用 Element-ui el-form 和 el-dialog 进行自定义表单校验时,出现点击编辑按钮之后再带年纪新增按钮,出现如下情况,新增弹出表单进行了一次表单验证,而这时不应该要表单验证的

分析

在寻找多种解决方案后,最后用的方法时在打开弹窗第一次取消校验规则,这里我使用的是el-dialog的@open和@close来处理

需要注意的是要在清除方法外面用$nextTick处理一下在DOM渲染完成后在操作

不然会有问题,如果不需要清除的话可以不调用回调方法

javascript 复制代码
 //弹框打开的时
    getOpen() {
      // 移除校验状态
      // this.$refs.form.resetField()
      this.$nextTick(() => {
        this.$refs.form.clearValidate()

      })
    },
    //关闭弹窗
    close() {
      this.$nextTick(() => {
        this.$refs.form.resetFields()
      })
    }
  • 全部代码
js 复制代码
<template>
  <div>
    <el-button @click="dialogFormVisible=true">新增</el-button>
    <el-dialog @open="getOpen" @close="close" title="测试新增" :close-on-click-modal="false" :visible.sync="dialogFormVisible" width="40%" append-to-body>
      <el-form ref="form" :model="form" :rules="rules">
        <el-form-item label="姓名" :label-width="formLabelWidth" prop="name">
          <el-input v-model="form.name" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item :label-width="formLabelWidth" prop="region">
          <label slot="label"><i style="color:red;">*&nbsp; </i> 性别</label>
          <el-select v-model="form.region" placeholder="请选择性别">
            <el-option label="男" value="1"></el-option>
            <el-option label="女" value="2"></el-option>
          </el-select>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="dialogFormVisible = false">取 消</el-button>
        <el-button type="primary" @click="Add">确 定</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
export default {
  data() {
    return {
      formLabelWidth: '120px',
      dialogFormVisible: false,
      form: {
        name: '',
        region: ''
      },
      rules: {
        name: [
          {
            required: true,
            pattern: /^[a-zA-Z0-9]+$/,
            message: '只能输入数字或大小写字母',
            trigger: 'blur'
          }
        ],
        region: [{ validator: this.validatorRegion, trigger: 'change' }]
      }
    }
  },
  methods: {
    //自定义校验方法
    validatorRegion(rule, value, callback) {
      if (!this.form.region) {
        callback(new Error('请选择性别'))
      } else {
        callback()
      }
    },
    Add() {
      this.$refs.form.validate((valid) => {
        console.log(valid)
        if (valid) {
          this.$message.success('校验成功')
          this.dialogFormVisible = !this.dialogFormVisible
        } else {
          this.$message.warning('校验失败')
        }
      })

    },
    //弹框打开的时
    getOpen() {
      // 移除校验状态
      this.$nextTick(() => {
        this.$refs.form.clearValidate()

      })
    },
    //关闭弹窗
    close() {
    //清除用户输入
      this.$nextTick(() => {
        this.$refs.form.resetFields()
      })
    }
  }
}
</script>
<style lang="less" scoped>
</style>
相关推荐
一 乐7 小时前
动漫书销售商城|基于springboot + vue动漫书销售商城(源码+数据库+文档)
java·数据库·vue.js·spring boot·毕业设计
admin and root7 小时前
「AI安全篇」实战AntiDebug自动化JS逆向加解密MCP
javascript·人工智能·网络安全·自动化·漏洞挖掘·cnvd·src赏金
wengad9 小时前
从 wangEditor 迁到 wangEditor-next
前端·javascript·vue.js
行者-全栈开发10 小时前
【前端/JS框架】CVE-2026-3854:GitHub Enterprise Server X-Stat注入XSS漏洞深度剖析与紧急修复指南
前端·javascript·github
怕浪猫12 小时前
2026年金九银十,我面了22个前端
前端·javascript·面试
FYKJ_201012 小时前
django电影推荐系统55066-计算机课程设计、毕业设计
vue.js·spring boot·python·mysql·typescript·spark·django
前端的日常12 小时前
一个人+AI做情侣食谱小程序,30天纯赚
前端·javascript·后端
qq_3168377513 小时前
阿里云百炼 fun-asr-realtime uniapp vue3 调用
javascript·vue.js·uni-app
李剑一13 小时前
AntDesign老版本没有月份和年份区间选择组件?我封装了一个完美版,附源码!
前端·vue.js
默_笙13 小时前
🚊 别再让 AI 的记忆写两遍了:PostgreSQL 把关系查询和语义检索装进一张表
前端·javascript