溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Vue.js怎么進行form validation

發(fā)布時間:2021-03-10 11:12:51 來源:億速云 閱讀:156 作者:小新 欄目:web開發(fā)

小編給大家分享一下Vue.js怎么進行form validation,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

Vue.js如何優(yōu)雅的進行form validation?

1. 所有validation rules是被集中管理,而不是每個文件自己一種,導致驗證規(guī)則冗余。
2. 能夠進行remote validate。
3. 不用JQuery。

現(xiàn)有的插件vuejs/vue-validator · GitHub只能實現(xiàn)普通驗證,但如何解決1,因為vue-validator沒有把校驗規(guī)則給抽象出來,沒辦法,現(xiàn)在只能自己代碼上再抽出一層rules來管理。remote validation只能手寫借助Jquery ajax來驗證。

網友1、曾廣營

這個現(xiàn)在我可以回答了。

我覺得 vue-validator 太冗余了。所以自己寫了個項目用的插件 va.js,它實現(xiàn)了

集中式的管理 校驗規(guī)則 和 報錯模板。

報錯時機可選

校驗正確后的數(shù)據(jù),已經打包成對象,可以直接用

允許各個頁面對規(guī)則進行覆蓋,對報錯信息進行自定義修改,以及允許ajax獲取數(shù)據(jù)后,再對規(guī)則進行補充

按順序來校驗報錯

我寫了一篇博文來記載

va.js的寫作歷程。va.js——Vue 表單驗證插件的寫作過程

我個人觀點。表單驗證的是一種高度定制化的東東。所以網上用的插件,都會有不盡人意的感覺,因為要么冗余,要么不夠。因此,我分享了思路和源碼。真的想寫的話,借鑒思路自己寫吧。

補充:

1.自定義的js函數(shù)規(guī)則,可以自己再加入。 有個存儲校驗函數(shù)的對象,可以擴展。
2.對ajax的處理僅僅是暴露通過校驗的數(shù)據(jù)的對象。即假如在ajax前不需驗證的話,這份暴露出來的數(shù)據(jù)是可以提交的;假如需要驗證,可以使用這個暴露出來的數(shù)據(jù),對單個或多個字段加上額外的校驗。 

網友2、冉聰杰

推薦:vee-validate https://github.com/logaretm/vee-validate/

網友3、李文富

自己簡單寫一個,支持異步,支持任意 Vue Component,不限定于 Form Element。

來自:https://github.com/crossjs/plato/blob/master/src/modules/validator/index.js

看 return 部分即可:

import Vue from 'vue'
import * as rules from './rules'
import promisify from 'util/promisify'

export default (context, options = {}) => {
 // options = { scope: 'validator', prefix: '/', ...options }

 // 只注冊回調,不注冊數(shù)據(jù)
 return () => {
 Vue.mixin({
  beforeCreate () {
  const options = this.$options
  const { validator } = options

  if (validator) {
   // 在入口處定義 $validation
   Vue.util.defineReactive(this, '$validation', {
   fields: [],
   errors: []
   })
   this.$validator = this
   nextTick(this, validator.auto)
  } else {
   const { parent } = options
   if (parent && parent.$validation) {
   this.$validation = parent.$validation
   this.$validator = parent.$validator
   nextTick(this, parent.$validator.$options.validator.auto)
   }
  }
  }
 })

 /**
  * $validate
  *
  * validate vm recursively.
  *
  * @return {Promise}
  */
 Vue.prototype.$validate = function (fromEntry) {
  const { validate, $validation = {}, $validator } = this

  // 如果此處為校驗入口
  if ($validator === this && !fromEntry) {
  // 頂級往下校驗所有子組件
  return Promise.all($validation.fields
   .map(field => field.$validate(true)))
   .then(() => $validation)
   .catch(() => Promise.reject($validation))
  } else {
  if (!validate) {
   return Promise.resolve($validation)
  }
  return Promise.all(Object.keys(validate).map(key => {
   return new Promise((resolve, reject) => {
   const { validator = rules[key], rule, message } = validate[key]
   if (validator) {
    // reject if falsy
    promisify(validator(this.value, rule), true)
    .then(resolve)
    .catch(() => {
     reject({
     field: this.field || this,
     rule,
     message
     })
    })
   } else {
    __PROD__ || console.warn(`'${key}' is NOT a valid validator`)
    resolve()
   }
   })
  })).then(() => {
   updateErrors($validation.errors, this)
   return $validation
  }).catch(error => {
   updateErrors($validation.errors, this, error)
   return Promise.reject($validation)
  })
  }
 }

 function updateErrors (errors, vm, replacement) {
  const field = vm.field || vm
  const found = errors.some((error, index) => {
  if (error.field === field) {
   if (replacement) {
   errors.splice(index, 1, replacement)
   } else {
   errors.splice(index, 1)
   }
   return true
  }
  return false
  })

  if (!found && replacement) {
  errors.push(replacement)
  }

  return errors
 }

 function nextTick (vm, auto) {
  vm.$nextTick(() => {
  // 定義了校驗規(guī)則
  if (vm.validate) {
   vm.$validation.fields.push(vm)
   // 加載完成自動檢查
   if (auto) {
   vm.$validate()
   }
  }
  })
 }
 }
}

還有一個網友推薦的:試試這個自帶氣泡提示的vue校驗插件,配合vue-hook-form能夠輕松實現(xiàn)表單校驗

以上是“Vue.js怎么進行form validation”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI