Element-Plus如何实现表单校验和表单重置

一:页面布局介绍:

这是我刚刚用基于vue3+element-plus写好的一个部门管理的页面

基本的增删改查已经写好,下面我只提供页面的template和style的代码:

template

html 复制代码
<template>
  <el-card class="box-card">
  <!-- 部门管理的头部 -->
  <div>
    <h1 style="margin-left: 20px;">部门管理</h1>
  </div>
  <!-- 部门管理的主体部分 -->
  <el-button type="primary" style="margin-left: 20px;" @click="addDeptDialog()">
    <el-icon><CirclePlus /></el-icon> &nbsp; 新增部门
  </el-button>
  <!-- 主体内容展示 -->
  <div class="form-box">
    <el-table :data="deptDate" border style="width: 100%">
    <el-table-column  prop="id" label="序号" width="120" align="center"/>
    <el-table-column prop="name" label="部门名称" width="240" align="center"/>
    <el-table-column prop="updateTime" label="最后操作时间" width="360" align="center"/>
    <el-table-column label="操作" align="center">
      <template #default="scope">
        <el-button type="primary" :icon="Edit" circle @click="updateDept(scope.row.id)" />
        <el-button type="danger" :icon="Delete" circle @click="delDept(scope.row.id)"/>
      </template>
    </el-table-column>
  </el-table>
  </div>
</el-card>

<!-- dialog弹窗 -->
<el-dialog v-model="dialogForValue" width="450px" :title="dialogTitle">
    <el-form :model="deptForm"
      >  
      <el-form-item label="部门名称" :label-width="formLabelWidth">
        <el-input v-model="deptForm.name" autocomplete="off" />
      </el-form-item>
    </el-form>
    <template #footer>
      <span class="dialog-footer">
        <el-button @click="dialogForValue = false">取消</el-button>
        <el-button type="primary" @click="save()">
          确认
        </el-button>
      </span>
    </template>
  </el-dialog>
</template>

style部分:

css 复制代码
<style scoped>
.box-card{
  height: 700px;
}

.form-box{
  margin-top: 20px;
}
</style>

二:表单校验:

通过测试我们发现,在添加部门的时候,我不在输入框里面输入内容也是可以成功添加部门数据的,这显得就不太友好。

我直接点击确定:近发现数据已经添加成功了,这就有点不符合逻辑了。

开始表单校验:
  • 1,定义表单校验规则 绑定到form表单
  • 2,把规则绑定到form表单中
  • 3,定义表单组件的引用
  • 4,检验表单
定义表单校验实例:

完整规则代码:

javascript 复制代码
//定义表单校验的规则  //FormRules 是element给我们提供的,可以给我们提示
const rules = ref<FormRules>({
  name:[
    {required:true,message:'部门名称不能为空',trigger:'blur'},
    {min:1,max:10,message:'部门名称必须 2 - 10位',trigger:'blur'}
  ]
})
规则绑定到表单中:

代码:

html 复制代码
<el-dialog v-model="dialogForValue" width="450px" :title="dialogTitle">
    <el-form :model="deptForm"
    :rules="rules">  
      <el-form-item label="部门名称" :label-width="formLabelWidth" prop="name">
        <el-input v-model="deptForm.name" autocomplete="off" />
      </el-form-item>
    </el-form>
    <template #footer>
      <span class="dialog-footer">
        <el-button @click="dialogForValue = false">取消</el-button>
        <el-button type="primary" @click="save()">
          确认
        </el-button>
      </span>
    </template>
  </el-dialog>

看看效果:

可以发现我们定义的校验规则已经生效了

但是规则虽然生效了,我们还是可以提交表单数据。

我们因该在表单校验不通过的时候,阻止表单提交。

定义表单组件的引用:

代码:

javascript 复制代码
//定义表单组件的引用  FormInstance 表单实例 是element给我们提供的
const deptFormRef = ref<FormInstance>()

把这个表单组件的引用,绑定到我们自己的表单中。

代码:

html 复制代码
<!-- dialog弹窗 ref="formRef 为了获取这个表单" -->
<el-dialog v-model="dialogForValue" width="450px" :title="dialogTitle">
    <el-form :model="deptForm"
    :rules="rules"
    ref="deptFormRef">  
      <el-form-item label="部门名称" :label-width="formLabelWidth" prop="name">
        <el-input v-model="deptForm.name" autocomplete="off" />
      </el-form-item>
    </el-form>
    <template #footer>
      <span class="dialog-footer">
        <el-button @click="dialogForValue = false">取消</el-button>
        <el-button type="primary" @click="save()">
          确认
        </el-button>
      </span>
    </template>
  </el-dialog>

