Vue.directive("drag",(...rest)=>{
//...rest展開對象
console.log(rest);//第一個值為使用v-drag指令的當前元素,
console.log(typeof rest);//object
})
所以,設置第一個參數為當前的元素el(誰使用該指令,誰就是當前元素)
modifiers修飾符:不寫,則為空,寫則為a:true,b:true,,a,b為修飾符
value:值,並不是固定的,根據v-drag="值"來確定的
rewName:指令的全稱
es6解構賦值
{modifier,value}獲取了...rest中的modifier,value值
vue全局自定義指令實現拖拽
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> .box{ width: 100px; height: 100px; background: red; position: absolute; } </style> </head> <body> <div id="app">
//y軸拖拽 <div class="box" v-drag.y="show"></div>
//x軸拖拽 <div class="box" v-drag.x="show"></div> </div> </body> </html> <script src="vue.js"></script> <script> //全局自定義指令(必須在實例之前) /* 參數1:指令的名稱 參數2:指令實現的函數 */ Vue.directive("drag",(el,{value,modifiers})=>{ //el代表使用該指令的元素 el.onmousedown = function(e){ //console.log("s"); var disx = e.offsetX ; var disy = e.offsetY; //阻止瀏覽器的默認事件 e.preventDefault(); document.onmousemove = function(e){ var x = e.clientX - disx; var y = e.clientY - disy; //如果表達式的結果是false,就不拖拽 if(!value){ return; }
//修飾符 if(modifiers.x){ el.style.left = x + "px"; }
//修飾符 if(modifiers.y){ el.style.top = y + "px"; } if(!(modifiers.x && !modifiers.y) && value){ el.style.left = x + "px"; el.style.top = y + "px"; } } document.onmouseup = function(){ document.onmousemove = null; document.onmouseup = null; } } }) var vm = new Vue({ el:"#app", data:{ show:true }, method:{ } }) </script>
