---
tags: Mike課程
---
# 自訂義指令 directive
## 自訂義指令
### 用途
* 實戰中屬於進階功能,初學可先了解有此功能即可
* 可從延伸套件中看到相關的運用
* 多用於 HTML 上的便利操作,複雜功能還是會搭配元件
### 結構
* v-{自訂義名稱}
* 主要透過生命週期來觸發變動,可參考:<a
href="https://vue3js.cn/docs/zh/guide/custom-directive.html#%E5%8A%A8%E6%80%81%E6%8C%87%E4%BB%A4%E5%8F%82%E6%95%B0">https://vue3js.cn/docs/zh/guide/custom-directive.html#%E5%8A%A8%E6%80%81%E6%8C%87%E4%BB%A4%E5%8F%82%E6%95%B0</a></li>
在input中加入 自訂義 v-validator,加入 Bootstrap 的 form-control(注意內部需要用到字串)
```htmlembedded=
<input type="email" v-model="text" v-validator="'form-control'" >
```
註冊指令: 運用 directive 註冊指令賦予 validator,使HTML結構可使用 v-validator,
```javascript=
// 註冊指令
app.directive('validator', {
// directive 生命週期
mounted(el, binding) {
el.focus();
// 將外部的值改為
console.log(binding);
el.className = binding.value
},
})
```
這邊 console.log(binding)、裡面就會顯示 value: "form-control"

el.className = binding.value 這段就可以賦予 元素的Class
基本驗證實例 :
```javascript=
// 註冊指令
app.directive('validator', {
// directive 生命週期
mounted(el, binding) {
el.focus();
// 將外部的值改為
// console.log(binding);
el.className = binding.value
},
updated: function(el, binding, vnode) {
// el 元素本體
// binding 綁定的資源狀態
// vnode 虛擬 DOM 節點
console.log('update', el, binding, vnode);
const className = binding.value;
// 尋找當前的 model 名稱(取得 key 值,並帶入第一個)
const currentModel = Object.keys(binding.instance)[0];
// console.log(currentModel);
// 從當前 Model 取值
const value = binding.instance[currentModel];
console.log(currentModel, value)
// Email validate //正規表達式
const re = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;
//驗證格式若不符合 加上is-invalid
if (!re.test(value)) {
el.className = `${className} is-invalid`
} else {
el.className = `${className} is-valid`
}
},
})
```
{"metaMigratedAt":"2023-06-16T11:11:17.608Z","metaMigratedFrom":"Content","title":"自訂義指令 directive","breaks":true,"contributors":"[{\"id\":\"c05b36ac-d774-4e45-8fc3-5e50c9be5123\",\"add\":1972,\"del\":3}]"}