欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue中自定義指令(directive)的基本使用方法

 更新時(shí)間:2021年09月23日 10:36:12   作者:丶Serendipity丶  
Vue中內(nèi)置了很多的指令,但有時(shí)候這些指令并不能滿足我們,或者說(shuō)我們想為元素附加一些特別的功能,這時(shí)候我們就需要用到vue中一個(gè)很強(qiáng)大的功能了—自定義指令,這篇文章主要給大家介紹了關(guān)于vue中自定義指令(directive)的基本使用方法,需要的朋友可以參考下

前言

在vue項(xiàng)目中我們經(jīng)常使用到 v-show ,v-if,v-for等內(nèi)置的指令,除此之外vue還提供了非常方便的自定義指令,供我們對(duì)普通的dom元素進(jìn)行底層的操作。使我們的日常開(kāi)發(fā)變得更加方便快捷。本文就來(lái)總結(jié)一下自定義指令的使用方法及常用的場(chǎng)景。

正文

1.全局注冊(cè)

這里全局注冊(cè)一個(gè)指令,用于使用該指令的元素加一個(gè)紅色邊框,通過(guò)指令操作樣式。

<div id="app">
    <h1 type="text" v-red>我是h1元素</h1>
    <div v-red>我是div元素</div>
    <p v-red>我是p元素</p><br>
    <input type="text" v-red><br>
  </div>
  <script>
    Vue.directive("red", {
      // 指令的定義
      inserted: function (el) {
        console.log(111);
        el.style.border = "1px solid red"
      }
    })
    new Vue({
      el: "#app",
      data() {
        return {
        }
      },
      methods: {
      }
    })
  </script>

運(yùn)行結(jié)果如下:

上面的代碼中通過(guò) Vue.directive 方法注冊(cè)了一個(gè)全局的指令,該函數(shù)接收兩個(gè)參數(shù),第一個(gè)參數(shù)為指令名稱,在元素中通過(guò) " v-名稱 " 綁定元素,第二個(gè)參數(shù)為對(duì)綁定元素進(jìn)行處理的鉤子函數(shù),后面會(huì)有詳細(xì)介紹。

2.局部注冊(cè)

和全局注冊(cè)指令基本一樣,只是作用范圍不同而已,這里在組件內(nèi)部注冊(cè)一個(gè)自定義指令用于給組件內(nèi)部的綁定元素設(shè)置藍(lán)色邊框。

<div id="app">
    <border-item></border-item>
  </div>
  <script>
    Vue.directive("red", {
      // 指令的定義
      inserted: function (el) {
        console.log(111);
        el.style.border = "1px solid red"
      }
    })
    // 定義子組件
    Vue.component("border-item", {
      directives: {
        blue: {
          // 指令的定義
          inserted: function (el) {
            el.style.border = "1px solid blue"
          }
        }
      },
      template: `<div>
                    <h1  v-blue>我是子組件h1元素</h1>
                    <div v-blue>我是子組件div元素</div>
                    <p v-blue>我是子組件p元素</p><br>
                    子組件<input type="text" v-blue><br>
                    <p  v-blue>我是子組件h1元素,我同時(shí)使用了全局和局部自定義指令</p>
                </div>`
    })
    new Vue({
      el: "#app",
      data() {
        return {
        }
      },
      methods: {
      }
    })
  </script>

運(yùn)行結(jié)果如下:

通過(guò)上面的代碼,在子組件內(nèi)部通過(guò) directives 對(duì)象注冊(cè)了一個(gè)給綁定元素設(shè)置藍(lán)色邊框的組件,該對(duì)象中傳入鍵值對(duì),其中鍵表示指令名稱,通過(guò)" v-名稱 "使用,其值對(duì)應(yīng)一個(gè)對(duì)象,對(duì)象內(nèi)部為指令的相關(guān)鉤子函數(shù)。后面詳解鉤子函數(shù)。

注意:當(dāng)同一個(gè)元素及使用了全局指令和局部指令對(duì)統(tǒng)一屬性進(jìn)行操作的時(shí)候,會(huì)優(yōu)先使用局部自定義指令,這里采用就近原則,局部指令會(huì)優(yōu)先于全局指令對(duì)統(tǒng)一屬性操作的調(diào)用。

3.鉤子函數(shù)及參數(shù)設(shè)置

看了上面的介紹我們值都了directive的用法,但是里面的鉤子函數(shù)還需要清楚,只有明白了鉤子函數(shù)的調(diào)用時(shí)機(jī),才能定義出更加完美的指令。

一個(gè)指令定義對(duì)象可以提供如下幾個(gè)鉤子函數(shù)(均為可選):

* bind:只調(diào)用一次,指令第一次綁定到元素時(shí)調(diào)用。在這里可以進(jìn)行一次性的初始化設(shè)置。

* inserted:被綁定元素插入父節(jié)點(diǎn)時(shí)調(diào)用(僅保證父節(jié)點(diǎn)存在,但不一定已被插入文檔中)。

