創(chuàng)建Vue.js自定義指令

照片 by [雅詩蘭黛森斯]

指令是帶有v前綴的特殊屬性猪勇。指令的工作是當(dāng)其表達(dá)式的值發(fā)生變化時埠对,對DOM反應(yīng)性地應(yīng)用副作用裁替。js提供了廣泛的指令供您使用。您可能已經(jīng)使用了v-if襟沮、v-repeat、v-model和v-show指令膀跌。

在本文中固灵,我將解釋指令的各個部分以及可以使用的內(nèi)容。然后丛忆,我將向您展示如何創(chuàng)建各種自定義指令熄诡,以便您可以將編程需求直接應(yīng)用于DOM元素诗力。因此苇本,讓我們開始討論指令中包含的內(nèi)容。

指令名稱

最基本的自定義指令只有一個名稱瓣窄。它不接受任何參數(shù),也沒有任何修飾符递递。如果不傳遞值啥么,這將不是非常靈活悬荣,但您仍然可以擁有DOM元素的一些功能。

您可能熟悉的一個示例是指令的最基本版本v-else践叠。以下是我們即將創(chuàng)建的自定義指令的示例:

<app-navigation v-sticky></app-navigation>

將值傳遞給指令

您可以將值傳遞給自定義指令禁灼。這是一個例子:

<div v-if="isVisible">Show this</div>

在此示例中轿曙,如果data屬性isVisible為true僻孝,則顯示v-if指令守谓。我們知道這是在尋找數(shù)據(jù)屬性斋荞,因?yàn)樗谝栔小O喾囱堕埽绻覀兿胍獙⒁粋€字符串作為值傳遞給指令别洪,您將執(zhí)行以下操作:

<div v-color="'red'">Show this</div>

參數(shù)

自定義指令可以在指令名稱后面加上冒號表示的“參數(shù)”柳刮。這是一個例子:

<app-navigation v-sticky:bottom></app-navigation>

在上面的示例中,自定義指令的名稱是sticky秉颗。這個參數(shù)是bottom

指令只能采用一個參數(shù)哪替。

修飾符

修飾符是由點(diǎn)表示的特殊后綴凭舶,表示指令應(yīng)以某種特殊方式綁定帅霜。修飾符控制指令的行為方式呼伸。以下是我們稍后將創(chuàng)建的自定義指令的示例:

<span v-format.underline>guide</span>

在上面的例子中括享,。underline修飾符告訴v-format指令將下劃線應(yīng)用于文本剩愧。

您可以通過鏈接指令在指令上使用多個修飾符澳叉。這是一個例子:

<span v-format.bold.highlight.underline>guide</span>

在上面的示例中沐悦,文本將為粗體五督,突出顯示并具有下劃線充包。

創(chuàng)建自定義指令

現(xiàn)在您了解了Vue.js中指令的基礎(chǔ)知識基矮。除了核心中提供的默認(rèn)指令集外冠场,Vue還允許您注冊自己的自定義指令。讓我們創(chuàng)建自己的自定義指令钢悲。

在它的基礎(chǔ)上凉当,我們可以通過使用Vue.directive并為其命名來創(chuàng)建全局指令掺出。以下是使用名稱sticky創(chuàng)建自定義指令的示例惭等。

Vue.directive('sticky');

當(dāng)我們想在DOM元素上使用這個自定義指令時辞做,它看起來像:

<app-navigation v-sticky></app-navigation>

現(xiàn)在我們已經(jīng)創(chuàng)建了第一個自定義指令,現(xiàn)在我們需要在它后面創(chuàng)建代碼凭豪。在編寫代碼之前晒杈,我們需要了解Vue為我們在custom指令中提供的值。

指令掛鉤

Vue為自定義指令提供了一系列鉤子拯钻。每個鉤子都有一些參數(shù)選項(xiàng)。以下是可用的鉤子:

  • bind - 當(dāng)指令附加到元素時會發(fā)生這種情況拼余。
  • inserted - 一旦元素插入父DOM就會發(fā)生這種情況
  • update - 這在元素更新時發(fā)生亩歹,但子項(xiàng)尚未更新
  • componentUpdated - 一旦更新了組件和子組件凡橱,就會發(fā)生這種情況
  • unbind - 刪除指令后會發(fā)生這種情況

其中每個都有elbindingvnode參數(shù)可供他們使用稼钩。這些參數(shù)是:

el - 綁定所依賴的元素

binding - 一個包含傳遞給鉤子的參數(shù)的對象。有許多可用的參數(shù)坝撑,包括name,value巡李,oldValue,expression侨拦,arg和modifiers辐宾。

vnode - 允許您根據(jù)需要直接引用虛擬DOM中的節(jié)點(diǎn)。

雙方bindingvnode應(yīng)被視為只讀螃概。

updatecomponentUpdated都公開了一個名為oldvnode的附加參數(shù)oldvnode參數(shù)用于傳遞舊值和新值之間進(jìn)行區(qū)分吊洼。