在添加dialog弹窗里面,点击保存的时候,我们因该先判断表单校验是否通过,才能往下执行。

代码:

javascript 复制代码
//确认保存
const save = async () =>{
 //先表单校验 
  await deptFormRef.value?.validate().catch(err =>{
    ElMessage.error('表单校验的失败')
    throw err   //throw err  //下面正常的代码就不会执行了,回抛出异常
  })
   
  //正式向后端发送请求
  let result 
  //判断是添加还是修改
  if(dialogTitle.value == '新增部门'){
    //添加的请求
    result = await insertDeptApi(deptForm.value)
  }else{
    //修改的请求
    result = await updateDeptApi(deptForm.value)
  }
    if(result.code){
        ElMessage.success('操作成功')
    }else{
      ElMessage.error('操作失败')
    }
    //关闭弹窗
    dialogForValue.value = false
    //重新查询
    search()
}

测试:

可以看到表单校验成功了

控制台报错:

不想提示报错还有另一种方式:

代码:

javascript 复制代码
//确认保存
const save = async () =>{
 //先表单校验 
  await deptFormRef.value?.validate().catch(err =>{
    ElMessage.error('表单校验的失败')
    //throw err   //throw err  //下面正常的代码就不会执行了,回抛出异常
    return new Promise(() => {}) //不想抛错可以这样,promise是待定状态,也不会往下执行
  })
   
  //正式向后端发送请求
  let result 
  //判断是添加还是修改
  if(dialogTitle.value == '新增部门'){
    //添加的请求
    result = await insertDeptApi(deptForm.value)
  }else{
    //修改的请求
    result = await updateDeptApi(deptForm.value)
  }
    if(result.code){
        ElMessage.success('操作成功')
    }else{
      ElMessage.error('操作失败')
    }
    //关闭弹窗
    dialogForValue.value = false
    //重新查询
    search()
}

测试:

三:表单重置:

上面我们的表单校验已经成功了,但是我们会发现一个缺点就是,表单校验失败的提示信息一直都在。

我先把错误信息显示出来之后,然后关闭dialog弹窗,接着我在打开dialog弹窗,发现错误信息依然在。

定义表单重置的方法:

form是一会调用方法,传递过来的表单实例参数,就是一个变量名。后面的 FormInstance和undefined就是一个泛型。

代码:

javascript 复制代码
//表单重置
const resetForm = (form : FormInstance | undefined) =>{
  if(!form) return
  form.resetFields()
}

在点击新增部门和修改部门的方法时,调用重置表单的方法。

代码:

html 复制代码
  <el-button type="primary" style="margin-left: 20px;" @click="addDeptDialog();resetForm(deptFormRef)">
    <el-icon><CirclePlus /></el-icon> &nbsp; 新增部门
  </el-button>

代码:

html 复制代码
    <el-table-column label="操作" align="center">
      <template #default="scope">
        <el-button type="primary" :icon="Edit" circle @click="updateDept(scope.row.id);resetForm(deptFormRef)" />
        <el-button type="danger" :icon="Delete" circle @click="delDept(scope.row.id)"/>
      </template>
    </el-table-column>

测试:

在测试一个错误的,然后退出,重新打开看效果。

成功

相关推荐
SameX4 分钟前
初识 HarmonyOS Next 的分布式管理:设备发现与认证
前端·harmonyos
M_emory_31 分钟前
解决 git clone 出现:Failed to connect to 127.0.0.1 port 1080: Connection refused 错误
前端·vue.js·git
Ciito34 分钟前
vue项目使用eslint+prettier管理项目格式化
前端·javascript·vue.js
成都被卷死的程序员1 小时前
响应式网页设计--html
前端·html
fighting ~1 小时前
react17安装html-react-parser运行报错记录
javascript·react.js·html
老码沉思录1 小时前
React Native 全栈开发实战班 - 列表与滚动视图
javascript·react native·react.js
abments1 小时前
JavaScript逆向爬虫教程-------基础篇之常用的编码与加密介绍(python和js实现)
javascript·爬虫·python
mon_star°1 小时前
将答题成绩排行榜数据通过前端生成excel的方式实现导出下载功能
前端·excel
Zrf21913184552 小时前
前端笔试中oj算法题的解法模版
前端·readline·oj算法
老码沉思录2 小时前
React Native 全栈开发实战班 - 状态管理入门(Context API)
javascript·react native·react.js