首頁 > web前端 > js教程 > 主體

vue中Element表單驗證的使用方法

不言
發布: 2018-07-14 15:54:49
原創
3854 人瀏覽過

這篇文章主要介紹了關於vue中Element表單驗證的使用方法,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

Element表單驗證(2)

上篇講的是async-validator的基本要素,那麼,如何使用到Element中以及怎樣優雅地使用,就在本篇。

上篇講到async-validator由3大部分組成

  • Options

  • Validate

  • Rules

##基本驗證流程如下

  • 先依照rule的規則,制定每個欄位的規範,產生rules

  • 根據rules產生驗證器

    const validator = new Validator( rules)

  • 驗證器有驗證函數

    validator.validate(source, callback)

  • source中的字段對應規則中的字段,全都通過或出錯後調用callback

#上面中的

validator.validate對應Element中的this.$refs [refName].validate,只不過改裝過的。而且在Element定義:model='form',那個form就是 sourcesource的欄位名,如source.name就是form.name,那麼只要在設定和source一樣的欄位名稱name,就可以符合中的rules.name

很重要的一點,

rules.欄位名稱要跟source.欄位名稱要一樣才會​​驗證。

<template>
  <el-form :model=&#39;form&#39; ref=&#39;domForm&#39; :rules=&#39;rules&#39;>
    <el-form-item prop=&#39;name&#39; lable=&#39;名字&#39;>
      <el-input v-model=&#39;form.name&#39;>
    </el-form-item>
  </el-form>
</template>
登入後複製
export default {
  data() {
    this.rules = {
      name: { type: &#39;string&#39;, required: true, trigger: &#39;blur&#39; }
    }

    return {
      form: {
        name: &#39;&#39;
      }
    }
  },
  methods: {
    submit() {
      this.$refs.domForm.validate(valid => {
        if (!valid) {
          // 验证不通过
        }

        // 验证通过后的处理...
      })
    }
  }
}
登入後複製

上面中

validate(callback)函數已經加入到form元素DOM節點上的屬性。然後上面還有一個不好的一點。那就是規則的定義方式不夠靈活。

例如我有兩個欄位

firstNamelastNamefirstName是必填的,而lastName是非必填的;且firstName長度要求大於1小於4而lastName要求大於1小於6。那麼就要寫兩個不同的規則,現在只是2個字段而已,沒什麼,如果有很多個不同要求的字段,那要寫很多個不同的規則,也要寫很多個規則?豈不是很煩?能不能復用?

Rules三種定義方式

  • 函數的方式:

    { name(rule, value, callback, source, options) { } }

  • 物件的方式:

    { name: { type: 'string', required: true } }

  • 陣列的方式:

    { name: [{ type: 'string' }, { required: true }] }

函數的方式很強大,如果需要用到

options可以函數的方式,最常用的是物件和陣列的方式。現在推薦幾種複用的方法。

簡單的封裝一些常用的規則

// 返回一个规则数组,必填且字符串长度在2~10之间
export const name = (msg, min = 2, max = 10, required = true) => ([
  { required, message: msg, trigger: &#39;blur&#39; },
  { min, max, message: `长度在${min}~${max}个字符`, trigger: &#39;blur&#39; }
])

// 邮箱
export const email = (required = true) => ([
  { required, message: &#39;请输入邮箱&#39;, trigger: &#39;blur&#39; },
  { type: &#39;email&#39;, message: &#39;邮箱格式不对&#39;, trigger: &#39;blur&#39; }
])

/* 自定义验证规则 */

// 大于等于某个整数
const biggerAndNum = num => (rule, v, cb) => {
  const isInt = /^[0-9]+$/.test(v)
  if (!isInt) {
    return cb(new Error(&#39;要求为正整数&#39;))
  }

  if (v < num) {
    return cb(new Error(`要求大于等于${num}`))
  }
  return cb()
}

export const biggerInt = (int, required = true) => ([
  { required, message: &#39;必填&#39;, trigger: &#39;blur&#39; },
  { validator: biggerAndNum(int), trigger: &#39;blur&#39; }
])
登入後複製

封裝一個專門創建規則的類,鍊式調用

export default class CreateRules {
  constructor() {
    super()
    this.rules = []
  }

  need(msg = &#39;必填&#39;, trigger = &#39;blur&#39;) {
    this.rules.push({
      required: true,
      message: msg,
      trigger
    })
    return this
  }
  
  url(message = &#39;不是合法的链接&#39;, trigger = &#39;blur&#39;) {
    this.rules.push({
      type: &#39;url&#39;,
      trigger,
      message
    })
    return this
  }

  get() {
    const res = this.rules
    this.rules = []
    return res
  }
}

const createRules = new CreateRules()

//规则
const needUrl = createRules.need().url().get()
const isUrl = createRules.url().get()

// imgUrl必填且是链接;href可选不填,如果填写必须是链接
const rules = {
  imgUrl: needUrl,
  href: isUrl
}

// deep rule 定义
// urls是数组,长度大于1
// urls的元素是链接
const urls = [&#39;http://www.baidu.com&#39;, &#39;http://www.baidu.com&#39;]

const rules = {
  urls: {
    type: &#39;array&#39;,
    min: 1,
    defaultField: isUrl
  }
}
登入後複製
以上就是本文的全部內容,希望對大家的學習有幫助,更多相關內容請關注PHP中文網!

 相關推薦:

Vue中Element表單驗證的基本要素

Vue中for in物件時如何解決屬性為非負整數的問題

以上是vue中Element表單驗證的使用方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!