Vue移动端(H5项目或uniapp小程序)项目封装form表单校验组件(支持required必填、min/max最大最小长度、pattern正则、validator事件校验规则)

一、最终效果

在这里插入图片描述

二、参数配置

1、代码示例:

此组件也支持uniapp微信小程序

<t-form ref="tform" :model="loginForm" :rules="rules">
  ...
 </t-form>

2、配置参数(TForm Attributes)

参数说明类型默认值
model需要校验表单信息Object-
rules校验规则信息Object.-

3、events 事件

事件名说明返回值
validate全部校验返回valid

三、具体页面使用

<template>
	<div class="login">
     <t-form ref="tform" :model="loginForm" :rules="rules">
	        <div class="roundBox">
	          <van-field v-model.trim="loginForm.username" placeholder="请输入账号" clearable />
	        </div>
	        <div class="roundBox">
	          <t-van-field
	            v-model="loginForm.password"
	            type="password"
	            placeholder="请输入密码"
	            clearable
	            showPassword
	          />
	        </div>
	    </t-form>
	    <div class="btn" @click="onLogin">登录</div>
    </div>
</template>
<script>
export default {
  name: 'initialJudgment',
  data() {
    return {
      loginForm: {
        username: '',
        password: '',
      },
      rules: {
        username: [{ required: true, message: "请输入账号", trigger: "blur" }],
        password: [
          { required: true, message: "请输入密码", trigger: "blur" },
          { min: 6, max: 18, message: "密码长度在6到18个字符", trigger: "blur" }
        ]
      }
    }
  },
  methods: {
    // 登录
    onLogin() {
      this.$refs.tform.validate(async (valid) => {
        if (!valid) return;
        console.log("验证通过", this.loginForm);
        const res = await this.$store.dispatch('Login', this.loginForm)
        if (res.success) {
          this.$router.push({ path: '/' });
        }
      })
    }
  },
};
</script>

四、源码

<template>
  <div class="t_form">
    <slot />
  </div>
</template>
<script>
export default {
  name: 'TForm',
  props: {
    model: {
      type: Object,
      default: () => ({})
    },
    rules: {
      type: Object,
      default: () => ({})
    }
  },
  methods: {
    // 单个字段校验
  validateField(key) {
  let value = this.model[key];
  if (!this.rules[key] || !this.rules[key].length) {
    return { valid: true };
  }
  for (let rule of this.rules[key]) {
    if (rule.required && !value) {
      return { valid: false, msg: rule.message };
    }
    if ((rule.max || rule.min) && value.length < rule.min || value.length > rule.max) {
      return { valid: false, msg: rule.message };
    }
    if (rule.pattern && !new RegExp(rule.pattern).test(value)) {
      return { valid: false, msg: rule.message };
    }
    if (rule.validator) {
      let error = '';
      rule.validator(rule, value, err => {
        if (err) error = err;
      });
      if (error) {
        return { valid: false, msg: error };
      }
    }
  }
  return { valid: true };
},
    // 全部校验
    validate(callback) {
      let res = []
      Object.keys(this.rules).forEach(key => {
        res.push(this.validateField(key))
      });
      for (let i = 0; i < res.length; i++) {
        if (!res[i].valid) {
          this.$toast({
            message: res[i].msg
          })
          return false
        }
      }
      callback({
        valid: true
      })
    }
  }
}
</script>

相关文章

基于ElementUi再次封装基础组件文档


基于ant-design-vue再次封装基础组件文档


vue3+ts基于Element-plus再次封装基础组件文档

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wocwin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值