每個(gè)人都能實(shí)現(xiàn)的vue自定義指令

前文

  先來bb一堆廢話哈哈..
  
  用vue做項(xiàng)目也有一年多了.除了用別人的插件之外.自己也沒嘗試去封裝指令插件之類的東西來用.
  
  剛好最近在項(xiàng)目中遇到一個(gè)問題.(快速點(diǎn)擊按鈕多次觸發(fā)多次綁定的方法),于是就想說自己封裝一個(gè) 
  自定義指令來解決這個(gè)問題,于是便有了自己的第一個(gè)vue自定義指令 vue-reclick . 
 

vue-reclick 傳送門

哈哈,好了!廣告打完了,開始進(jìn)入正題(等一下,聽說star有獎(jiǎng)哦)...

1.使用場(chǎng)景

 在vue 2.0中,有的情況下,你需要對(duì)普通DOM元素進(jìn)行底層操作,這時(shí)候就需要用到自定義指令!   

2.api詳解

 其實(shí)關(guān)于vue自定義指令的使用 vue官方文檔已經(jīng)說的非常清楚.這里只是簡(jiǎn)單的照搬,哦不,講一下 (23333..)..
 1.首先創(chuàng)建一個(gè)指令自定義對(duì)象directObj次哈。
 
 let directObj = {}.
 
 2.vue為所有指令的鉤子函數(shù)都提供一些函數(shù)參數(shù)。
    
 let args = {
  el:'指令所綁定的元素秸脱,可以用來直接操作 DOM ',
  binding:{
   name:'指令名,不包括 v- 前綴吗浩。',
   value:'指令的綁定值偎行,例如:v-my-directive="1 + 1" 中,綁定值為 2泉褐。',
   oldValue:'指令綁定的前一個(gè)值,僅在 update 和 componentUpdated 鉤子中可用鸟蜡。無論值是否改變都可用膜赃。',
   expression:"字符串形式的指令表達(dá)式。例如 v-my-directive="1 + 1" 中揉忘,表達(dá)式為 "1 + 1"",
   arg:"傳給指令的參數(shù)跳座,可選。例如 v-my-directive:foo 中泣矛,參數(shù)為 "foo"",
   modifiers:"一個(gè)包含修飾符的對(duì)象疲眷。例如:v-my-directive.foo.bar 中,修飾符對(duì)象為 { foo: true, bar: true }乳蓄。",
   vnode:"Vue 編譯生成的虛擬節(jié)點(diǎn)。",
   oldVnode:"上一個(gè)虛擬節(jié)點(diǎn)"
  }
 }
 
 3.在directObj上可根據(jù)需要定義一些鉤子函數(shù)
 
 directObj.bind = function({...args }){
 
     //只調(diào)用一次夕膀,指令第一次綁定到元素時(shí)調(diào)用虚倒。在這里可以進(jìn)行一次性的初始化設(shè)置。
 } 
 
 directObj.inserted= function({...args }){
 
     //被綁定元素插入父節(jié)點(diǎn)時(shí)調(diào)用 (僅保證父節(jié)點(diǎn)存在产舞,但不一定已被插入文檔中)魂奥。
 } 

 directObj.update= function({...args }){
 
     //所在組件的 VNode 更新時(shí)調(diào)用,但是可能發(fā)生在其子 VNode 更新之前易猫。
     指令的值可能發(fā)生了改變耻煤,也可能沒有。 
     但是你可以通過比較更新前后的值來忽略不必要的模板更新 
 }

 directObj.componentUpdated= function({...args }){
 
     //指令所在組件的 VNode 及其子 VNode 全部更新后調(diào)用准颓。
 }
 
 directObj.unbind= function({...args }){
 
     //只調(diào)用一次哈蝇,指令與元素解綁時(shí)調(diào)用。
 }

 4.注冊(cè)自定義指令
  (1).全局注冊(cè):
  
      Vue.directive('指令名稱','指令對(duì)象');
      例:Vue.directive('reclick',directObj);
      注意:全局注冊(cè)自定義指令需在實(shí)例化Vue之前.
    
  (2).局部(組件)注冊(cè):
  
      export default{ 
       directives:{
         '指令名稱':'指令配置'
       }
      }
      
      例:
      
      export default{ 
       directives:{
         'reclick':directObj
       }
      }

