Vant UI + VeeValidate2.x實(shí)現(xiàn)表單驗(yàn)證

痛點(diǎn)

Vant沒(méi)有提供內(nèi)置的表單驗(yàn)證航徙,但是Field輸入框提供了errorerror-message這兩個(gè)API。
https://youzan.github.io/vant/#/zh-CN/field

image.png

<van-cell-group>
  <van-field
    v-model="username"
    label="用戶名"
    placeholder="請(qǐng)輸入用戶名"
    error
  />
  <van-field
    v-model="phone"
    label="手機(jī)號(hào)"
    placeholder="請(qǐng)輸入手機(jī)號(hào)"
    error-message="手機(jī)號(hào)格式錯(cuò)誤"
  />
</van-cell-group>

雖然這樣也可以自己手動(dòng)驗(yàn)證蓝仲,但是對(duì)于頁(yè)面中有多個(gè)驗(yàn)證時(shí)弄起來(lái)還是比較煩的办成,最好是能有一個(gè)驗(yàn)證插件統(tǒng)一搞定這一切泡态。

VeeValidate

基于上面的痛點(diǎn),我在項(xiàng)目中使用了 VeeValidate 來(lái)作為驗(yàn)證插件迂卢,當(dāng)然還有一些其他的驗(yàn)證插件某弦,這個(gè)看個(gè)人喜好,你想用什么都可以而克,反正思路都是一樣的靶壮。

//VeeValidate的基礎(chǔ)用法
<input v-validate="'required|email'" name="email" type="text">
<span>{{ errors.first('email') }}</span>

https://baianat.github.io/vee-validate/guide/getting-started.html#basic-example

開(kāi)搞

1.安裝VeeValidate

npm install vee-validate --save

2.修改main

我這里是新建了一個(gè)validate.js文件來(lái)單獨(dú)處理的,因?yàn)槲疫€有一些其他自定義的驗(yàn)證员萍,如果只是測(cè)試直接在main.js中修改就好了腾降。

image.png
import Vue from "vue";
import VeeValidate, { Validator } from "vee-validate";
Vue.use(VeeValidate);

3.頁(yè)面中使用

<van-field
          v-model="form.contactPhone"
          v-validate="'required|mobile'"   //mobile是我自定義的
          name="contactPhone" //特別注意一定得給name
          :error-message="errors.first('contactPhone')" //錯(cuò)誤信息
          :error="errors.has('contactPhone')" //是否有錯(cuò)誤
          label="聯(lián)系人電話"
          placeholder="請(qǐng)輸入手機(jī)號(hào)碼"
        >

mobile自定義驗(yàn)證代碼,我也把常用的正則表達(dá)式整理了一下碎绎。https://form-validate.github.io/form-validate/

// 手機(jī)號(hào)碼驗(yàn)證
Validator.extend("mobile", {
  getMessage: () => `請(qǐng)輸入正確的手機(jī)號(hào)碼`,
  validate: value =>
    value.length === 11 &&
    /^(((13[0-9]{1})|(14[57]{1})|(15[012356789]{1})|(17[03678]{1})|(18[0-9]{1})|(19[89]{1})|(16[6]{1}))+\d{8})$/.test(
      value
    )
});

4. 查看效果

image.png

5. 漢化

import zh_CN from "vee-validate/dist/locale/zh_CN";
Validator.localize("zh_CN", zh_CN);

image.png

中文是顯示了螃壤,但是提示會(huì)把input框的name值帶上,看著特別的別扭筋帖,下面就來(lái)把它搞掉奸晴。

6. 搞掉丑陋的提示

先去看官網(wǎng)的中文文件是怎么寫的,然后進(jìn)行修改
https://github.com/baianat/vee-validate/blob/master/locale/zh_CN.js

image.png

源碼中只需要把field設(shè)置成空就好了日麸,或者直接刪除蚁滋,我這里選擇設(shè)置成空,因?yàn)閯h除的話比較多,有點(diǎn)麻煩辕录,如果以后還需要改什么也不太方便睦霎。

7. 完整代碼---validate.js文件

import Vue from "vue";
import VeeValidate, { Validator } from "vee-validate";

Vue.use(VeeValidate);

