[Vue] vee-validate 實現多語系表單驗證

MiaHsu
7 min readAug 22, 2022

--

學習目標:使用 vee-validate 進行表單驗證、多語系驗證訊息、客製化驗證等。

最近在整理一些 Vue 相關的常用到套件,表單驗證最多人使用的就是 vee-validate,它的優點如下:

  • 不需搭配任何 UI 套件
  • 快、全面、配置簡單
  • 提供內置規則配套元件庫(require、email、min、max …. )
  • 提供 i18n 內置規則語言環境
  • 可與 yup 驗證搭配使用

實作說明

  • 建立一個表單進行以下欄位驗證:
  1. 必填欄位
  2. 信箱欄位
  3. 數字欄位
  4. 限制欄位最大長度
  5. 限制欄位最小長度
  • 客製化驗證訊息
  • 欄位即時驗證

環境說明

  • vue(composition API):3.2.37
  • vee-validate:4.5.8
  • @vee-validate/i18n:4.6.6
  • @vee-validate/rules:4.6.6

前置作業

  • 表單切版:提供給大家使用,原諒我太懶直接把 CSS 寫在上面
  • 建立 vue 專案,安裝上述套件,並將表單切版放到 App.vue 並運行成功
只要看到這個畫面就可以了

操作開始

Step1. 建立 vee-validate 設定檔:Configuration

檔案路徑: src/main.js

  • 設定欄位即時驗證:引入 configure 並更新配置
import { configure } from 'vee-validate'const config = configure({   validateOnInput: true, // 調整為即時驗證})app.use(config)
  • 引入並定義內置規則庫:@vee-validate/rules 提供 25 種以上的規則,有兩種方式引入。

引入部分規則

import { defineRule } from 'vee-validate';import { required, email, min } from '@vee-validate/rules';defineRule('required', required);defineRule('email', email);defineRule('min', min);

引入全部規則

import { defineRule } from 'vee-validate'import AllRules from '@vee-validate/rules';Object.keys(AllRules).forEach(rule => {   defineRule(rule, AllRules[rule]);});

Step2. 使用內建 Component Form、Field 取得欄位資料

檔案路徑:src/App.vue

  1. 引入 Form 組件:vee-validate 提供的組件剛好是大寫的「Form」,剛好跟 Html 中的 <form> 撞名,因此在引入時建議重新命名,以確保程式運行正確。
<script setup>import { Form as ValidationForm } from 'vee-validate';</script>

2. 將 <form> 替換成 <validation-form>

3. 引入 Field 組件,並將 <input/> 替換成 <field/>,若是 <select> 或 <textarea> 需要加上 as="select"as="textarea",才能顯示正確。

<script setup>import { Field } from 'vee-validate';</script>

4. 將 submit 綁定 method,接著試著按下送出按鈕,就會發現取到第一個欄位的資料了!確定取到欄位資料後就可以將剩下的欄位替換成 <Field/> ,(送出按鈕不用更換!)

Step3. 欄位新增驗證規則並顯示錯誤訊息

檔案路徑: src/App.vue

  1. Field Component 新增 rules 屬性:如果需要多個驗證規則,可使用 | 做串連 EX:rules="required|alpha_dash"
  2. Form Component 取出 errors
  3. 將錯誤訊息顯示於頁面中:會對應到 field name 的 value
  4. 利用 errors 是否有內容控制 style

完成了一個後就可以把其他欄位的都補上,可以使用的規則可參考官網

  • nickname:rules="required|alpha_dash"
  • email:rules="required|email"
  • phone:rules="required|numeric"
  • type:rules="required"
  • media:rules="required"
  • other:rules="max:100"

Step4. 調整錯誤訊息

檔案路徑: src/main.js

我們可以利用 vee-validate 提供的 本地化 (i18n) 來進行轉換

  • 配置全局錯誤訊息,利用 vee-validate 設定檔中的 generateMessage 欄位搭配 i18n 相關函數進行配置,並在最後使用 setLocale() 設定環境語言
import { localize, setLocale } from '@vee-validate/i18n';import zh_TW from '@vee-validate/i18n/dist/locale/zh_TW.json';const config = configure({    generateMessage: localize({        zh_TW,    }),})setLocale('zh_TW');
成功轉為繁體中文

Step5. 客製化錯誤訊息

檔案路徑: src/main.js

由於預設本地化基本上都會加上欄位名稱在前方,但欄位名稱通常都還是英文,因此希望將基本的錯誤訊息進行覆寫,例如:必填驗證僅顯示「此欄位為必填」

覆寫的方式也相當簡單再次使用 localize(),針對語系進行設定就可以了(※須加在 configure 之後)

localize('zh_TW', {    messages: {        required: '此欄位為必填',   },});

那通常我們就會將這部分獨立成一個檔案,後續也比較好維護

新增檔案:src/i18n/tw/validations.js

export default {    messages: {        // 覆寫原有 validator 錯誤訊息        _default: '格式不符',        required: '此欄位為必填',        email: '輸入格式錯誤'    },}

引入 src/main.js

import twValidations from './i18n/tw/validations';localize('zh_TW', twValidations);

以上就是 vee-validate 的用法。

程式碼都放上 StackBlitz ,如果有任何問題歡迎提出,感謝

參考資料

--

--

MiaHsu
MiaHsu

Written by MiaHsu

每件事都是最好的安排,成為更好的自己

No responses yet