Vue Element-ui表單校驗


Vue Element-ui表單校驗

基本校驗方法

vue,element-ui表單校驗中通常采用rules進行配置,下文為一個element-ui官方給出的例子,通過為el-form配置rules並且針對對應參數編寫校驗規則即可,如果不采用這種方式,也可以對於字段直接采用oninput="value=value.replace(正則,"替換")"的方式進行輸入的強制規范,當然更推薦前一種,對用戶更加友好

注意el-form-item 的prop屬性一定需要完全對應rules中的某個屬性,同時也要和v-model中的對應

<el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
  <el-form-item label="活動名稱" prop="name">
    <el-input v-model="ruleForm.name"></el-input>
  </el-form-item>
  <el-form-item label="活動區域" prop="region">
    <el-select v-model="ruleForm.region" placeholder="請選擇活動區域">
      <el-option label="區域一" value="shanghai"></el-option>
      <el-option label="區域二" value="beijing"></el-option>
    </el-select>
  </el-form-item>
  <el-form-item label="活動時間" required>
    <el-col :span="11">
      <el-form-item prop="date1">
        <el-date-picker type="date" placeholder="選擇日期" v-model="ruleForm.date1" style="width: 100%;"></el-date-picker>
      </el-form-item>
    </el-col>
    <el-col class="line" :span="2">-</el-col>
    <el-col :span="11">
      <el-form-item prop="date2">
        <el-time-picker placeholder="選擇時間" v-model="ruleForm.date2" style="width: 100%;"></el-time-picker>
      </el-form-item>
    </el-col>
  </el-form-item>
  <el-form-item label="即時配送" prop="delivery">
    <el-switch v-model="ruleForm.delivery"></el-switch>
  </el-form-item>
  <el-form-item label="活動性質" prop="type">
    <el-checkbox-group v-model="ruleForm.type">
      <el-checkbox label="美食/餐廳線上活動" name="type"></el-checkbox>
      <el-checkbox label="地推活動" name="type"></el-checkbox>
      <el-checkbox label="線下主題活動" name="type"></el-checkbox>
      <el-checkbox label="單純品牌曝光" name="type"></el-checkbox>
    </el-checkbox-group>
  </el-form-item>
  <el-form-item label="特殊資源" prop="resource">
    <el-radio-group v-model="ruleForm.resource">
      <el-radio label="線上品牌商贊助"></el-radio>
      <el-radio label="線下場地免費"></el-radio>
    </el-radio-group>
  </el-form-item>
  <el-form-item label="活動形式" prop="desc">
    <el-input type="textarea" v-model="ruleForm.desc"></el-input>
  </el-form-item>
  <el-form-item>
    <el-button type="primary" @click="submitForm('ruleForm')">立即創建</el-button>
    <el-button @click="resetForm('ruleForm')">重置</el-button>
  </el-form-item>
</el-form>
<script>
  export default {
    data() {
      return {
        ruleForm: {
          name: '',
          region: '',
          date1: '',
          date2: '',
          delivery: false,
          type: [],
          resource: '',
          desc: ''
        },
        rules: {
          name: [
            { required: true, message: '請輸入活動名稱', trigger: 'blur' },
            { min: 3, max: 5, message: '長度在 3 到 5 個字符', trigger: 'blur' }
          ],
          region: [
            { required: true, message: '請選擇活動區域', trigger: 'change' }
          ],
          date1: [
            { type: 'date', required: true, message: '請選擇日期', trigger: 'change' }
          ],
          date2: [
            { type: 'date', required: true, message: '請選擇時間', trigger: 'change' }
          ],
          type: [
            { type: 'array', required: true, message: '請至少選擇一個活動性質', trigger: 'change' }
          ],
          resource: [
            { required: true, message: '請選擇活動資源', trigger: 'change' }
          ],
          desc: [
            { required: true, message: '請填寫活動形式', trigger: 'blur' }
          ]
        }
      };
    },
    methods: {
      submitForm(formName) {
        this.$refs[formName].validate((valid) => {
          if (valid) {
            alert('submit!');
          } else {
            console.log('error submit!!');
            return false;
          }
        });
      },
      resetForm(formName) {
        this.$refs[formName].resetFields();
      }
    }
  }
</script>

rules中直接配置的具體參數