3.封裝自定義指令

 好了,簡(jiǎn)單的講(抄)完 自定義指令相關(guān)的api,接下來我們通過vue-reclick來簡(jiǎn)單的講解一下如何封裝一個(gè)vue自定義指令吧.

 由于vue-reclick 只是用來解決一個(gè)問題的小東西,所以代碼也相對(duì)簡(jiǎn)單,這里主要講一個(gè)封裝自定義指令的過程.
    
 下面我們先來看下vue-reclick的源碼:
 ;(function() {
  /**
   * 函數(shù)節(jié)流
   *
   * @param {any} method 方法名
   */
  function throttle(method) {
    clearTimeout(method.tId);
    method.tId = setTimeout(function() {
      method.call();
    }, 200);
  }
  /**
   * 事件綁定
   *
   * @param {any} element  綁定dom
   * @param {any} event    事件類型
   * @param {any} listener 方法
   */
  function addEvent(element, event, listener) {
    if (element.addEventListener) {
      element.addEventListener(event, listener, false);
    } else if (element.attachEvent) {
      element.attachEvent('on' + event, listener);
    } else {
      element['on' + event] = listener;
    }
  }
  var vueReclick = {};
  var reclick = {
    bind: function(el, binding) {
      addEvent(el, 'click', function() {
        throttle(binding.value);
      });
    },
    unbind: function(el) {
      addEvent(el, 'click', function() {});
    }
  };

  vueReclick.install = function(Vue) {
    Vue.directive('reclick', reclick);
  };

  if (typeof exports == 'object') {
    module.exports = vueReclick;
  } else if (typeof define == 'function' && define.amd) {
    define([], function() {
      return vueReclick;
    });
  } else if (window.Vue) {
    window.vueReclick = vueReclick;
    Vue.use(vueReclick);
  }
})();
1.將所有代碼包裹在一個(gè)立即執(zhí)行函數(shù)之中.

  立即執(zhí)行函數(shù)有自己的作用域,可以避免變量沖突與污染.    
  
  將獨(dú)立的功能封裝在自包含模塊中.  

2.vue-reclick功能相關(guān)的代碼這里簡(jiǎn)單說明下.

  這里封裝了兩個(gè)方法(1.throttle,2.addEvent)
    
  一個(gè)指令配置對(duì)象(reclick)

  在reclick對(duì)象里定義了bind方法,在指令綁定到dom的時(shí)候,在dom上綁定點(diǎn)擊事件,并獲取指令綁定的方法名稱.
  在觸發(fā)點(diǎn)擊事件的時(shí)候通過函數(shù)節(jié)流的方法來調(diào)用該方法,從而解決短時(shí)間快速點(diǎn)擊觸發(fā)多次方法的問題.
    
  在reclick對(duì)象里定義了unbind方法,在指令與dom解綁的時(shí)候,將傳入方法與dom進(jìn)行解綁..

3.定義一個(gè)vueReclick插件對(duì)象,并在該對(duì)象上定義一個(gè)install方法.

(Vue.js 的插件應(yīng)當(dāng)有一個(gè)公開方法 install 攘已。這個(gè)方法的第一個(gè)參數(shù)是 Vue 構(gòu)造器)

4.在install方法里全局注冊(cè)指令

 vueReclick.install = function(Vue) {
    Vue.directive('reclick', reclick);
 };
 
5.兼容多種模塊規(guī)范暴露該插件

  if (typeof exports == 'object') {
    module.exports = vueReclick;
  } else if (typeof define == 'function' && define.amd) {
    define([], function() {
      return vueReclick;
    });
  } else if (window.Vue) {
    window.vueReclick = vueReclick;
    Vue.use(vueReclick);
  }

6.到這一步,其實(shí)一個(gè)簡(jiǎn)單的自定義組件就已經(jīng)大功告成了.

