element plus表单验证自动滚动到第一个验证失败字段

该代码示例展示了在Vue.js应用中如何创建一个表单,包含多个输入字段,执行数据验证。当用户点击提交按钮且验证失败时,页面会自动滚动到第一个验证未通过的字段。实现这一功能的关键在于使用`validate`方法和`scrollToField`函数。
摘要由CSDN通过智能技术生成

 一、首先放两张效果图:

1.点击提交按钮之前的

 2.输入后部分字段,点击提交按钮:

 

 页面自动跳转到第一个验证失败字段处。

二、代码如下

1.表单结构部分

<template>
    <el-form
          :inline="true"
          ref="siteRuleFormRef"
          :rules="siteRules"
          :model="state.siteMessageList"
          label-width="100px"
          style="max-width: 1860px"
        >
      <el-scrollbar height="600px">
          <el-form-item label="场所性质" prop="facilityLocationNature">
            <el-input v-model="state.siteMessageList.facilityLocationNature" />
          </el-form-item>
          <el-form-item label="建筑面积" prop="facilityFloorSpace">
            <el-input v-model="state.siteMessageList.facilityFloorSpace" />
          </el-form-item>
          <el-form-item label="占地面积" prop="facilityCoverArea">
            <el-input v-model="state.siteMessageList.facilityCoverArea" />
          </el-form-item>
          <el-form-item label="床位总数" prop="facilityBedsNum">
            <el-input v-model="state.siteMessageList.facilityBedsNum" />
          </el-form-item>
          <el-form-item label="全托床位数量" prop="facilityFullBedsNum">
            <el-input v-model="state.siteMessageList.facilityFullBedsNum" />
          </el-form-item>
          <el-form-item label="日托床位数量" prop="facilityDayBedsNum">
            <el-input v-model="state.siteMessageList.facilityDayBedsNum" />
          </el-form-item>
          <el-form-item label="护理型床位数" prop="facilityNursingBedsNum">
            <el-input v-model="state.siteMessageList.facilityNursingBedsNum" />
          </el-form-item>
          <el-form-item label="是否与党群中心共建" prop="facilityIsPartyCenter">
            <el-input v-model="state.siteMessageList.facilityIsPartyCenter" />
          </el-form-item>
          <el-form-item label="专用面积" prop="facilityDedicatedArea">
            <el-input v-model="state.siteMessageList.facilityDedicatedArea" />
          </el-form-item>
          <el-form-item label="共用面积" prop="facilitySharedArea">
            <el-input v-model="state.siteMessageList.facilitySharedArea" />
          </el-form-item>
          <el-form-item label="是否享受养老服务税费减免" prop="facilityIsEnjoy">
            <el-input v-model="state.siteMessageList.facilityIsEnjoy" />
          </el-form-item>
          <el-form-item label="功能室名称" prop="facilityFunctionName">
            <el-input v-model="state.siteMessageList.facilityFunctionName" />
          </el-form-item>
          <el-form-item label="功能室数量" prop="facilityFunctionNum">
            <el-input v-model="state.siteMessageList.facilityFunctionNum" />
          </el-form-item>
      </el-scrollbar>
      <div><el-button style="margin: 30px 300px;width: 400px" @click="btnClick" type="primary">提交</el-button></div>
    </el-form>
 
  

</template>

2.变量定义以及表单验证规则配置

