[Vue] 自訂指令Directive
TL;DR
參考資料
- RegExp.prototype.test() | MDN
- Object.keys() | MDN
相關連結
- 自訂義指令 | Official Docs
範例
email輸入驗證及樣式
- html(#app)
- vue
<div id="app">
<div class="p-5">
<h2>自訂義指令</h2>
<p>email格式驗證</p>
<input
type="email"
v-validator="'form-control'"
v-model="text"
>
</div>
</div>
const app = Vue.createApp({
data() {
return {
text: '',
}
},
});
// 註冊指令(方法與註冊元件相同)
app.directive('validator', {
// directive 生命週期
mounted(el, binding) {
el.focus();
// 將外部的值改為傳入的值
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 值,並帶入第一個)
console.log(Object.keys(binding.instance)[0])
const currentModel = Object.keys(binding.instance)[0];
// 從當前 Model 取值
const value = binding.instance[currentModel];
console.log(currentModel, value)
// Email validate
const re = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;
// 可參考 "參考資料"內的 RegExp.prototype.test() | MDN
if (!re.test(value)) {
el.className = `${className} is-invalid`
} else {
el.className = `${className} is-valid`
}
},
})
app.mount('#app');
自訂指令
- 實戰中屬於進階功能,初學可先了解有此功能即可
- 可從延伸套件中看到相關的運用
- 多用於 HTML 上的便利操作,複雜功能還是會 搭配元件