前端数据校验Rules

开发一个小功能过程中,需要录入邮箱和手机号,这两项是用户输入的,为了限定用户不能随心所欲的输入,避免存入数据库的数据为脏数据,就需要加入验证规则。
功能:弹窗,表单保存用户名、密码、邮箱、手机号。

 <el-dialog
      title="添加用户"
      :visible.sync="addDialogVisible"
      @close="addDialogClosed"
      width="50%">
      <el-form :model="addForm" :rules="addFormRules" ref="addFormRef" label-width="70px" class="demo-ruleForm">
        <el-form-item label="用户名" prop="username">
          <el-input v-model="addForm.username"></el-input>
        </el-form-item>
        <el-form-item label="密码" prop="password">
          <el-input v-model="addForm.password"></el-input>
        </el-form-item>
        <el-form-item label="邮箱" prop="email">
          <el-input v-model="addForm.email"></el-input>
        </el-form-item>
        <el-form-item label="手机" prop="mobile">
          <el-input v-model="addForm.mobile"></el-input>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="addDialogVisible = false">取 消</el-button>
        <el-button type="primary" @click="addUser">确 定</el-button>
      </span>
    </el-dialog>
:rules="addFormRules"

是校验规则相关的内容,我们在data中定义了addFormRules.

     addFormRules: {
        username: [{
          required: true,
          message: '请输入用户名',
          trigger: 'blur'
        },
        {
          min: 3,
          max: 10,
          message: '用户名长度在3-10个字符之间',
          trigger: 'blur'
        }
        ]
      }

以用户名为例子, required: true表示必填, message: '请输入用户名'则为提示信息,trigger: 'blur'出发校验,min,max则校验了我们要求的字符串长度,这个不难理解,因为这是利用现有的规则进行了校验,那么邮箱和手机号这两种该如何去写,这里vue提供了自定义校验规则的写法。


