2023 Vue直播班筆記 - 自訂義指令 directive

閱讀時間約 7 分鐘
此筆記僅以個人理解方式記錄

前言

平常我們在 html 上常看到的例如 v-for、v-model 等等... 也是VUE已經幫我們定義好的指令,而這次我們可以依這自己的需求來建立。

此功能屬於較進階的功能,因此實戰中會比較少見,市面上還是有不少完善的套件能達到同樣效果,建議可以先往這方面察找。


開始定義名稱

通常都會以 v-{ 自定義名稱 } 來命名,例如 v-validator 。


環境建立

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/3.2.37/vue.global.js"></script>
<script type="module">
const app = Vue.createApp({
data() {
return {
text: '',
}
},
});
app.mount('#app');
</script>


註冊指令

// v-validator
app.directive('validator', {
// directive 生命週期
mounted(el, binding) {
// 生成的同時觸發
},
updated: function (el, binding, vnode) {},
})


開始

這邊先以 input 標籤為範例並加上 v-validator

<input type="email" v-model="text" v-validator>


再來將 focus() 加入自定義屬性 mounted 內

app.directive('validator', {
mounted(el, binding) {
el.focus();
},
updated: function (el, binding, vnode) {},
})


重新整理後可以發現 input 處於被選取的狀態,這樣就清楚知道 el 表示為有使用自定義屬性的 DOM ,我們也可以套過指令的方式將 class 加到 DOM 上面。


這邊以 form-control 為例 :

這邊要以”字串”加入
<input type="email" v-model="text" v-validator="'form-control'">


並在 mounted 補上 console.log(binding)

app.directive('validator', {
mounted(el, binding) {
el.focus();
console.log(binding)
},
updated: function (el, binding, vnode) {},
})


這時 consloe 就可以看到我們傳入的內容

raw-image


我們可以利用此方式來對其加入該 CSS

app.directive('validator', {
mounted(el, binding) {
el.focus();
el.className = binding.value
},
updated: function (el, binding, vnode) {},
})


而當 input 有變動時,將會調用 updated

app.directive('validator', {
mounted(el, binding) {
...
},
updated: function (el, binding, vnode) {
console.log('update', el, binding, vnode);
},
})


會出現以下 3 個資訊

  • DOM本身
  • 傳入的內容
  • 虛擬節點
raw-image


而 binding -> instance -> text 更可以看到 input 上的東西

raw-image


進一步做驗證功能,先取出 className 名稱,在取當前 v-model 的 key

app.directive('validator', {
mounted(el, binding) {
...
},
updated: function (el, binding, vnode) {
// 取出 className 名稱
const className = binding.value;
// 尋找當前的 model 名稱(取得 key 值,並帶入第一個)
const currentModel = Object.keys(binding.instance)[0];
// 從當前 Model 取值
const value = binding.instance[currentModel];
},
})


開始驗證是否為 email

app.directive('validator', {
mounted(el, binding) {
...
},
updated: function (el, binding, vnode) {
// 取出 className 名稱
const className = binding.value;
// 尋找當前的 model 名稱(取得 key 值,並帶入第一個)
const currentModel = Object.keys(binding.instance)[0];
// 從當前 Model 取值
const value = binding.instance[currentModel];

const re = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;
if (!re.test(value)) {
el.className = `${className} is-invalid`
} else {
el.className = `${className} is-valid`
}
},
})


由此就可以做出類似驗證的功能


  • joker
  • 2024/04/12
3會員
19內容數
是一隻喜愛前端勇往直前的霹靂酷樂貓
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
【程式學習日記】六角學院:2023 Vue 作品實戰班從 Vue 班畢業已經 1 個多月,最近也轉職成功,終於有機會把這段歷程記錄下來,當作一個里程碑。此次參加 Vue 班,心境上最大的不同,大概是知道自己即將在完課後,踏上求職道路。所以如果能在課堂期間 2 個月內完成求職作品,我就能提早出發。 ▍學習狀況 雖然先前有稍微玩過 Vue,但也早已
Thumbnail
avatar
Ann Chou
2024-05-11
2023這一年讓我知道了沒有完美的人事物 我也是一個充滿缺失的個體
Thumbnail
avatar
Po
2024-03-11
2023這些那些關於即將成為過去的那一年 在這個名之為我的小宇宙 泛起過一片漣漪 和其他生命的交會與告別 或久別重逢 或不如歸去 留下些什麼 我們就逐漸長成那個模樣 記憶的刻痕是我們選擇的事實 似真還假 孰是孰非 有何干係 物質構築的既成事實 缺席的不在場證明
Thumbnail
avatar
YiYi
2023-12-31
2023年草嶺古道芒草季|交通路徑、美景圖文紀錄幫大家標示容易走錯的幾個路口,希望可以幫助大家的旅途順利~ 嘗試用圖文方式記錄遊記,好像讀起來更生動了。
Thumbnail
avatar
喬安納
2023-12-04
2023-Vue六角直撥班心得為什麼會參加這個課程 2022年是個不一樣的年,因為當初自學由設計轉前端工程師、一路上跌跌撞撞因為想要把基底打穩所以今年下定了決心從2022切版班、Js直播班、一路跟到目前2022秋季Vue直播班。 Vue直播班的心得 前兩週其實都還跟得上,但到了第三週對我而言確實感覺有些難了啊~正在心裡徬徨第三週
Thumbnail
avatar
布萊N
2023-03-19
20232023年
Thumbnail
avatar
竹川獅
2023-01-21
2023新年一年新的開始,最近事情太多,本想說寫點什麼的...但最近真的工作遇到些瓶頸,剛好在年底把這些不順遂的事情一併都處理掉了,稍微有點時間可以好好的敘述一下最近發生的事情。是這樣的,我前份工作傳統產業做得不太開心,本人的職業是平面設計師,據大家的認知傳產從上到下都是親戚接管事業,當然我的工作也不例外,
Thumbnail
avatar
不惑人生
2023-01-01
2023欲說還休,欲說還休,卻道天涼好個秋 想來也到了「欲說還休」的時候了。 是年紀的增長多了顧慮,還是收斂了自己的負面情緒,或者,只是懶了,我在也不像從前能在FB上po出長文。不管當下的情緒多麼澎派,多想要發表言論,回到家了,坐在電腦前面,就沒了發文的欲望了。 其實也有點擔心,難道已經被速食文化變得淺薄了
Thumbnail
avatar
Hedi Yang
2022-12-31
2023新的一年即將開始,人類這種生物很奇妙,喜歡有一種重新啟動的感覺。
Thumbnail
avatar
記憶,那些
2022-12-30
2023 2023 1.我希望我可以自由的工作、開心的工作、利用我的工作能力我自己賺到生活費。 2.我希望我可以有車子、讓我自由的旅行、享受大自然、我並不是想要在家裡放一台車、而是可以讓我隨時隨時都有一台車。 3.我希望我可以去一些國家旅行想去泰國、加拿大,芬蘭、歐洲。 4.我想瘦到我想要的體重。
Thumbnail
avatar
阿硬
2022-07-07