* update:所在組件的VNode更新時(shí)調(diào)用,但是可能發(fā)生在其子VNode更新之前。指令的值可能發(fā)生了改變,也可能沒(méi)有。但是你可以通過(guò)比較更新前后      的值來(lái)忽略不必要的模板更新(詳細(xì)的鉤子函數(shù)參數(shù)見(jiàn)下)。

* componentUpdated:指令所在組件的VNode及其子VNode全部更新后調(diào)用。

* unbind:只調(diào)用一次,指令與元素解綁時(shí)調(diào)用。

鉤子函數(shù)參數(shù)指令鉤子函數(shù)會(huì)被傳入以下參數(shù):  

* el:指令所綁定的元素,可以用來(lái)直接操作DOM?! ?/p>

* binding:一個(gè)對(duì)象,包含以下property:  

* name:指令名,不包括v-前綴?! ?/p>

* value:指令的綁定值,例如:v-my-directive="1+1"中,綁定值為2?! ?/p>

* oldValue:指令綁定的前一個(gè)值,僅在update和componentUpdated鉤子中可用。無(wú)論值是否改變都可用?! ?/p>

* expression:字符串形式的指令表達(dá)式。例如v-my-directive="1+1"中,表達(dá)式為"1+1"?! ?/p>

* arg:傳給指令的參數(shù),可選。例如v-my-directive:foo中,參數(shù)為"foo"?! ?/p>

* modifiers:一個(gè)包含修飾符的對(duì)象。例如:v-my-directive.foo.bar中,修飾符對(duì)象為{foo:true,bar:true}。  

* vnode:Vue編譯生成的虛擬節(jié)點(diǎn)。  

* oldVnode:上一個(gè)虛擬節(jié)點(diǎn),僅在update和componentUpdated鉤子中可用。

4.靈活用法

(1)動(dòng)態(tài)指令參數(shù)

指令的參數(shù)可以是動(dòng)態(tài)的。例如,在v-mydirective:[argument]="value"中,argument參數(shù)可以根據(jù)組件實(shí)例數(shù)據(jù)進(jìn)行更新!這使得自定義指令可以在應(yīng)用中被靈活使用。下面例子中分別設(shè)置指令實(shí)現(xiàn)元素的邊框綁定和元素的背景屬性綁定。

<div id="app">
    <h1 v-border="redBorder">我是動(dòng)態(tài)指令參數(shù)的元素1</h1>  
    <h1 v-color:[pro]="redBg">我是動(dòng)態(tài)指令參數(shù)的元素2</h1>
  </div>
  <script>
    Vue.directive("border", {
      bind: function (el, binding, vnode) {
        console.log("el", el);
        console.log("binding", binding);
        console.log("vnode", vnode);
        el.style.border = binding.value
      }
    })
    Vue.directive("color", {
      bind: function (el, binding, vnode) {
        console.log("el", el);
        console.log("binding", binding);
        console.log("vnode", vnode);
        el.style[binding.arg] = binding.value
      }
    })
    new Vue({
      el: "#app",
      data() {
        return {
          redBorder: "1px solid red",
          pro: "backgroundColor",
          redBg: "green"
        }
      },
      methods: {
      }
    })
  </script>

運(yùn)行結(jié)果如下:

順便看下打印的參數(shù):

上面的代碼中通過(guò)兩種方式介紹了動(dòng)態(tài)參數(shù)自定義指令的方法,使用十分靈活,根據(jù)實(shí)際需要選擇合適的方式。

(2)函數(shù)簡(jiǎn)寫(xiě)方式

在很多時(shí)候,你可能想在bind和update時(shí)觸發(fā)相同行為,而不關(guān)心其它的鉤子。比如這樣寫(xiě):

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

(3)對(duì)象字面量方式

在綁定自定義指令的元素紅傳入一個(gè)對(duì)象的格式的數(shù)據(jù),然后在函數(shù)簡(jiǎn)寫(xiě)方式中使用。

<div id="app">
    <h1 v-color="{ color: 'red', text: 'hello!' }">我是對(duì)象字面量形式</h1>
  </div>
  <script>
    // 對(duì)象字面量
    Vue.directive('color', function (el, binding) {
      console.log(binding.value.color) // => "red"
      console.log(binding.value.text)  // => "hello!"
      el.style.color = binding.value.color
      el.innerHTML = binding.value.text
    })
    new Vue({
      el: "#app",
      data() {
        return {
        }
      },
      methods: {
      }
    })
  </script>

運(yùn)行結(jié)果如下:

5.使用場(chǎng)景

除了上面的使用場(chǎng)景外,比如我們?cè)陧?xiàng)目中通過(guò)自定義指令來(lái)控制一個(gè)前端頁(yè)面的權(quán)限問(wèn)題,在指令中設(shè)置一個(gè)參數(shù),當(dāng)頁(yè)面加載或者提交事件觸發(fā)的時(shí)候,首先執(zhí)行該自定義指令的事件,去請(qǐng)求校驗(yàn)是否有這個(gè)權(quán)限,做出相應(yīng)的操作。使用的地方還有好多,需要在項(xiàng)目中不斷練習(xí),可能有別的替代的方法而不被運(yùn)用,這就需要我們不斷去學(xué)習(xí)鞏固這些基礎(chǔ)知識(shí),應(yīng)用最優(yōu)的解決方法去完成項(xiàng)目。

