Vuelidate 教學 (適用於前台/後台) [參考] https://vuelidate-next.netlify.app/ - 步驟一 **安裝套件vulidate** ``` "@vuelidate/core": "^2.0.0", "@vuelidate/validators": "^2.0.0", ``` - 步驟二 **新增一個Error組件** > 說明: 裡面有2個props 一個前端的驗證資料, 一個是後端給的驗證錯誤訊息, 因為有可能有前端無法知道的驗證 , 例如此帳號之前已被註冊過, 命名唯一性 ```js <template> <div class="ivu-form-item-error-tip"> <li v-for="error in props.validate" :key="error.$uid"> {{ error.$message }} </li> <li class="customError" v-for="(error, key) in customError" :key="key"> {{ error }} </li> </div> </template> <script setup lang="ts"> const props = defineProps({ validate: { type: Object, default: () => ({}), }, customError: { type: Array, default: () => [], }, }); </script> <style lang="sass" scoped> .customError display: flex justify-content: left .ivu-form-item-error-tip position: relative top: 0 li color: #ed4014 margin-top: 5px </style> ``` - 步驟三 檢查hook 中 是否有 `useValidate.ts` ```js import { ref } from 'vue'; import { useVuelidate } from '@vuelidate/core'; import { minLength, maxLength, required, email, sameAs, alphaNum, helpers, } from '@vuelidate/validators'; export function useValidate() { const maxNameLength = ref(20); // 限制字數不得超過10位數用 const minNameLength = ref(2); // 限制字數不得超過2位數用 const maxDescriptionLength = ref(100); // 限制字數不得超過100位數用 const alphabetAndChinese = (value: any) => { const re = /^[A-Za-z0-9\u4e00-\u9fa5]+$/; return re.test(value); }; const alphabetAndDash = (value: any) => { const re = /^[A-Za-z0-9-]+$/; return re.test(value); }; // 擴充客製化的驗證可新增於此 const rules = { email: { required: helpers.withMessage('不得為空', required), email: helpers.withMessage('Email格式錯誤', email), }, required: { required: helpers.withMessage('不得為空', required), }, password: { required: helpers.withMessage('不得為空', required), }, sameAsPassword(password: any) { return { required: helpers.withMessage('不得為空', required), sameAs: helpers.withMessage('需與密碼一致', sameAs(password)), }; }, account: { required: helpers.withMessage('不得為空', required), maxLength: helpers.withMessage( `限制長度不得超過${maxNameLength.value}位`, maxLength(maxNameLength) ), minLength: helpers.withMessage( `限制長度不得少於${minNameLength.value}位`, minLength(minNameLength) ), }, type: { alphabetAndDash: helpers.withMessage( `限制只能英文與數字與${' "-" 符號'}`, alphabetAndDash ), required: helpers.withMessage('不得為空', required), maxLength: helpers.withMessage( `限制長度不得超過${maxNameLength.value}位`, maxLength(maxNameLength) ), $lazy: true, }, description: { maxLength: helpers.withMessage( `限制長度不得超過${maxDescriptionLength.value}位`, maxLength(maxDescriptionLength) ), }, }; const v$: any = useVuelidate(); return { rules, v$, }; } ``` - 步驟四 **使用方式教學** ```js import { useValidate } from 'src/hook/useValidate'; import { sameAs, helpers } from '@vuelidate/validators'; const { rules } = useValidate(); // 預設的驗證規範可從rule << 此處領取使用 ``` 範例: ```js export default defineComponent({ name: 'RegisterPage', components: { Error, }, validations() { return { formData: { account: rules.account, password: rules.password, confirm_password: rules.sameAsPassword(this.formData.password), fullname: rules.required, email: rules.email, contacts: { contact1: rules.required, }, }, }; }, setup() { let { v$ } = useValidate(); const steps = ref(1); const $q = useQuasar(); let formData = ref({ account: '', password: '', confirm_password: '', fullname: '', agent_id: 2002, ref_id: 1, email: '', phone: '', contacts: { contact1: '', }, }); const onSubmit = async () => { $q.loading.show(); const isFormCorrect = await v$.value.$validate(); if (!isFormCorrect) { $q.loading.hide(); return; } await register(formData.value) .then(async (res: any) => { if (res.code === 0) { // const resData = res.data; // sessionStorage.setItem('token', resData.access_token); $q.loading.hide(); // await updatedUserInfo(); steps.value = 3; } else { $q.loading.hide(); } }) .catch(() => { $q.loading.hide(); }); }; return { steps, formData, onSubmit, v$ }; }, }); ``` - 結論 簡而言之: 就是利用 `v$.value.$validate()`去觸發改變$dirty狀態 true/false, 另外記得把想要放入驗證的表單放入validations() 中 ```js validations() { return { formData: { account: rules.account, password: rules.password, confirm_password: rules.sameAsPassword(this.formData.password), fullname: rules.required, email: rules.email, contacts: { contact1: rules.required, }, }, }; }, ``` 另外想要新增驗證只需要到useValidate 新增即可, 可以客製化正規化內容