全局自定义指令:Vue.directive()
局部自定义指令:directives
directive(参数一,参数二)
参数一:指令名称
参数二:指令的配置项,可以是函数,也可以是对象
函数:
参数一:使用当前指令的元素
参数二:指令的详细信息
{
modifiers:修饰符(只要自定义指令后面跟了修饰符,modifiers对象中就有值,为true),
value:指令的值(假设指令这样写:<div v-test="'aaa'"></div>,那么value就是aaa)
}
指令的作用:操作DOM元素
步骤:
①src下新建utils/utils.js:
import Vue from "vue";
/**
* v-test指令:
* <div v-test="'发发发'"></div>
* 相当于
* <div>发发发</div>
*
*/
Vue.directive("test",(el,{value})=>{
el.innerText=value;
});
/**
* 设置背景颜色的指令
*
*/
Vue.directive("backgroundColor",(el,{value,...rest})=>{
el.style.backgroundColor=value;
});
/**
* 阻止浏览器默认事件:v-event.prev
*
*/
Vue.directive("event",(el,{modifiers})=>{
let {prev}=modifiers;
el.addEventListener("contextmenu",(e)=>{
if(prev){
e.preventDefault();
}
});
});
/**
* 自动聚焦
*
*/
Vue.directive("focus",{
// 获取光标在inserted中操作,此时元素已经插入到父节点了
inserted(el){
el.focus();
}
});
/**
* 第一个参数是指令名称,第二个参数如果是一个函数,这个函数是指令要做的事情,如果是一个对象,这个对象是指令的配置项。
*
*
*/
Vue.directive("wql",{
bind(){
// 当前元素使用当前指令的时候会被调用,只会调用一次,用来做初始化
console.log("bind")
},
inserted(){
// 当使用指令的元素被插入到父节点(#app)的时候会被触发
console.log("inserted")
},
update(){
// 只要当前元素不被移除,其他操作几乎都会触发这2个生命周期,先触发update后触发componentUpdate
// 虚拟DOM只要涉及到元素的隐藏、显示(display)值的改变、内容的改变等都会触发虚拟DOM更新
console.log("update")
},
componentUpdated(){
console.log("componentUpdate")
},
unbind(){
// 当只用指令的元素被卸载的时候会执行,简单的说就是当前元素被移除的时候
console.log("unbind")
}
});
/**
* v-drag
*
*/
Vue.directive("drag",(el,{modifiers,value})=>{
if(value){
var disX,disY;
var {l,t} = modifiers;
el.style.position = "absolute";
el.addEventListener("mousedown",mousedown)
function mousedown(e){
disX = e.offsetX;
disY = e.offsetY;
document.addEventListener("mousemove",move)
document.addEventListener("mouseup",up)
}
function move(e){
var x = e.clientX - disX;
var y = e.clientY - disY;
if((l&&t) || (!l&&!t)){
el.style.left = x + 'px';
el.style.top = y + 'px';
return;
}
if(l){
el.style.left = x + 'px';
return;
}
if(t){
el.style.top = y + 'px';
return;
}
}
function up(){
document.removeEventListener("mousemove",move)
document.removeEventListener("mouseup",up)
}
}
});
②main.js中引入:
import "./utils/utils.js";
③App.vue中使用自定义指令:
<div v-test="'发发发'" v-backgroundColor.not="'blue'"></div>
<div v-test="'阻止浏览器默认事件'" v-backgroundColor="'yellow'" v-event.prev></div>
<input type="text" v-focus>
指令的生命周期:
bind():当元素只用当前指令的时候会被调用,只会调用一次,用来做初始化
inserted():当使用指令的元素被插入到父节点(#app)的时候会被触发
update():只要当前元素不被移除,其他操作几乎都会触发这2个生命周期,先触发update后触发componentUpdate。虚拟DOM什么时候更新:只要涉及到元素的隐藏、显示(display)值的改变、内容的改变等都会触发虚拟DOM更新
componentUpdate():组件更新
unbind():当使用指令的元素被卸载的时候会执行,就是当前元素被移除的时候
来源:https://www.cnblogs.com/wuqilang/p/12345244.html