Avue表单或搜索项的校验方式

一、常规校验

js 复制代码
// 单次校验
column: [
  {  
      label: "标题",  
      prop: "字段名", //对应数据库  
      type: "input",  //类型:input、select、number...
      span: 12, // 占位
      // rules:校验规则,如果不生效 就用searchRules
      rules: [{  
        required: true,  // 是否必填
        message: "错误提示",  
        trigger: "blur"  //触发类型 blur失焦、change选择、click点击... 
      }], 
      // searchRules:校验规则,如果不生效 就用rules
      searchRules: [
        {
          max: 50,
          message: "最多输入50个字符",
        },
      ],
  },
]

// 多次校验 {一个{}代表一个校验规则,按顺序执行}

rules: [
    { required:true, message:"",trigger:"blur" },
    { required:false, message:"",trigger:"click"}
]

二、非常规校验

js 复制代码
// 正则等类型校验
column: [
 {  
   label: "标题",  
   prop: "字段名", // 对应数据库  
   type: "input",  // 类型:input、select、number...
   span: 12,  // 占位
   // rules:校验规则,如果不生效 就用searchRules
   rules: [
     // 基本校验
     {  
       type: 'string', // 输入类型
       max: 50, // 最大字符长度50
       required: true,  // 是否必填
       message: "错误提示",  
       trigger: "blur"  //触发类型 blur失焦、change选择、click点击... 
     },
     {  
       pattern: /^[+]{0,1}(\d+)$/, //正则校验 必须为正整数
       message: "必须为正整数",  
       trigger: "blur"  // 触发类型 blur失焦、change选择、click点击... 
     }
   ], 
  },
]
js 复制代码
// 插槽 
// ref: 嵌入表单模块
// v-model: 绑定数据
// :option="name" 插入模块
<div v-show="div">  
  <avue-form ref="refForm" v-model="form" :option="data"></avue-form>  
  <el-divider></el-divider>
</div>
  
data() {
  
  //通用校验规则
  // rule 所在规则
  // value 当前触发值
  // callback 返回值
  // checkRule 规则名称
  // 注意生命周期 const、let、var
  const checkRule=(rule,value,callback) => {
    // 例:触发位于表单中,存在多行数据时
    // 取得所在行数据
    let rowIndex = rule.field.replace(/[^0-9]/ig,"");
    // 例:通用判断是否为正整数 
    if(!/^[+]{0,1}(\d+)$/.test(value)) {
      // 返回值设定 
      callback(new Error("当前值不是正整数!"));
      return;
    }

    // 例:多个Input框进行值对比 
    // prop1(prop命名) = value 当前所在Input输入值 
    let prop1 = value;
    // prop2(prop命名) 其他Input值获取 refForm 当前Input所在单元模块(对应开头)
    let prop2 = this.refForm.prop2;

    if(Number(prop1) < Number(prop2))
    {
      // 返回值设定 
      callback(new Error(" prop1 小于 prop2 "));
      return;
    }
  }

  return {
    // 通用属性...
    // 搜索项配置
    column:[
        // 调用公共方法
        {  
            label: "标题",  
            prop: "prop1", //对应数据库的字段  
            type: "input",  //类型:input、select、number...
            span: 12,  //占位
            // rules:校验规则,如果不生效 就用searchRules 
            rules: [
                // 基本规则
                {  
                    required: true,  // 是否必填
                    message: "错误提示",  
                    trigger: "blur"  
		},
                // 自定义规则
                {  
                    validator:checkRule, // 调用通用校验规则,checkRule代码在上面
                    // message: "异常提示",  // 在此处写提示后,通用规则返回值将不显示
                    trigger: "blur",// 触发类型 blur失焦、change选择、click点击...   
                }
             ], 
            // searchRules:校验规则,如果不生效 就用rules
            searchRules: [
                // 基本规则
                {  
                    required: true,  // 是否必填
                    message: "错误提示",  
                    trigger: "blur"  
		},
                // 自定义规则
                {  
                    validator:checkRule, // 调用通用校验规则,checkRule代码在上面
                    // message: "异常提示",  // 在此处写提示后,通用规则返回值将不显示
                    trigger: "blur",// 触发类型 blur失焦、change选择、click点击...   
                }
            ],
	},
	{  
	  label: "标题",  
	  prop: "prop2", //对应数据库的字段  
          type: "input",  //类型:input、select、number...
          span: 12,  //占位
          // rules:校验规则,如果不生效 就用searchRules 
          rules: [
              {  
                required: true,  //是否必填
                message: "错误提示",  
                trigger: "blur"  // 触发类型 blur失焦、change选择、click点击... 
                },
              {  
                validator:checkRule, // 调用通用校验规则
                // message: "异常提示",  // 在此处写提示后,通用规则返回值将不显示
                trigger: "blur",// 触发类型 blur失焦、change选择、click点击...   
              }
         ], 
         // searchRules:校验规则,如果不生效 就用rules
         searchRules: [
            {  
                required: true,  //是否必填
                message: "错误提示",  
                trigger: "blur"  // 触发类型 blur失焦、change选择、click点击... 
                },
            {  
                validator:checkRule, // 调用通用校验规则
                // message: "异常提示",  // 在此处写提示后,通用规则返回值将不显示
                trigger: "blur",// 触发类型 blur失焦、change选择、click点击...   
            }
         ],
	},

	// 私有方法 
	{  
	  label: "标题",
	  prop: "prop1", // 对应数据库
          type: "input",  // 类型:input、select、number...
          span: 12,  // 占位
          // rules:校验规则,如果不生效 就用searchRules 
          rules: [{  
             required: true,  // 是否必填
             // 私有方法使用 仅自己可用
             validator:(rule,value,callback)=> {
                 // 方法编写...
                 // 可获取同一表单中其他Input的值 获取方法同上
                 // 返回值方法同上
             },
             trigger: "blur" 
          }], 
          // searchRules:校验规则,如果不生效 就用rules
          searchRules: [
            {
              required: true,  // 是否必填
              // 私有方法使用 仅自己可用
              validator:(rule,value,callback)=> {
                 // 方法编写...
                 // 可获取同一表单中其他Input的值 获取方法同上
                 // 返回值方法同上
              },
              trigger: "blur" 
            },
          ],
        }
	
    ]
  }
}