bindupdate是五個中最有用的。

獲取代碼

如果要查看所有這些自定義指令的實(shí)際操作冒窍,可以在我創(chuàng)建的分支中。我們將創(chuàng)建的所有自定義指令都可以在main.js文件中找到综液。只需取消注釋演示編號即可查看代碼

演示#1 v-sticky

如果您在代碼沙箱中跟隨谬莹,那么這是在main.js文件中找到的Demo#1。v-sticky指令已應(yīng)用于<app-navigation>埠戳。滾動時整胃,導(dǎo)航將保持固定在屏幕上喳钟。

讓我們編寫我們想要的v-sticky指令所具有的行為在岂。當(dāng)該指令應(yīng)用于DOM元素時蛮寂,我們希望在屏幕上修復(fù)該元素。這是我們的v-sticky指令的自定義代碼:

Vue.directive('sticky', 
    function(el, binding, vnode) {
        el.style.position = 'fixed';
    }
));

讓我們分解一下代碼中的內(nèi)容祠丝。我正在使用Vue.directive創(chuàng)建一個名為“ sticky ” 的新全局指令除嘹。在名稱之后岸蜗,我們有一個函數(shù)璃岳,它具有我們之前討論過的三個參數(shù)。在函數(shù)中单芜,我正在使用指令已經(jīng)應(yīng)用的元素并獲得它的樣式然后它的位置犁柜。我把它設(shè)置為固定。

稍后我們將修改器應(yīng)用于此自定義指令馋缅。

演示#2 v-orange

我們將創(chuàng)建的下一個自定義指令是v-orange萤悴。該指令將文本顏色設(shè)置為橙色。以下是此指令的代碼:

Vue.directive("orange", function(el, binding, vnode) {
    el.style.color = "orange";
});

我們可以將此指令應(yīng)用于HelloWorld組件中顯示的消息蹋盆。應(yīng)用后栖雾,歡迎消息現(xiàn)在為橙色岩灭。


v-orange指令中的橙色文本

演示#3 v-color

之前的指令不是很通用赂鲤。如果您希望文本為藍(lán)色而不是橙色柱恤,則必須編寫另一個自定義指令找爱。我們將創(chuàng)建一個名為v-color的新自定義指令。此自定義指令將采用將傳遞給它的值寺谤。此值是我們要應(yīng)用于歡迎消息的顏色变屁。

前面我提到綁定是一個對象意狠,它包含傳遞給指令的參數(shù)。該對象中包含的一個項(xiàng)是傳入的值闷板。我們將在代碼中使用它來將文本設(shè)置為該值遮晚。

Vue.directive("color", function(el, binding, vnode) {
    el.style.color = binding.value;
});

現(xiàn)在我們的指令更加靈活。您可以傳入任何眾所周知的顏色字符串县遣,如“紅色”或“藍(lán)色”创泄,并傳入有效的十六進(jìn)制顏色鞠抑,如#ffff00。這是我們新的v-color指令的圖像被應(yīng)用三次秒梳。第一次顏色為紅色酪碘,第二次顏色為藍(lán)色,最后一次顏色為黃色兴垦,使用#ffff00的十六進(jìn)制代碼。

我們的v-color自定義指令的結(jié)果

演示#4 v-sticky帶有參數(shù)

您可以為自定義指令提供參數(shù)狡赐。我們將修改我們v-sticky之前創(chuàng)建的代碼以接受參數(shù)钦幔。大多數(shù)網(wǎng)站的屏幕頂部都有導(dǎo)航,屏幕底部有一個頁腳搀擂。

我們將使用該參數(shù)告訴我們導(dǎo)航是否應(yīng)固定在屏幕的頂部或底部哨颂。綁定對象將包含一個名為arg的值揍庄,該值包含我們傳遞給自定義指令的參數(shù)东抹。

為了簡化操作,如果沒有參數(shù)傳遞給指令缭黔,我假設(shè)導(dǎo)航應(yīng)該固定在屏幕的頂部。如果我收到一個參數(shù)别渔,那么導(dǎo)航將固定在屏幕的底部哎媚。

為了區(qū)分頂部和底部導(dǎo)航,我在頂部導(dǎo)航中添加了灰色的背景顏色喊儡,在底部導(dǎo)航中添加了棕褐色。這是代碼:

Vue.directive("sticky", function(el, binding, vnode) {
  const loc = binding.arg === "bottom" ? "bottom" : "top";
  el.style.position = "fixed";
  el.style[loc] = 0;
  if (loc === "bottom") {
    el.style.background = "burlywood";
  } else {
    el.style.background = "#7e7e7e";
  }
});

將我們更新的自定義指令應(yīng)用于導(dǎo)航和頁腳后买喧,它看起來像這樣淤毛。

使用參數(shù)的v-sticky自定義指令

使用修飾符演示#5 v-format

