vue之自定義元件
阿新 • • 發佈:2020-12-27
vue之自定義元件
除了核心功能預設內建的指令外,vue也允許使用者註冊自定義指令。雖然在vue2.0中,程式碼複用和抽象的主要形式是元件,但是有些情況下,我們仍需要對普通DOM元素進行底層操作,這個時候就需要用到自定義指令,例如,我們希望將元素的背景色變為紅色,就可以通過指令實現。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>vue</title> <style></style> <script src="vue.js"></script> </head> <body> <div id="box"> <p v-red>aaaaa</p> <p v-red>12345</p> <p v-red>自定義</p> </div> <script> Vue.directive('red',function(){ this.el.style.background='red'; }); var vm=new Vue({ el:'#box', data:{ msg:'welcome' } }); </script> </body> </html>
上面簡單的例項中,主要是展示了自定義元件的用法:
其中"red"為我們自定義的指令,在使用的時候,需要加上"v-"的字首,後面接的方法是該指令需要實現的功能;"el"是指令所繫結的元素,可以用來直接操作DOM。
自定義指令傳參
在上面的自定義指令中,我們實現了將元素背景色變為紅色,那麼如果我們需要將背景色改為藍色,只是顏色改變了,其他的都是一樣的,若這樣再重新定義一個指令,就完全沒必要了,因此我們可以考慮傳參的方法了。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>vue</title> <style></style> <script src="vue.js"></script> </head> <body> <div id="box"> <p v-red='r'>aaaaa</p> <p v-red='g'>12345</p> <p v-red='p'>自定義</p> </div> <script> Vue.directive('red',function(color){ this.el.style.background=color; }); var vm=new Vue({ el:'#box', data:{ r:'red', g:'gray', p:'pink' } }); </script> </body> </html>
但是上面的這種的方式的要求是我們必須現在vue例項中宣告這些顏色引數,並不能滿足我們想要隨意更換顏色的要求,因此,需要繼續優化。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>vue</title> <style></style> <script src="vue.js"></script> </head> <body> <div id="box"> <p v-red="'red'">aaaaa</p> <p v-red="'gray'">12345</p> <p v-red="'pink'">自定義</p> </div> <script> Vue.directive('red',function(color){ this.el.style.background=color; }); var vm=new Vue({ el:'#box', }); </script> </body> </html>
自定義指令獲取事件屬性
和其他JavaScript事件一樣,自定義指令事件也能獲取事件屬性,例如鍵盤事件,滑鼠事件等,下面通過獲取滑鼠位置實現自定義拖拽指令。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>vue</title> <style> </style> <script src="vue.js"></script> </head> <body> <div id="box"> <div v-drag :style="{width:'100px', height:'100px', background:'blue', position:'absolute', right:0, top:0}"></div> <div v-drag :style="{width:'100px', height:'100px', background:'red', position:'absolute', left:0, top:0}"></div> </div> <script> Vue.directive('drag',function(){ var oDiv=this.el; oDiv.onmousedown=function(ev){ var disX=ev.clientX-oDiv.offsetLeft; var disY=ev.clientY-oDiv.offsetTop; document.onmousemove=function(ev){ var l=ev.clientX-disX; var t=ev.clientY-disY; oDiv.style.left=l+'px'; oDiv.style.top=t+'px'; }; document.onmouseup=function(){ document.onmousemove=null; document.onmouseup=null; }; }; }); var vm=new Vue({ el:'#box', data:{ msg:'welcome' } }); </script> </body> </html>
拖拽前:
拖拽後:
自定義元素指令
所謂自定義元素指令,就是指該指令能夠像其他的元素如div,span等一樣直接使用,既然是元素指令,自然就和其他的自定義指令不一樣了,下面通過一個簡單的例子來展示自定義元素指令的用法,依舊是改變元素的背景色,具體實現如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>vue</title> <style> </style> <script src="vue.js"></script> </head> <body> <div id="box"> <zns-red>自定義元素指令</zns-red> </div> <script> Vue.elementDirective('zns-red',{ bind:function(){ this.el.style.background='red'; } }); var vm=new Vue({ el:'#box', data:{ a:'blue' } }); </script> </body> </html>
自定義指令和自定義元素指令相比,主要存在三個不同之處:
- 自定義指令使用elementDirective
- 自定義指令的功能函式直接寫在後面的方法中,自定義元素指令的功能函式必須寫在鉤子函式中(bind、inserted等)
- 自定義指令在使用時,需要用v-開頭,新增到需要的元素中;自定義元素指令則是直接像其他元素一樣使用即可。