欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vant(ZanUi)結(jié)合async-validator實(shí)現(xiàn)表單驗(yàn)證的方法

 更新時(shí)間:2018年12月06日 15:09:58   作者:asseek  
這篇文章主要介紹了vant(ZanUi)結(jié)合async-validator實(shí)現(xiàn)表單驗(yàn)證的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

最近在開(kāi)發(fā)一個(gè)移動(dòng)端商城項(xiàng)目,用到了有贊的 vant ,因?yàn)樽罱蠖疾捎?element ui 在做PC端的東西,對(duì)比來(lái)說(shuō),vant的完成度還是偏低了點(diǎn),很多細(xì)節(jié)都雖然都實(shí)現(xiàn)了接口,但是想使用得自己去想辦法,沒(méi)辦法拿來(lái)即用。昨天用到 Uploader 圖片上傳 如是,提供了file回調(diào),卻沒(méi)有提供上傳功能,我必須給他加2個(gè)函數(shù)實(shí)現(xiàn)axios提交才能用,還有今天用到表單驗(yàn)證這塊,它的 Field組件 雖然給了error-message的錯(cuò)誤提示接口,但是沒(méi)有內(nèi)置表單驗(yàn)證功能。

element ui 采用async-validator 實(shí)現(xiàn)表單驗(yàn)證,我也基于這個(gè)組件進(jìn)行擴(kuò)展,async-validator不支持細(xì)?;?yàn)證,于是先對(duì)它進(jìn)行擴(kuò)展

validator.js

import asyncValidator from 'async-validator'

class validator {
 /**
 * 構(gòu)造
 * @param rules object async-validator rules
 * @param data 初始對(duì)象
 */
 constructor(rules, data) {
 this.setData(data);
 this.setRules(rules);
 }

 /**
 * 重新定義初始對(duì)象
 * 也可以直接修改實(shí)例的data
 * validator.data = newData
 * @param data
 */
 setData(data) {
 this.data = data;
 }

 /**
 * 設(shè)定規(guī)則
 * @param rules rules object async-validator rules
 * @param cover 是否替換舊規(guī)則
 */
 setRules(rules, {cover} = {}) {
 if (cover === undefined || cover) {
  this.validators = {};
 }
 for (let attr in rules) {
  const rule = {};
  rule[attr] = rules[attr];
  this.validators[attr] = new asyncValidator(rule);
 }
 }

 /**
 * 執(zhí)行驗(yàn)證
 * @param callback(errors, fields)
 * @param data 可選 傳空將驗(yàn)證構(gòu)造data 傳string或數(shù)組驗(yàn)證構(gòu)造data的響應(yīng)字段
 * 以上參數(shù)順序可互轉(zhuǎn)
 */
 validate(callback, data) {
 let cb,d;
 if (typeof callback === 'function' ){
  cb = callback;
  d = data;
 }else if (typeof data === 'function' ){
  cb = data;
  d = callback;
 }

 let _d = d;

 if (this.data) {
  if (!d) {
  _d = this.data;
  } else if (typeof d === 'string') {
  _d = {};
  _d[d] = this.data[d]
  } else if (Array.isArray(d)) {
  _d = {};
  d.forEach(attr => {
   _d[attr] = this.data[attr]
  })
  }
 }

 const err = [];

 if (_d) {
  for (let attr in _d) {
  if (this.validators[attr]) {
   const o = {};
   o[attr] = _d[attr];
   this.validators[attr].validate(o, (error) => {
   if (error) {
    err.push(error[0])
   }
   })
  }
  }
 }

 cb && cb(err.length > 0, err)

 }
}

export default function (rules, data) {
 return new validator(rules, data)
}

demo.vue

<template>
 <div>
 <van-cell-group>
  <van-field
   placeholder="名稱(chēng)/姓名"
   label="名稱(chēng)"
   v-model="data.name"
   :error-message="errorMsg.name"
  ></van-field>
  <van-field
   type="tel"
   placeholder="請(qǐng)輸入手機(jī)號(hào)碼"
   label="手機(jī)"
   v-model="data.mobile"
   :error-message="errorMsg.mobile"
   @click-icon="data.mobile = ''"
   icon="clear"
  ></van-field>
  <van-field
   center
   v-model="data.code"
   label="短信驗(yàn)證碼"
   placeholder="請(qǐng)輸入驗(yàn)證碼"
   icon="clear"
   :error-message="errorMsg.code"
   @click-icon="data.code = ''"
  >
  <van-button
   slot="button"
   size="small"
   :disabled="countdown > 0"
   @click="sendMobileCode"
   type="primary">
   {{ countdown ? countdown + 's' : '發(fā)送'}}
  </van-button>
  </van-field>
 </van-cell-group>
 <div class="pad-all mar-top">
  <van-button
   block
   type="primary"
   @click="submit">
  立即注冊(cè)
  </van-button>
  <van-button
   block
   class="mar-top"
   @click="reset">
  重置
  </van-button>
 </div>
 </div>
</template>
<script>
 import {Field, CellGroup, Cell, Button, Toast} from 'vant';
 import validator from './validator.js'

 export default {
 name: 'Demo',
 components: {
  [Field.name]: Field,
  [Button.name]: Button,
  [Cell.name]: Cell,
 },
 data() {
  return {
  countdown: 0,
  data: {
   name: '',
   mobile: '',
   code: '',
  },
  errorMsg: {
   name: '',
   mobile: '',
   code: '',
  },
  rules: {
   name: [
   {required: true, message: '請(qǐng)輸入名稱(chēng)'}
   ],
   mobile: [
   {
    validator: (rule, value, callback) => {
    if (!value) {
     callback('請(qǐng)輸入手機(jī)號(hào)碼');
    } else if (/^[1][0-9]{10}$/.test(value)) {
     callback();
    } else {
     callback('請(qǐng)輸入正確的手機(jī)號(hào)碼');
    }
    }
   }
   ],
   code: [
   {required: true, message: '請(qǐng)輸入驗(yàn)證碼'}
   ]
  },
  }
 },
 methods: {
  sendMobileCode() {
  this.validate(errors => {
   if (!errors) {
   Toast('發(fā)送成功');
   this.countdown = 60;
   this.countdownSubtract();
   }
  }, 'mobile')
  },
  countdownSubtract() {
  if (this.countdown > 0) {
   setTimeout(() => {
   this.countdown -= 1;
   this.countdownSubtract()
   }, 1000)
  }
  },
  /**
  * 清除驗(yàn)證提示
  * @param attrs
  */
  resetField(attrs) {
  attrs = !attrs ? Object.keys(this.errorMsg) : ( Array.isArray(attrs) ? attrs : [attrs]);
  attrs.forEach(attr => {
   this.errorMsg[attr] = ''
  })
  },
  /**
  * 驗(yàn)證方法
  * @param callback
  * @param data
  */
  validate(callback, data) {
  this.validator.validate((errors, fields) => {
   this.resetField();
   if (errors) {
   fields.forEach(item => {
    this.errorMsg[item.field] = item.message
   })
   }
   callback && callback(errors, fields)
  }, data);
  },
  submit() {
  this.validate((errors, fields) => {

  })
  },
  reset() {
  this.data = {
   name: '',
   code: '',
   mobile: '',
  };
  this.validator.setData(this.data);
  this.resetField();
  },
 },
 created() {
  this.validator = validator(this.rules, this.data);
 },
 }
</script>

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論