目前接觸下來有max,min,pattern,type,required,validator等,需要注意表單原始輸入均為字符串,因此max和min指的是字符串長度,pattern為根據正則進行判斷,type直接指定類型,required必填不再贅述,validator為自定義驗證規則,其他部分len為指定確切長度(與min、max一起使用時len優先),whitespace驗證是否只有空格,transform為某些時刻在驗證之前轉換輸入提供的函數,使用方法如下:

transform: [
  {type: 'enum', enum: [2,4,6], message: `結果不存在`, trigger: ['change', 'blur'], transform(value) {return Number(value * 2)}}
]

message為校驗不通過時的提示,asyncValidator為自定義異步驗證功能

rules中type的可識別的類型值如下:string、number、bollean、integer、float、array、enum、url等

  • string:類型必須為stringtype 默認是 `string
// 校驗
string: [
  {type: 'string', message: `請輸入字符串`, trigger: 'blur'}
]

<el-form-item label="測試字段" prop="string">
  <el-input v-model.number="form.string" placeholder="請輸入"></el-input>
</el-form-item>
  • number:類型必須為number
// 校驗
number: [
  {type: 'number', message: `請輸入數字`, trigger: 'blur'}
]

<el-form-item label="測試字段" prop="number">
  <el-input v-model="form.number" placeholder="請輸入"></el-input>
</el-form-item>
  • boolean:類型必須為boolean
// 校驗
boolean: [
  {type: 'boolean', message: `請輸入數字`, trigger: 'change'}
]

<el-form-item label="測試字段" prop="boolean">
  <el-select v-model="form.boolean" placeholder="請選擇">
    <el-option label="true" :value="true"></el-option>
    <el-option label="false" :value="false"></el-option>
    <el-option label="字符串" :value="'zifuchuan'"></el-option>
  </el-select>
</el-form-item>
  • integer:類型必須為 number 且為整數。
// 校驗
integer: [
  {type: 'integer', message: `請輸入整數`, trigger: 'blur'}
]
  • float:類型必須為 number 且為浮點數。
// 校驗
float: [
  {type: 'float', message: `請輸入浮點數`, trigger: 'blur'}
]
  • array:類型必須為數組
// 校驗
array: [
  {type: 'array', message: `請選擇數組`, trigger: 'change'}
]

<el-form-item label="測試字段" prop="array">
  <el-select v-model="form.array" placeholder="請選擇">
    <el-option label="數組" :value="[1,2,3]"></el-option>
    <el-option label="false" :value="false"></el-option>
    <el-option label="字符串" :value="'zifuchuan'"></el-option>
  </el-select>
</el-form-item>
  • enum:值必須存在於中 enum
// 校驗
enum: [
  {type: 'enum', enum: ['aaa', 'bbb'], message: `不存在enum中`, trigger: 'change'}
]
  • url:類型必須為 url
// 校驗
url: [
  {type: 'url', message: `請輸入正確的url`, trigger: 'change'}
]
  • email:類型必須為 email
  • method:類型必須為 function
  • regexp:必須是 RegExp 創建新時不會產生異常的的實例或字符串 RegExp
  • object:類型必須為 object
  • date:類型必須為 date
  • hex:類型必須為 hex
  • any:任何類型

遇到的坑

需求為對經緯度進行校驗,本來想着直接通過type:float處理,后來發現校驗怎么都通不過,后來發現表單直接輸入的時候是字符串,沒法進行這個規則處理,需要在前面el-form-item的內部表單的v-model屬性后面加上.number,比如

<el-form-item label="" prop="latitude">
    <el-input v-model.number="form.latitude" type="" placeholder=""/>
</el-form-item>

但是這個方式有一個問題,經過v-model.number處理后表單中是沒有辦法輸入小數點的,只能輸入整數,所以就變得非常難辦,只能采用自定義規則去處理,規則如下

image-20211123121149382

在使用自定義規則的時候需要注意,自定義規則寫在data()里但不是data(){return{}}里,這點非常關鍵,同時自定義規則中除了所有錯誤,最后一定要加上一個callback(),否則回調無法正常進行,以下為官方的一個自定義驗證規則例子

<el-form :model="ruleForm" status-icon :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
  <el-form-item label="密碼" prop="pass">
    <el-input type="password" v-model="ruleForm.pass" autocomplete="off"></el-input>
  </el-form-item>
  <el-form-item label="確認密碼" prop="checkPass">
    <el-input type="password" v-model="ruleForm.checkPass" autocomplete="off"></el-input>
  </el-form-item>
  <el-form-item label="年齡" prop="age">
    <el-input v-model.number="ruleForm.age"></el-input>
  </el-form-item>
  <el-form-item>
    <el-button type="primary" @click="submitForm('ruleForm')">提交</el-button>
    <el-button @click="resetForm('ruleForm')">重置</el-button>
  </el-form-item>
</el-form>
<script>
  export default {
    data() {
      //函數都寫在data()中而不是return中
      var checkAge = (rule, value, callback) => {
        if (!value) {
          return callback(new Error('年齡不能為空'));
        }
        setTimeout(() => {
          if (!Number.isInteger(value)) {
            callback(new Error('請輸入數字值'));
          } else {
            if (value < 18) {
              callback(new Error('必須年滿18歲'));
            } else {
              callback();//最關鍵的一個callback
            }
          }
        }, 1000);
      };
      var validatePass = (rule, value, callback) => {
        if (value === '') {
          callback(new Error('請輸入密碼'));
        } else {
          if (this.ruleForm.checkPass !== '') {
            this.$refs.ruleForm.validateField('checkPass');
          }
          callback();
        }
      };
      var validatePass2 = (rule, value, callback) => {
        if (value === '') {
          callback(new Error('請再次輸入密碼'));
        } else if (value !== this.ruleForm.pass) {
          callback(new Error('兩次輸入密碼不一致!'));
        } else {
          callback();
        }
      };
      return {
        ruleForm: {
          pass: '',
          checkPass: '',
          age: ''
        },
        rules: {
          pass: [
            { validator: validatePass, trigger: 'blur' }
          ],
          checkPass: [
            { validator: validatePass2, trigger: 'blur' }
          ],
          age: [
            { validator: checkAge, trigger: 'blur' }
          ]
        }
      };
    },
    methods: {
      submitForm(formName) {
        this.$refs[formName].validate((valid) => {
          if (valid) {
            alert('submit!');
          } else {
            console.log('error submit!!');
            return false;
          }
        });
      },
      resetForm(formName) {
        this.$refs[formName].resetFields();
      }
    }
  }
</script>

網絡上其他校驗規則

1、是否合法IP地址

export function validateIP(rule, value,callback) {
  if(value==''||value==undefined||value==null){
    callback();
  }else {
    const reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/;
    if ((!reg.test(value)) && value != '') {
      callback(new Error('請輸入正確的IP地址'));
    } else {
      callback();
    }
  }
}

2、是否手機號碼或者固話

export function validatePhoneTwo(rule, value, callback) {
  const reg = /^((0\d{2,3}-\d{7,8})|(1[34578]\d{9}))$/;;
  if (value == '' || value == undefined || value == null) {
    callback();
  } else {
    if ((!reg.test(value)) && value != '') {
      callback(new Error('請輸入正確的電話號碼或者固話號碼'));
    } else {
      callback();
    }
  }
}

3、是否固話

export function validateTelphone(rule, value,callback) {
  const reg =/0\d{2,3}-\d{7,8}/;
  if(value==''||value==undefined||value==null){
    callback();
  }else {
    if ((!reg.test(value)) && value != '') {
      callback(new Error('請輸入正確的固定電話)'));
    } else {
      callback();
    }
  }
}

4、是否手機號碼

export function validatePhone(rule, value,callback) {
  const reg =/^[1][3-9][0-9]{9}$/;
  if(value==''||value==undefined||value==null){
    callback();
  }else {
    if ((!reg.test(value)) && value != '') {
      callback(new Error('請輸入正確的電話號碼'));
    } else {
      callback();
    }
  }
}

5、是否身份證號碼

export function validateIdNo(rule, value,callback) {
  const reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
  if(value==''||value==undefined||value==null){
    callback();
  }else {
    if ((!reg.test(value)) && value != '') {
      callback(new Error('請輸入正確的身份證號碼'));
    } else {
      callback();
    }
  }
}

6、是否郵箱

export function validateEMail(rule, value,callback) {
  const reg =/^([a-zA-Z0-9]+[-_\.]?)+@[a-zA-Z0-9]+\.[a-z]+$/;
  if(value==''||value==undefined||value==null){
    callback();
  }else{
    if (!reg.test(value)){
      callback(new Error('請輸入正確的郵箱'));
    } else {
      callback();
    }
  }
}

7、合法url

export function validateURL(url) {
  const urlregex = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/;
  return urlregex.test(url);
}

8、驗證內容是否包含英文數字以及下划線

export function isPassword(rule, value, callback) {
  const reg =/^[_a-zA-Z0-9]+$/;
  if(value==''||value==undefined||value==null){
    callback();
  } else {
    if (!reg.test(value)){
      callback(new Error('僅由英文字母,數字以及下划線組成'));
    } else {
      callback();
    }
  }
}

9、自動檢驗數值的范圍

export function checkMax20000(rule, value, callback) {
  if (value == '' || value == undefined || value == null) {
    callback();
  } else if (!Number(value)) {
    callback(new Error('請輸入[1,20000]之間的數字'));
  } else if (value < 1 || value > 20000) {
    callback(new Error('請輸入[1,20000]之間的數字'));
  } else {
    callback();
  }
}

10、驗證數字輸入框最大數值

export function checkMaxVal(rule, value,callback) {
  if (value < 0 || value > 最大值) {
    callback(new Error('請輸入[0,最大值]之間的數字'));
  } else {
    callback();
  }
}

11、驗證是否1-99之間

export function isOneToNinetyNine(rule, value, callback) {
  if (!value) {
    return callback(new Error('輸入不可以為空'));
  }
  setTimeout(() => {
    if (!Number(value)) {
      callback(new Error('請輸入正整數'));
    } else {
      const re = /^[1-9][0-9]{0,1}$/;
      const rsCheck = re.test(value);
      if (!rsCheck) {
        callback(new Error('請輸入正整數,值為【1,99】'));
      } else {
        callback();
      }
    }
  }, 0);
}

12、驗證是否整數

export function isInteger(rule, value, callback) {
  if (!value) {
    return callback(new Error('輸入不可以為空'));
  }
  setTimeout(() => {
    if (!Number(value)) {
      callback(new Error('請輸入正整數'));
    } else {
      const re = /^[0-9]*[1-9][0-9]*$/;
      const rsCheck = re.test(value);
      if (!rsCheck) {
        callback(new Error('請輸入正整數'));
      } else {
        callback();
      }
    }
  }, 0);
}

13、驗證是否整數,非必填

export function isIntegerNotMust(rule, value, callback) {
  if (!value) {
    callback();
  }
  setTimeout(() => {
    if (!Number(value)) {
      callback(new Error('請輸入正整數'));
    } else {
      const re = /^[0-9]*[1-9][0-9]*$/;
      const rsCheck = re.test(value);
      if (!rsCheck) {
        callback(new Error('請輸入正整數'));
      } else {
        callback();
      }
    }
  }, 1000);
}

14、 驗證是否是[0-1]的小數

export function isDecimal(rule, value, callback) {
  if (!value) {
    return callback(new Error('輸入不可以為空'));
  }
  setTimeout(() => {
    if (!Number(value)) {
      callback(new Error('請輸入[0,1]之間的數字'));
    } else {
      if (value < 0 || value > 1) {
        callback(new Error('請輸入[0,1]之間的數字'));
      } else {
        callback();
      }
    }
  }, 100);
}

15、 驗證是否是[1-10]的小數,即不可以等於0

export function isBtnOneToTen(rule, value, callback) {
  if (typeof value == 'undefined') {
    return callback(new Error('輸入不可以為空'));
  }
  setTimeout(() => {
    if (!Number(value)) {
      callback(new Error('請輸入正整數,值為[1,10]'));
    } else {
      if (!(value == '1' || value == '2' || value == '3' || value == '4' || value == '5' || value == '6' || value == '7' || value == '8' || value == '9' || value == '10')) {
        callback(new Error('請輸入正整數,值為[1,10]'));
      } else {
        callback();
      }
    }
  }, 100);
}

16、驗證是否是[1-100]的小數,即不可以等於0

export function isBtnOneToHundred(rule, value, callback) {
  if (!value) {
    return callback(new Error('輸入不可以為空'));
  }
  setTimeout(() => {
    if (!Number(value)) {
      callback(new Error('請輸入整數,值為[1,100]'));
    } else {
      if (value < 1 || value > 100) {
        callback(new Error('請輸入整數,值為[1,100]'));
      } else {
        callback();
      }
    }
  }, 100);
}

17、驗證是否是[0-100]的小數

export function isBtnZeroToHundred(rule, value, callback) {
  if (!value) {
    return callback(new Error('輸入不可以為空'));
  }
  setTimeout(() => {
    if (!Number(value)) {
      callback(new Error('請輸入[1,100]之間的數字'));
    } else {
      if (value < 0 || value > 100) {
        callback(new Error('請輸入[1,100]之間的數字'));
      } else {
        callback();
      }
    }
  }, 100);
}

18、驗證端口是否在[0,65535]之間

export function isPort(rule, value, callback) {
  if (!value) {
    return callback(new Error('輸入不可以為空'));
  }
  setTimeout(() => {
    if (value == '' || typeof(value) == undefined) {
      callback(new Error('請輸入端口值'));
    } else {
      const re = /^([0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$/;
      const rsCheck = re.test(value);
      if (!rsCheck) {
        callback(new Error('請輸入在[0-65535]之間的端口值'));
      } else {
        callback();
      }
    }
  }, 100);
}

19、驗證端口是否在[0,65535]之間,非必填,isMust表示是否必填

export function isCheckPort(rule, value, callback) {
  if (!value) {
    callback();
  }
  setTimeout(() => {
    if (value == '' || typeof(value) == undefined) {
      //callback(new Error('請輸入端口值'));
    } else {
      const re = /^([0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$/;
      const rsCheck = re.test(value);
      if (!rsCheck) {
        callback(new Error('請輸入在[0-65535]之間的端口值'));
      } else {
        callback();
      }
    }
  }, 100);
}

20、小寫字母

export function validateLowerCase(val) {
  const reg = /^[a-z]+$/;
  return reg.test(val);
}

22、兩位小數驗證

const validateValidity = (rule, value, callback) => {
  if (!/(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/.test(value)) {
    callback(new Error('最多兩位小數!!!'));
  } else {
    callback();
  }
};

23、是否大寫字母

export function validateUpperCase(val) {
  const reg = /^[A-Z]+$/;
  return reg.test(val);
}

24、是否大小寫字母

export function validatAlphabets(val) {
  const reg = /^[A-Za-z]+$/;
  return reg.test(val);
}

25、密碼校驗

export const validatePsdReg = (rule, value, callback) => {
  if (!value) {
    return callback(new Error('請輸入密碼'))
  }
  if (!/^(?![\d]+$)(?![a-zA-Z]+$)(?![^\da-zA-Z]+$)([^\u4e00-\u9fa5\s]){6,20}$/.test(value)) {
    callback(new Error('請輸入6-20位英文字母、數字或者符號(除空格),且字母、數字和標點符號至少包含兩種'))
  } else {
    callback()
  }
}

26、中文校驗

export const validateContacts = (rule, value, callback) => {
  if (!value) {
    return callback(new Error('請輸入中文'))
  }
  if (!/^[\u0391-\uFFE5A-Za-z]+$/.test(value)) {
    callback(new Error('不可輸入特殊字符'))
  } else {
    callback()
  }
}

27、身份證校驗

export const ID = (rule, value, callback) => {
    if (!value) {
      return callback(new Error('身份證不能為空'))
    }
    if (! /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(value)) {
      callback(new Error('請輸入正確的二代身份證號碼'))
    } else {
      callback()
    }
}

28、 賬號校驗

export const validateCode = (rule, value, callback) => {
  if (!value) {
    return callback(new Error('請輸入賬號'))
  }
  if (!/^(?![0-9]*$)(?![a-zA-Z]*$)[a-zA-Z0-9]{6,20}$/.test(value)) {
    callback(new Error('賬號必須為6-20位字母和數字組合'))
  } else {
    callback()
  }
}

29 、純數字校驗

export const validateNumber = (rule, value, callback) => {
    let numberReg = /^\d+$|^\d+[.]?\d+$/
    if (value !== '') {
        if (!numberReg.test(value)) {
            callback(new Error('請輸入數字'))
        } else {
            callback()
        }
    } else {
        callback(new Error('請輸入值'))
    }
}

30、最多一位小數

const onePoint = (rule, value, callback) => {
  if (!/^[0-9]+([.]{1}[0-9]{1})?$/.test(value)) {
    callback(new Error('最多一位小數!!!'));
  } else {
    callback();
  }
};


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM