###### tags: `Vue` `vee-validate`
{%hackmd BJrTq20hE %}
# Vue店商網頁-VeeValidate套件使用
VeeValidate用於表單的使用,可以直接提醒使用者表單有沒有填錯,或是有沒有滿足填寫條件。
## 1.安裝VeeValidate
在終端機輸入"npm install vee-validate"
## 2.在元件importVeeValidate
以下範例在component的script
```javascript=
<script>
// 匯入 vee-validate 主套件
import { defineRule, Form, Field, ErrorMessage, configure } from 'vee-validate'
// 匯入 vee-validate rule
import { required, email } from '@vee-validate/rules'
// 匯入 vee-validate 在地化
import { localize, setLocale } from '@vee-validate/i18n'
// 匯入繁體中文語系檔案
import zhTW from '@vee-validate/i18n/dist/locale/zh_TW.json'
// 定義使用規則名子
defineRule('required', required)
defineRule('email', email)
configure({ // 用來做一些設定
generateMessage: localize({ zh_TW: zhTW }), // 啟用 locale
validateOnInput: true // 調整為:輸入文字時,就立即進行驗證
})
// 設定預設語系
setLocale('zh_TW')
export default {
data () {
return {
user: {
name: '',
tel: '',
email: ''
}
}
},
// 在component引入Form、Field、ErrorMessage
components: {
Form,
Field,
ErrorMessage
},
computed: {
// 觀測this.user如果有沒填的資料也就是''則return false 如果沒有''則回傳true
userDataWatch () {
let result = ''
const arr = Object.values(this.user).filter(i => i === '')
if (arr.length === 0) {
result = false
} else { result = true }
return result
}
},
methods: {
// 自訂的rules可以用v-bind綁定
phoneCheck (value) {
const phoneNumber = /^(09)[0-9]{8}$/
return phoneNumber.test(value) ? true : '需要正確的電話號碼'
},
// 綁定在Form上但是觸發是由button type="submit" 所觸發
onSubmit () {
const sendData = {
data: {
user: {
name: '',
tel: '',
email: '',
address: ''
},
message: '',
orderid: ''
}
}
sendData.data.user.name = this.user.name
sendData.data.user.tel = this.user.tel
sendData.data.user.email = this.user.email
sendData.data.user.address = this.user.address
sendData.message = this.message
this.isLoading = true
if (this.isEdit === undefined) {
this.$http.post(`${process.env.VUE_APP_API}/api/${process.env.VUE_APP_PATH}/order`, sendData)
.then((res) => {
this.isLoading = false
this.addMessage(
{
title: '訂單送出結果',
style: 'success',
content: `${res.data.message}`
}
)
this.orderid = res.data.orderId
this.$router.push(`/guestOrderPay/${this.orderid}`)
}).catch((err) => {
this.isLoading = false
this.addMessage(
{
title: '訂單送出結果',
style: 'danger',
content: `${err.response.data.message}`
}
)
})
this.$refs.form.resetForm()
this.message = ''
}
}
}
}
</script>
```
## 3.使用compontnets中的Form、Field、ErrorMessage
在componenst的Form與Fieldz分別對應html標籤的form與input
```htmlembedded=
<!--Form中需要v-slot="{errors}" 錯誤資訊才會出現-->
<Form class="d-flex flex-column col-12 col-lg-8 mx-auto" ref="form"
v-slot="{errors}"
@submit="onSubmit">
<div class="my-3 position-relative">
<label class="form-label" for="name">姓名</label>
<!--Field需要有 type、:class="{'is-invalid': errors['姓名']}" rules則是可以使用import進來的規則-->
<Field
id="name"
name="姓名"
type="text"
class="form-control"
:class="{'is-invalid': errors['姓名'], buttonDisabledCursor :isEdit}"
placeholder="請輸入 姓名"
rules="required"
v-model="user.name"
:disabled="isEdit || false"
>
</Field>
<ErrorMessage name="姓名" class="invalid-feedback" style="position:absolute; left:14px ;bottom:-20px"></ErrorMessage>
</div>
<div class="my-3 position-relative">
<!--這裡的rules是自定規則綁定在methods-->
<label class="form-label" for="tel">電話</label>
<Field
id="tel"
name="電話"
type="text"
class="form-control"
:class="{'is-invalid': errors['電話'], buttonDisabledCursor :isEdit}"
placeholder="請輸入電話例如0912123123"
:rules="phoneCheck"
v-model="user.tel"
:disabled="isEdit || false"
>
</Field>
<ErrorMessage name="電話" class="invalid-feedback" style="position:absolute; left:14px ;bottom:-20px"></ErrorMessage>
</div>
<div class="my-3 position-relative">
<!--使用reuls-->
<label class="form-label" for="email">信箱</label>
<Field
id="email"
name="信箱"
type="email"
class="form-control"
:class="{'is-invalid': errors['信箱'], buttonDisabledCursor :isEdit}"
placeholder="信箱"
rules="email|required"
v-model="user.email"
:disabled="isEdit || false"
>
</Field>
<ErrorMessage name="信箱" class="invalid-feedback" style="position:absolute; left:14px ;bottom:-20px"></ErrorMessage>
</div>
<button class="btn btn-primary text-white align-self-end" type="submit"
<!--VeeValidate會把錯誤訊息整理成陣列-->
:disabled="Object.keys(errors).length > 0 || userDataWatch || isLoading || isEdit"
:class="{buttonDisabledCursor : Object.keys(errors).length > 0 || userDataWatch}"
>
送出表單
</button>
</Form>
```
參考資料
---
[VeeValidate](https://vee-validate.logaretm.com/v4/)