三、 页面全部校验触发(防止必填项为空时输入至后端)

js 复制代码
// 插槽 
// ref: 嵌入表单模块
// v-model: 绑定数据
// :option="name" 插入模块

// 插槽1 
<avue-form ref="form0" v-model="form" :option="option0">
// 插槽2 
<avue-form ref="form1" v-model="form" :option="option1">
// 插槽3
<avue-form ref="form2" v-model="form" :option="option2">
// 下一步按钮
<el-button v-show="nextShow" type="button" @click="next()">下一步</el-button>
// 提交按钮
<el-button v-show="submitShow" type="button" @click="submit()">提交</el-button>

// 三个插槽中 都含必填项 
option0(){
  // 略...
}
option1(){
  // 略...
}
option2(){
  // 略...
}

// 下一步时 校验是否含空值(必填项)
// 一个页面可能含多个表单模块 视情况而定
// 其中 page1 { form0 } 、 page2 { form1 , form2 }

// 下一步按钮执行的方法
next() {
  // 默认 无必填项为空
  let bl = true;
  // 对单元模块中每个字段进行触发,查看每个字段是否符合自定义的规则
  this.$refs[单元模块名称form0/form1...].validate((valid) => {
    //校验异常 自定义规则存在不符合情况
    if(!valid)
    {
        bl = false;
    }

    // 例:在循环中时,如page2,在全部模块都触发后执行最后一步 
    if(最后一次,已全部循环执行){
      // 无异常 都符合规则
      if(bl) {
         // 继续执行下一步...
         otherFunction()
      } else {
         // 弹出提示
         this.$message.warning('异常提示');
         return;
      }
    }
    
  });
}
相关推荐
猪猪拆迁队1 小时前
前端图形引擎架构设计:双引擎架构设计
前端·后端·架构
宋辰月1 小时前
学习react第三天
前端·学习·react.js
bug总结1 小时前
更新原生小程序封装(新增缓存订阅)完美解决
前端·缓存·小程序
5335ld2 小时前
后端给的post 方法但是要求传表单数据格式(没有{})
开发语言·前端·javascript·vue.js·ecmascript
二川bro2 小时前
第33节:程序化生成与无限地形算法
前端·算法·3d·threejs
QDKuz2 小时前
掌握Vue2转Vue3, Options API 转 Composition API
前端·javascript·vue.js
老前端的功夫2 小时前
前端Echarts性能优化:从卡顿到流畅的百万级数据可视化
前端·javascript
进击的野人2 小时前
深入解析localStorage:前端数据持久化的核心技术
前端·javascript
懵圈2 小时前
第2章:项目启动 - 使用Vite脚手架初始化项目与工程化配置
前端
Mh2 小时前
如何优雅的消除“if...else...”
前端·javascript