<script setup lang="ts">
import { reactive,ref } from 'vue'
const state = reactive({
  siteMessageList:{} as any
})
const validateNum = (rule:any, value:any, callback:any) => {
  let reg = /^\d+(\.{0,1}\d+){0,1}$/
  if (value == '' || value == undefined || value == null) {
    callback()
  } else {
    if (!reg.test(value) && value != '') {
      callback(new Error('请输入大于0的数字'))
    } else {
      callback()
    }
  }
}
const positiveInteger = (rule:any, value:any, callback:any) => {
  let zzInteger = /^(0|[1-9]\d*)$/
  if (value == '' || value == undefined || value == null) {
    callback()
  } else {
    if (!zzInteger.test(value) && value != '') {
      callback(new Error('请输入大于或等于0的整数'))
    } else {
      callback()
    }
  }
}
const siteRules = reactive({
  facilityFloorSpace: [
    { required: true, message: '请输入建筑面积', trigger: 'blur' },
    {
      validator: validateNum,
      trigger: 'blur'
    }
  ],
  facilityCoverArea: [
    { required: true, message: '请输入占地面积', trigger: 'blur' },
    {
      validator: validateNum,
      trigger: 'blur'
    }
  ],
  facilityDedicatedArea: [
    //专用面积
    { required: true, message: '请输入占地面积', trigger: 'blur' },
    {
      validator: validateNum,
      trigger: 'blur'
    }
  ],
  facilitySharedArea: [
    //共用面积
    { required: true, message: '请输入占地面积', trigger: 'blur' },
    {
      validator: validateNum,
      trigger: 'blur'
    }
  ],
  facilityBedsNum: [
    //床位总数
    { required: true, message: '请输入大于或等于0的整数', trigger: 'blur' },
    {
      validator: positiveInteger,
      trigger: 'blur'
    }
  ],
  facilityFullBedsNum: [
    //全托床位数量
    { required: true, message: '请输入大于或等于0的整数', trigger: 'blur' },
    {
      validator: positiveInteger,
      trigger: 'blur'
    }
  ],
  facilityDayBedsNum: [
    //日托床位数量
    { required: true, message: '请输入大于或等于0的整数', trigger: 'blur' },
    {
      validator: positiveInteger,
      trigger: 'blur'
    }
  ],
  facilityNursingBedsNum: [
    //护理型床位数
    { required: true, message: '请输入大于或等于0的整数', trigger: 'blur' },
    {
      validator: positiveInteger,
      trigger: 'blur'
    }
  ],
  facilityFunctionNum: [
    //功能室数量
    { required: true, message: '请输入大于或等于0的整数', trigger: 'blur' },
    {
      validator: positiveInteger,
      trigger: 'blur'
    }
  ], //1111
  facilityLocationNature: [{ required: true, message: '请选择场所性质', trigger: 'change' }],
  facilityIsPartyCenter: [
    { required: true, message: '请选择是否与党群中心共建', trigger: 'change' }
  ],
  facilityIsEnjoy: [
    { required: true, message: '请选择是否享受养老服务税费减免', trigger: 'change' }
  ],
  facilityFunctionName: [{ required: true, message: '请输入功能室名称', trigger: 'blur' }]
})
const siteRuleFormRef = ref()
const btnClick = async() =>{
await siteRuleFormRef.value.validate((v:any,error:any) => {
    if(v){
      console.log('校验通过了')
    }else{
      console.log(error,'error===>')
      Object.keys(error).forEach((key,i)=>{
        if(i==0){
          const firstFiled = error[key][0].field
          siteRuleFormRef.value.scrollToField(firstFiled)
        }
      })
    }
  })
}
</script>

3.从以上代码中单独抽出核心部分(自动跳转到第一个验证失败字段处

实现方法:通过表单验证提供的 scrollToField 方法

//这里是点击提交按钮时触发的回调函数
const btnClick = async() =>{
    await siteRuleFormRef.value.validate((v:any,error:any) => {
        if(v){
          console.log('校验通过了')
        }else{
          Object.keys(error).forEach((key,i)=>{
            if(i==0){
              const firstFiled = error[key][0].field
              siteRuleFormRef.value.scrollToField(firstFiled)
            }
          })
        }
    })
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用 Element Plus 中的表单验证方法 `this.$refs.form.validateField()` 来验证单个字段是否通过验证。您可以将需要验证字段的 `prop` 属性作为参数传递给该方法,例如: ```html <el-form ref="form" :model="formData" :rules="rules"> <el-form-item label="用户名" prop="username"> <el-input v-model="formData.username"></el-input> </el-form-item> <el-form-item label="密码" prop="password"> <el-input v-model="formData.password" type="password"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="handleSubmit">提交</el-button> </el-form-item> </el-form> ``` ```javascript export default { data() { return { formData: { username: '', password: '' }, rules: { username: [ { required: true, message: '请输入用户名', trigger: 'blur' } ], password: [ { required: true, message: '请输入密码', trigger: 'blur' } ] } } }, methods: { handleSubmit() { this.$refs.form.validate((valid) => { if (valid) { // 表单验证通过,提交表单 console.log('表单验证通过'); } else { // 表单验证失败 console.log('表单验证失败'); } }); }, handleCheckUsername() { // 验证用户名字段是否通过验证 this.$refs.form.validateField('username', (valid) => { if (valid) { console.log('用户名验证通过'); } else { console.log('用户名验证失败'); } }); } } } ``` 在上面的示例代码中,`handleSubmit` 方法会在提交表单时对整个表单进行验证,而 `handleCheckUsername` 方法则会验证用户名字段是否通过验证。在调用 `validateField` 方法时,可以传递一个回调函数,该回调函数会在验证结果返回后被调用,可以根据验证结果来执行相应的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值