首先我们在data中先定义两个validator

 data () {
    const checkEmail = (rule, value, cb) => {
      const regEmail = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/
      if (regEmail.test(value)) {
        return cb()
      }
      cb(new Error('请输入正确的邮箱'))
    }
    const checkMobile = (rule, value, cb) => {
      const regMobile = /^(0|86|17951)?(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$/
      if (regMobile.test(value)) {
        return cb()
      }
      cb(new Error('请输入正确的手机号'))
    }
  }

然后在我们自己的addFormRules中进行使用:

  addFormRules: {
        email: [
          {
            required: true,
            message: '请输入邮箱',
            trigger: 'blur'
          },
          {
            // 通过validator 进行自定义校验规则
            validator: checkEmail,
            trigger: 'blur'
          }
        ],
        mobile: [
          {
            required: true,
            message: '请输入手机',
            trigger: 'blur'
          },
          {
            validator: checkMobile,
            trigger: 'blur'
          }
        ]
      }

写法是固定的,也不难理解,唯一的难点可能就是对于正则表达式的写法不太熟练,也不用难为自己,ctrl+c是万能的。
我们看看效果:

资源来自:简书的某位用户,非原创。(感谢这位大佬),下面是文章地址。

Vue中:rules添加验证规则 - 简书 (jianshu.com)

 

<think>好的,用户想了解前端参数校验的方法和最佳实践。首先,我需要回顾一下相关的知识,确保自己理解正确。参数校验前端非常重要,可以防止无效数据提交到后端,提升用户体验。用户提到的几个引用都是关于后端校验的,比如使用hibernate-validator和Spring Boot的实践,但用户现在关心的是前端部分。 首先,我得明确前端校验的基本方法。常见的有HTML5原生校验、JavaScript手动校验,以及使用第三方库如validator.js或Yup。另外,框架如React、Vue也有自己的校验方式,比如Vuelidate或Formik。需要把这些方法整理出来,并给出具体例子。 然后,用户可能想知道最佳实践,比如实时反馈、结合前后端校验、友好提示等。引用中提到后端校验的必要性,所以前端校验不能替代后端,但可以互补。要强调两者结合的重要性,避免重复代码,保持校验逻辑一致。 还要注意用户提到的引用内容,虽然主要是后端,但可以引用[^1]说明参数校验的必要性,引用[^2]提到优雅的代码实践,可能可以类比到前端。引用[^3]和[^4]提到统一处理校验错误,前端也需要类似的策略,比如全局错误处理或统一提示组件。 接下来,我需要组织回答结构,分点说明方法,每个方法下给出示例和优点。然后列出最佳实践,强调关键点。最后生成相关问题,引导用户进一步思考。 需要注意使用中文,行内公式用$...$,但可能前端校验涉及数学较少,不过如果有的话要正确应用。比如正则表达式中的模式可以写成$pattern$形式,但可能不需要。代码示例用正确语法,比如JavaScript或框架特定的代码。 需要确保信息准确,比如HTML5的属性确实有效,各库的用法正确。可能还需要提到无障碍访问,比如错误提示的ARIA属性,提升可访问性。 最后,检查是否有遗漏,比如防止XSS攻击是否相关,但参数校验主要关注格式和有效性,安全方面可能属于另一个范畴,不过可以简要提及。确保回答清晰,步骤明确,帮助用户逐步理解和实施前端参数校验的最佳实践。</think># 前端参数校验方法及最佳实践 ## 一、基础校验方法 1. **HTML5原生校验** ```html <form> <input type="email" required pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$"> <input type="submit"> </form> ``` *优点*:无需编写JavaScript代码,支持基础格式验证 2. **JavaScript手动校验** ```javascript function validateForm() { const username = document.getElementById('username').value; if (!/^[a-zA-Z0-9]{4,16}$/.test(username)) { showError("用户名必须是4-16位字母数字组合"); return false; } // 更多校验逻辑... } ``` 3. **第三方校验库** - **Validator.js**:提供超过40种校验规则 ```javascript validator.isEmail('test@example.com'); validator.isMobilePhone('13800138000', 'zh-CN'); ``` - **Yup**(推荐用于React等框架): ```javascript const schema = yup.object().shape({ password: yup.string().min(8).matches(/[a-zA-Z0-9]/) }); ``` ## 二、框架集成方案 1. **React + Formik** ```jsx <Formik validationSchema={Yup.object().shape({ email: Yup.string().email('无效邮箱') })} > {({ errors }) => ( <Form> <Field name="email" /> {errors.email && <div>{errors.email}</div>} </Form> )} </Formik> ``` 2. **Vue + VeeValidate** ```vue <ValidationObserver> <ValidationProvider rules="required|email" v-slot="{ errors }"> <input v-model="email"> <span>{{ errors[0] }}</span> </ValidationProvider> </ValidationObserver> ``` ## 三、最佳实践建议 1. **分层校验策略** - 第一层:HTML5基础校验(立即反馈) - 第二层:JavaScript格式校验(提交前拦截) - 第三层:服务端最终校验(防恶意绕过)[^2] 2. **用户体验优化** - 实时校验:`onBlur`+`onChange`组合触发 - 错误提示:定位到具体字段,使用红色边框+图标+文字说明 - 防抖处理:对输入型校验添加200-300ms延迟 3. **代码组织规范** ```javascript // 创建独立校验模块 export const validationRules = { username: { test: value => /^[a-z0-9_]{4,16}$/i.test(value), message: "4-16位字母数字下划线" }, password: { test: value => value.length >= 8, message: "至少8位密码" } }; ``` 4. **无障碍访问** ```html <input aria-invalid="true" aria-describedby="error-msg"> <div id="error-msg" class="error">无效输入</div> ``` 5. **安全增强** - 防范XSS:对用户输入内容进行转义处理 ```javascript function escapeHtml(text) { const map = { '<': '<', '>': '>' }; return text.replace(/[<>]/g, m => map[m]); } ``` ## 四、进阶优化方案 1. **动态校验规则** ```javascript const getAgeRules = (minAge) => ({ test: value => value >= minAge, message: `年龄需满${minAge}周岁` }); ``` 2. **服务端规则同步** ```javascript // 获取服务端下发的校验规则 fetch('/api/validation-rules') .then(res => res.json()) .then(rules => { validationEngine.updateRules(rules); }); ``` 3. **可视化配置工具** 推荐使用[JSON Schema Form](https://json-schema.org/)实现动态表单生成与校验 ## 五、调试与监控 1. 浏览器开发者工具断点调试 2. 日志记录异常输入模式 3. 使用Sentry等工具监控校验异常 > 前端校验必须与后端校验配合使用,才能构建完整的安全防线。建议通过Swagger文档保持前后端校验规则同步,避免逻辑冲突。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值