寫(xiě)在最后

到此這篇關(guān)于vue中自定義指令(directive)的基本使用方法的文章就介紹到這了,更多相關(guān)vue自定義指令directive使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue v2.4中新增的$attrs及$listeners屬性使用教程

    Vue v2.4中新增的$attrs及$listeners屬性使用教程

    這篇文章主要給大家介紹了關(guān)于Vue v2.4中新增的$attrs及$listeners屬性的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • vue.js 1.x與2.0中js實(shí)時(shí)監(jiān)聽(tīng)input值的變化

    vue.js 1.x與2.0中js實(shí)時(shí)監(jiān)聽(tīng)input值的變化

    這篇文章主要介紹了vue.js 1.x與vue.js2.0中js實(shí)時(shí)監(jiān)聽(tīng)input值的變化的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-03-03
  • vue+element實(shí)現(xiàn)圖片上傳及裁剪功能

    vue+element實(shí)現(xiàn)圖片上傳及裁剪功能

    這篇文章主要為大家詳細(xì)介紹了vue+element實(shí)現(xiàn)圖片上傳及裁剪功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • vue-router實(shí)現(xiàn)簡(jiǎn)單vue多頁(yè)切換、嵌套路由、路由跳轉(zhuǎn)的步驟和報(bào)錯(cuò)

    vue-router實(shí)現(xiàn)簡(jiǎn)單vue多頁(yè)切換、嵌套路由、路由跳轉(zhuǎn)的步驟和報(bào)錯(cuò)

    最近學(xué)習(xí)到VUE路由這塊,發(fā)現(xiàn)這塊知識(shí)點(diǎn)有點(diǎn)多,好容易混亂,這篇文章主要介紹了vue-router實(shí)現(xiàn)簡(jiǎn)單vue多頁(yè)切換、嵌套路由、路由跳轉(zhuǎn)的步驟和報(bào)錯(cuò)的相關(guān)資料,需要的朋友可以參考下
    2024-05-05
  • 詳解Vue學(xué)習(xí)筆記進(jìn)階篇之列表過(guò)渡及其他

    詳解Vue學(xué)習(xí)筆記進(jìn)階篇之列表過(guò)渡及其他

    本篇文章主要介紹了詳解Vue學(xué)習(xí)筆記進(jìn)階篇之列表過(guò)渡及其他,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-07-07
  • vue proxyTable 接口跨域請(qǐng)求調(diào)試的示例

    vue proxyTable 接口跨域請(qǐng)求調(diào)試的示例

    本篇文章主要介紹了vue proxyTable 接口跨域請(qǐng)求調(diào)試的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • Vue使用axios圖片上傳遇到的問(wèn)題

    Vue使用axios圖片上傳遇到的問(wèn)題

    后端寫(xiě)個(gè)上傳圖片的接口可不是很簡(jiǎn)單,只需要讓這個(gè)字段限制為圖片格式,后臺(tái)做個(gè)保存的邏輯就完事了,前端處理還要牽扯到請(qǐng)求頭,數(shù)據(jù)格式的處理等等問(wèn)題,按照老傳統(tǒng)把圖片按照字符串往接口put發(fā)現(xiàn)返回的全是400錯(cuò)誤,直到我知道了前端的FormData方法!
    2021-05-05
  • Vue中實(shí)現(xiàn)父子組件雙向數(shù)據(jù)流的三種方案分享

    Vue中實(shí)現(xiàn)父子組件雙向數(shù)據(jù)流的三種方案分享

    通常情況下,父子組件的通信都是單向的,或父組件使用props向子組件傳遞數(shù)據(jù),或子組件使用emit函數(shù)向父組件傳遞數(shù)據(jù),本文將嘗試講解Vue中常用的幾種雙向數(shù)據(jù)流的使用,需要的朋友可以參考下
    2023-08-08
  • Vue組件之間的數(shù)據(jù)共享詳解

    Vue組件之間的數(shù)據(jù)共享詳解

    這篇文章主要為大家介紹了Vue組件之間的數(shù)據(jù)共享,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-11-11
  • vue實(shí)現(xiàn)導(dǎo)出word文檔功能實(shí)例(含多張圖片)

    vue實(shí)現(xiàn)導(dǎo)出word文檔功能實(shí)例(含多張圖片)

    項(xiàng)目需要導(dǎo)出word,于是乎又是查閱資料,然后自己寫(xiě),下面這篇文章主要給大家介紹了關(guān)于vue實(shí)現(xiàn)導(dǎo)出word文檔功能(含多張圖片)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09

最新評(píng)論