7.最后.我們來講一下如何在項(xiàng)目中引入vueReclick并使用.

  (1).非node環(huán)境中
      
    在第5點(diǎn)我們?cè)趀lse if(window.Vue)中其實(shí)已經(jīng)Vue的全局方法來使用該插件.
    所以我們可以直接在項(xiàng)目中使用該指令.
    例:https://github.com/webfansplz/vue-reclick/blob/master/example/index.html

  (2).node環(huán)境中

    我們可以在項(xiàng)目入口文件中引入該插件,然后全局使用它,下面我們會(huì)講解如何將插件發(fā)布到Npm.
    例:
    import vueReclick from 'vue-reclick';
    Vue.use(vueReclick);

4.將封裝好的插件發(fā)布到npm.

1.在Npm官網(wǎng)注冊(cè)一個(gè)賬號(hào)

2.在項(xiàng)目目錄下 使用npm login 登錄. 

3.在項(xiàng)目目錄下 使用npm publish 上傳插件

4.大功告成,這樣以后我們?cè)谒许?xiàng)目中就都可以使用npm install 來下載我們自己封裝好的插件啦!.
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末炮赦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子样勃,更是在濱河造成了極大的恐慌吠勘,老刑警劉巖性芬,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異剧防,居然都是意外死亡植锉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門峭拘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來俊庇,“玉大人,你說我怎么就攤上這事棚唆∠境啵” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵宵凌,是天一觀的道長(zhǎng)鞋囊。 經(jīng)常有香客問我,道長(zhǎng)瞎惫,這世上最難降的妖魔是什么溜腐? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮瓜喇,結(jié)果婚禮上挺益,老公的妹妹穿的比我還像新娘。我一直安慰自己乘寒,他們只是感情好望众,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伞辛,像睡著了一般烂翰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蚤氏,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天甘耿,我揣著相機(jī)與錄音,去河邊找鬼竿滨。 笑死佳恬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的于游。 我是一名探鬼主播毁葱,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼贰剥!你這毒婦竟也來了头谜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鸠澈,失蹤者是張志新(化名)和其女友劉穎柱告,沒想到半個(gè)月后截驮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡际度,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年葵袭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乖菱。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坡锡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出窒所,到底是詐尸還是另有隱情鹉勒,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布吵取,位于F島的核電站禽额,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏皮官。R本人自食惡果不足惜脯倒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捺氢。 院中可真熱鬧藻丢,春花似錦、人聲如沸摄乒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)馍佑。三九已至斋否,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挤茄,已是汗流浹背如叼。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工冰木, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留穷劈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓踊沸,卻偏偏與公主長(zhǎng)得像歇终,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子逼龟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,187評(píng)論 25 707
  • 前段時(shí)間看到一個(gè)消息宜肉,一位車主哭訴他剛買了的新車,去車管車上牌翎碑,在途中沒有違章違規(guī)谬返,可是卻被交警給攔了下來,直接扣...
    走走看看121閱讀 913評(píng)論 0 0
  • 一互惠日杈,二承諾和一致遣铝,三,權(quán)威莉擒,四社會(huì)認(rèn)同酿炸,五稀缺 三,權(quán)威涨冀,主要表現(xiàn)在頭銜填硕,二是衣著,
    笑顏于粵閱讀 152評(píng)論 6 1
  • 一路走一路買蝇裤,走到東街時(shí)手上已經(jīng)拎不動(dòng)了廷支,回頭再看看這條老橫街,嗯栓辜!我喜歡的市井生活恋拍,大概就是這個(gè)味道吧。對(duì)了藕甩,還...
    河馬家的書奴閱讀 143評(píng)論 0 2
  • 翔翔最近越來越依戀爸爸了施敢,呃,誰(shuí)讓他媽愛河?xùn)|獅吼狭莱,每次都是茆同志出來哄僵娃,滿足了翔翔要撒嬌的需求,茆同志耐心越...
    愛自滿溢閱讀 125評(píng)論 0 0