const formatFileSize = function(size) {
  let units = ["Byte", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
  let threshold = 1024;
  size = Number(size) * threshold;
  let i = size === 0 ? 0 : Math.floor(Math.log(size) / Math.log(threshold));
  return (size / Math.pow(threshold, i)).toFixed(2) * 1 + " " + units[i];
};
const fieldName = ""; //原來(lái)的i18n的fieldName會(huì)顯示綁定的name值,就是英文走诞,實(shí)際項(xiàng)目中不需要

Validator.localize("zh_CN", {
  name: "zh_CN",
  attributes: {},
  messages: {
    _default: () => `${fieldName}無(wú)效`,
    after: (field, [target]) => `${fieldName}必須在${target}之后`,
    alpha_dash: () => `${fieldName}能夠包含字母數(shù)字字符副女、破折號(hào)和下劃線`,
    alpha_num: () => `${fieldName}只能包含字母數(shù)字字符`,
    alpha_spaces: () => `${fieldName}只能包含字母字符和空格`,
    alpha: () => `${fieldName}只能包含字母字符`,
    before: (field, [target]) => `${fieldName}必須在${target}之前`,
    between: (field, [min, max]) => `${fieldName}必須在${min}與${max}之間`,
    confirmed: (field, [confirmedField]) =>
      `${fieldName}不能和${confirmedField}匹配`,
    credit_card: () => `${fieldName}格式錯(cuò)誤`,
    date_between: (field, [min, max]) => `${fieldName}必須在${min}和${max}之間`,
    date_format: (field, [format]) => `${fieldName}必須符合${format}格式`,
    decimal: (field, [decimals = "*"] = []) =>
      `${fieldName}必須是數(shù)字,且能夠保留${
        decimals === "*" ? "" : decimals
      }位小數(shù)`,
    digits: (field, [length]) =>
      `${fieldName}必須是數(shù)字蚣旱,且精確到${length}位數(shù)`,
    dimensions: (field, [width, height]) =>
      `${fieldName}必須在${width}像素與${height}像素之間`,
    email: () => `${fieldName}不是一個(gè)有效的郵箱`,
    ext: () => `${fieldName}不是一個(gè)有效的文件`,
    image: () => `${fieldName}不是一張有效的圖片`,
    included: () => `${fieldName}不是一個(gè)有效值`,
    integer: () => `${fieldName}必須是整數(shù)`,
    ip: () => `${fieldName}不是一個(gè)有效的地址`,
    length: (field, [length, max]) => {
      if (max) {
        return `${fieldName}長(zhǎng)度必須在${length}到${max}之間`;
      }
      return `${fieldName}長(zhǎng)度必須為${length}`;
    },
    max: (field, [length]) => `${fieldName}不能超過(guò)${length}個(gè)字符`,
    max_value: (field, [max]) => `${fieldName}必須小于或等于${max}`,
    mimes: () => `${fieldName}不是一個(gè)有效的文件類型`,
    min: (field, [length]) => `${fieldName}必須至少有${length}個(gè)字符`,
    min_value: (field, [min]) => `${fieldName}必須大于或等于${min}`,
    excluded: () => `${fieldName}不是一個(gè)有效值`,
    numeric: () => `${fieldName}只能包含數(shù)字字符`,
    regex: () => `${fieldName}格式無(wú)效`,
    required: () => `${fieldName}不能為空`,
    size: (field, [size]) => `${fieldName}必須小于${formatFileSize(size)}`,
    url: () => `${fieldName}不是一個(gè)有效的url`
  }
});

// 手機(jī)號(hào)碼驗(yàn)證
Validator.extend("mobile", {
  getMessage: () => `請(qǐng)輸入正確的手機(jī)號(hào)碼`,
  validate: value =>
    value.length === 11 &&
    /^(((13[0-9]{1})|(14[57]{1})|(15[012356789]{1})|(17[03678]{1})|(18[0-9]{1})|(19[89]{1})|(16[6]{1}))+\d{8})$/.test(
      value
    )
});

8. 最終效果

image.png

9. 補(bǔ)充

一般都是點(diǎn)提交的時(shí)候會(huì)驗(yàn)證是否有錯(cuò)誤碑幅,可以使用validateAll來(lái)驗(yàn)證,當(dāng)然也可以指定驗(yàn)證塞绿,具體的可以看官方文檔沟涨。

   methods: {
    onSubmit() {
      // 驗(yàn)證
      this.$validator.validateAll().then(result => {
        if (result) {
         //axios提交
        }
      });
    }
  }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市异吻,隨后出現(xiàn)的幾起案子裹赴,更是在濱河造成了極大的恐慌,老刑警劉巖诀浪,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棋返,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡雷猪,警方通過(guò)查閱死者的電腦和手機(jī)睛竣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)求摇,“玉大人射沟,你說(shuō)我怎么就攤上這事∮刖常” “怎么了验夯?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)嚷辅。 經(jīng)常有香客問(wèn)我簿姨,道長(zhǎng),這世上最難降的妖魔是什么簸搞? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任扁位,我火速辦了婚禮,結(jié)果婚禮上趁俊,老公的妹妹穿的比我還像新娘域仇。我一直安慰自己,他們只是感情好寺擂,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布暇务。 她就那樣靜靜地躺著泼掠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪垦细。 梳的紋絲不亂的頭發(fā)上择镇,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音括改,去河邊找鬼腻豌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛嘱能,可吹牛的內(nèi)容都是我干的吝梅。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼惹骂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼苏携!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起对粪,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤右冻,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后衩侥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體国旷,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡矛物,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年茫死,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片履羞。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡峦萎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出忆首,到底是詐尸還是另有隱情爱榔,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布糙及,位于F島的核電站详幽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏浸锨。R本人自食惡果不足惜唇聘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望柱搜。 院中可真熱鬧迟郎,春花似錦、人聲如沸聪蘸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至控乾,卻和暖如春么介,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜕衡。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工夭拌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衷咽。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓鸽扁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親镶骗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子桶现,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 學(xué)習(xí)資料 vue github (里面包含了vue, vuex, vue-cli等源碼) vue-cli 官網(wǎng) v...
    pauljun閱讀 6,057評(píng)論 2 17
  • 1-------- 走進(jìn)前端 2-------- jQuery 3-------- CSS 4-------- A...
    依依玖玥閱讀 2,319評(píng)論 0 34
  • # Awesome Python [![Awesome](https://cdn.rawgit.com/sindr...
    emily_007閱讀 2,202評(píng)論 0 3
  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個(gè) Awesome - XXX 系列...
    小邁克閱讀 2,963評(píng)論 1 3
  • 人海飄零認(rèn)溷茵,卅年風(fēng)雨積層塵鼎姊。生平已忍青云渺骡和,意氣何堪白發(fā)新。 夢(mèng)蝶莊周非說(shuō)劍相寇,聞韶孔子忽之陳慰于。元知萬(wàn)物皆芻狗,...
    抱樸堂主閱讀 94評(píng)論 0 0