寫一個簡單易用可擴充套件vue表單驗證外掛(vue-validate-easy)

lfyfly發表於2018-04-19

寫一個vue表單驗證外掛(vue-validate-easy)

需求

目標:簡單易用可擴充套件

如何簡單

開發者要做的

  1. 寫了一個表單,指定一個name,指定其驗證規則。
  2. 呼叫提交表單方法,可以獲取驗證成功後的資料。
  3. 呼叫重置表單方法重置表單
  4. 自定義驗證方法

程式應該做的

  1. 獲取表單元素,繫結事件
  2. 有輸入時,獲取表單值,使用開發者指定的規則進行驗證,若驗證錯誤給予錯誤提示。

實現方法

  • 獲取原生表單元素,vue指令獲取到的是包裹原生表單元素的外層元素,這裡我使用data-type屬性來獲取原生表單元素
  • 驗證規則,驗證引數,自定義錯誤提示語 由 vue的指令值來獲取
  • 提交時,我們需要一個表單標識,這裡我使用了data-scope屬性來對錶單進行分組
  • 重置,通過data-scope重置整個表單

常用方法

  • 懶驗證,通過.lazy指令修飾符
  • 遠端驗證, 通過async await
  • 延時驗證, .deay指令修飾符,和data-delay屬性
  • 表單主動驗證,單欄位主動驗證
  • 單欄位表單重置

可擴充套件

  • 錯誤訊息自定義
  • 驗證方法自定義
  • 錯誤提示處理自定義
  • 自定義表單元素(不借助原生元素)

完成後的使用程式碼

// 你只要指定 data-scope data-name data-type v-validate-easy 這四個屬性的值,然後通過呼叫this.V.$submit(scope)就可以進行提交表單了
<form>
    <div class="my-form-group" data-scope="register" data-name="email" data-type="input"
    v-validate-easy="[[`required`,`郵箱為必填專案`],[`email`]]">
      <label>
        <div class="label">郵箱</div>
        <input class="input" type="text" spellcheck="false" placeholder="請輸入郵箱"/>
      </label>
    </div>
    
    <div id="pwd" class="my-form-group" data-scope="register" data-name="password" data-type="input"
    v-validate-easy="[[`required`,`密碼不能為空`],[`password`],[`maxLength`,[32],`密碼最長為32位`]]">
      <label>
        <div class="label">密碼</div>
        <input class="input" type="text" spellcheck="false" placeholder="請再次輸入密碼"/>
      </label>
    </div>
    
    <div class="my-form-group" data-scope="register" data-name="password" data-type="input"
    v-validate-easy="[[`required`,`確認密碼不能為空`],[`equalTo`,[`pwd`],`密碼輸入不一致`]]">
      <label>
        <div class="label">確認密碼</div>
        <input class="input" type="text" spellcheck="false" placeholder="請輸入郵箱"/>
      </label>
    </div>
    <div class="btn-group">
      <button class="my-btn" @click.prevent="submit(`register`)">註冊</button>
      <button class="my-btn" @click.prevent="reset(`register`)">重置</button>
    </div>
  </form>
  methods: {
    reset(scope) {
      this.V.$reset(scope)
    },
    submit(scope) {
      this.V.$submit(scope, (canSumit,data) => {
        // canSumit為true時,則所有該scope的所有表單驗證通過
        if(!canSumit) return

        // 傳送請求
        axios({ url: `/test`,data, method: `post`})
          .then(() => {
            // 成功響應處理
          })
          .catch(() => {
            // 錯誤處理
          })
      })
    }
  },

對自定義元件使用,就更加簡潔

  <form>
    <h3>使用者登入</h3>
    <my-input label="使用者名稱" data-scope="login" data-name="username" v-validate-easy="[[`required`]]"></my-input>
    <my-input label="密碼" data-scope="login" type="password" data-name="pwd" v-validate-easy="[[`required`]]"></my-input>

    <div class="btn-group">
      <button class="my-btn" @click.prevent="submit(`login`)">登入</button>
      <button class="my-btn" @click.prevent="reset(`login`)">重置</button>
    </div>
  </form>

vue-validate-easy github地址

歡迎大家star,對該專案有什麼問題和建議,歡迎提issue

vue-validate-easy 文件地址

相關文章