中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

怎么在vue中利用mixin優化表單驗證插件

發布時間:2021-03-24 17:07:01 來源:億速云 閱讀:166 作者:Leah 欄目:web開發

這篇文章將為大家詳細講解有關怎么在vue中利用mixin優化表單驗證插件,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

1. 實際開發中遇到的問題

在上面的文章中提及了一些表單插件的問題,主要針對的是插件開發本身存在的問題。下面我總結下使用中存在的問題:

每個使用表單校驗的元素都需要添加 v-check 類名,比較麻煩。

必須在提交表單按鈕上使用 v-checkSubmit 指令進行表單校驗,提交函數必須命名為 submit() ,而且二者還是綁定的。

無法在一個組件里面多次使用校驗函數,無法自定義校驗的表單范圍。(嚴重問題)

2. 對問題進行分析

一開始我的目標是按照之前計劃的方向,研究如何使用事件訂閱發布來實現表單校驗,但是評估之后這種方式會對現有的代碼改動較大,因為我項目已經幾處用了當前的校驗方法,遂放棄這個方向。

經過查閱資料和思考,我發現vue本身是沒有直接處理、生成dom元素的api。所以當前的這種方法(根據校驗結果添加類名 input-error ,并追加錯誤信息元素)雖然不優雅,但是確實最簡單有效的方式了。在這個基礎上針對上面列出的幾個問題,我分別整理了解決的思路:

v-check

3. 實現

綁定自定義指令的時候添加 v-check

import Vue from 'vue'
export default {
 install: (Vue, options) => {
 Vue.directive('validateParams', {
  inserted: function (el, binding, vNode) {
  /*
  * 解決辦法只需添加下面這一行代碼即可
  * el即為當前指令綁定的元素,classList.add可以給元素添加類名
  */
  el.classList.add('v-check');
  el.addEventListener('blur', function (event) {
   // ...
  })
  }
 });
 }
}

定義公共的表單校驗方法

如何在vue typescript中使用mixin呢

// mixin.ts
import { Component, Vue } from 'vue-property-decorator';
@Component({})
export class Demo extends Vue {
 public A: string = 'A';
 public doSomething () {
 }
}
// component
<template>
</template>
<script lang="ts">
import { Component, Vue, Mixins } from 'vue-property-decorator';
import { Demo } from 'mixin.ts';
@Component({})
export class App extends Mixins(Demo) {
 private created() {
 console.log(this.A); // 會打印出A
 }
}
</script>

下面我們實踐,在表單插件中定義這個被mixin的校驗方法

@Component({})
export class ValidatorMixin extends Vue {
 /*
 * 定義一個GValidate方法,可以接受一個元素節點參數
 * 參數定義了表單函數校驗的范圍
 */
 public GValidate(validateEl?: HTMLElement) {
 // 默認是查找當前組件實例內的.v-check元素,this.$el表示當前組件
 let elements = this.$el.querySelectorAll('.v-check');
 if ( validateEl ) {
  // 有參數時,規定了校驗的范圍
  elements = validateEl.querySelectorAll('.v-check');
 }
 const evObj = document.createEvent('Event');
 evObj.initEvent('blur', true, true);
 if (elements) {
  for (const element of elements) {
  element.dispatchEvent(evObj);
  }
 }
 // 還是查找.input-error元素,以此來判斷檢驗結果
 let errorInputs = this.$el.querySelectorAll('.input-error');
 if (validateEl) {
  errorInputs = validateEl.querySelectorAll('.input-error');
 }
 // 將校驗的結果返回
 if (errorInputs.length !== 0) {
  return false;
 } else {
  return true;
 }
 }
}

定義了上面的校驗方法之后,可以將原插件里面定義 v-checkSubmit 指令的部分刪除了。

4. 優化后的使用

// rules.ts
export const required = (message) => ({
 message,
 required: true
});
export const min = (message, length=3) => ({
 message,
 min: length
})
export const max = (message, length=15) => ({
 message,
 max: length
})
export const pattern = (message, reg) => ({
 message,
 pattern: reg
})
// form.vue
<template>
 <div>
 <div class="form-item" ref="userName">
  <label for="userEmail">用戶名:</label>
  <input id="userEmail" type="text" v-model="userName"
  v-validateParams="[inputNameRequired, inputNameMin, inputNameMax, inputNamePattern]">
 </div>
 <button class="btn" type="success" @click="submit">確認</button>
 </div>
</template>
<script lang='ts'>
import { Component, Vue, Prop, Mixins } from 'vue-property-decorator';
import { max, min, required, name, pattern} from 'rules';
import { yourMixin } from 'yourMixin.ts';
@Component({})
export default class Auth Mixins(youMixin) {
 private userName: string = '';
 private inputNameMax = max('請不要超過20個字符');
 private inputNameMin = min('請不要小于3個字符');
 private inputNameRequired = required('請輸入用戶名');
 private inputNamePattern = pattern('請輸入符合要求的用戶名', /^[a-zA-Z0-9_-]{4,16}$/);
 private submit() {
 const validRes = this.GValidate(); // 全局校驗
 const userNameValidRes = this.GValidate(this.$refs.userName); // 單獨校驗某個表單
 if (validRes && userNameValidRes) {
  alert('通過校驗');
 } else {
  alert('校驗失敗');
 }
 }
}
</script>

關于怎么在vue中利用mixin優化表單驗證插件就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

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

AI

商城县| 伊金霍洛旗| 华阴市| 舒兰市| 莲花县| 吕梁市| 曲麻莱县| 明星| 冕宁县| 涟水县| 田林县| 郯城县| 西藏| 连云港市| 宣威市| 鸡西市| 蒙阴县| 灵武市| 叶城县| 海门市| 林甸县| 绍兴县| 锡林浩特市| 扶绥县| 华宁县| 长顺县| 平乐县| 肇庆市| 江北区| 卫辉市| 保德县| 兰西县| 奎屯市| 普定县| 信丰县| 桦南县| 金昌市| 措勤县| 东乡县| 油尖旺区| 柘城县|