您可以根據(jù)需要向自定義指令添加任意數(shù)量的修飾符低淡。我們將創(chuàng)建一個名為format的新自定義指令蔗蹋。此自定義指令將接受以下一個或多個修飾符:

  • underline
  • bold
  • highlight

binding參數(shù)是一個對象。該對象包含自定義指令的所有修飾符兽泣。綁定上的修飾符實(shí)際上也是一個對象胁孙。該對象將包含已應(yīng)用的每個修改器的鍵涮较。我們將使用它來應(yīng)用不同的文本格式狂票。這是代碼:

Vue.directive("format", function(el, binding, vnode) {
  const modifiers = binding.modifiers;
if (modifiers.underline) {
    el.style.textDecoration = "underline";
  }
if (modifiers.bold) {
    el.style.fontWeight = "bold";
  }
if (modifiers.highlight) {
    el.style.background = "#ffff00";
  }
});

在上面的代碼中,我們獲取修飾符對象并將其分配給名為修飾符的變量慌盯。然后我們檢查我們支持的每個可能的修飾符亚皂。如果存在該修飾符国瓮,則我們應(yīng)用相應(yīng)的文本修飾乃摹。

我們已將underline修飾符應(yīng)用于單詞指南。我們已將bold修飾符應(yīng)用于配置/定制播歼。我已將highlight修飾符應(yīng)用于單詞check out荚恶。

為了表明您可以將多個修飾符應(yīng)用于自定義指令磷支,我已將所有三個修飾符應(yīng)用于文本Installed CLI Plugins

這是它的樣子廓潜。

演示#6 v-hook-demo顯示生命周期鉤子

之前我在您的自定義指令中討論了可用的生命周期鉤子辩蛋。如果希望自定義指令基于生命周期鉤子工作,則需要為代碼使用不同的格式伤为。您將擁有一個對象绞愚,而不是在自定義指令的名稱后面使用函數(shù)颖医。該對象上的鍵將是一個或多個可用的生命周期鉤子。

在代碼沙箱中糖驴,我向About視圖添加了一些代碼贮缕。代碼有一個按鈕晌杰。單擊按鈕時肋演,數(shù)字會更新爹殊。

HelloWorld組件中梗夸,我已將v-hook-demo組件應(yīng)用于第一個div号醉。

這是v-hook-demo組件的代碼畔派。

Vue.directive("hook-demo", {
  bind(el, binding, vnode) {
    console.log("bind");
  },
  inserted(el, binding, vndoe) {
    console.log("inserted");
  },
  updated(el, binding, vnode) {
    console.log("updated");
  },
  componentUpdated(el, binding, vnode, oldVnode) {
    console.log("componentUpdated");
  }
});

如果刷新屏幕线椰,看看你的控制臺,你會發(fā)現(xiàn)bindinserted生命周期掛鉤得以實(shí)施烦绳。如果您轉(zhuǎn)到“關(guān)于”頁面并單擊該按鈕卿捎,您將看到componentUpdated生命周期鉤子已實(shí)現(xiàn)午阵。

結(jié)論

本文概述了在Vue.js中組成指令的項(xiàng)目享扔。在介紹之后伪很,我將向您介紹創(chuàng)建自定義指令的六個示例。這些示例顯示了一個基本的自定義指令猫十,一個傳遞值的指令拖云,一個使用參數(shù)的指令以及一個使用修飾符的指令应又。最后一個示例顯示了可用的生命周期掛鉤。

我希望你喜歡這篇文章尤筐。如果您有任何疑問或想留下反饋盆繁,請發(fā)表評論旬蟋。

轉(zhuǎn):https://medium.com/js-dojo/creating-custom-directives-in-vue-js-286142392fd8

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冕碟,一起剝皮案震驚了整個濱河市安寺,隨后出現(xiàn)的幾起案子我衬,更是在濱河造成了極大的恐慌叹放,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挠羔,死亡現(xiàn)場離奇詭異井仰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)破加,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進(jìn)店門俱恶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人范舀,你說我怎么就攤上這事合是。” “怎么了锭环?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵聪全,是天一觀的道長难礼。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么键思? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮常熙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘墓贿。我一直安慰自己队伟,他們只是感情好啥容,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般叫乌。 火紅的嫁衣襯著肌膚如雪凿试。 梳的紋絲不亂的頭發(fā)上板甘,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天呛谜,我揣著相機(jī)與錄音猫妙,去河邊找鬼齐帚。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的琅豆。 我是一名探鬼主播冻押,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼稿茉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了渺蒿?” 一聲冷哼從身側(cè)響起善延,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤训挡,失蹤者是張志新(化名)和其女友劉穎为肮,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡窥浪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡佛玄,死狀恐怖奥吩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布禀倔,位于F島的核電站涎才,受9級特大地震影響棕兼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一眷蜈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至果港,卻和暖如春萝衩,著一層夾襖步出監(jiān)牢的瞬間墙牌,已是汗流浹背虽风。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工内舟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留耕蝉,地道東北人。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓秕脓,卻偏偏與公主長得像搂鲫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容