--- 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" ![](https://i.imgur.com/uBYZsrK.png) 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}]"}
Expand menu