vue自定義指令合集(超實(shí)用!)
一、什么是自定義指令
vue官方提供很多指令,如:v-model,v-show,v-if,v-if等,他們都以v-開(kāi)頭。當(dāng)這些指令不能滿足我們實(shí)際開(kāi)發(fā)需求時(shí),我們還可以自定義指令。自定義指令主要分為全局自定義指令和局部自定義指令。
二、全局自定義指令directive
在main.js中寫全局自定義指令
// 自動(dòng)獲取焦點(diǎn)
Vue.directive('focus', {
inserted: function (el) {
el.focus()
}
})三、局部自定義指令directives
可以在任意組件中定義自定義指令,directives是一個(gè)對(duì)象,他的每一個(gè)屬性就只一個(gè)自定義指令,這里定義了一個(gè)focus指令。
directives: {
focus: {
inserted: function (el) {
el.focus()
}
}
}四、自定義指令的調(diào)用
和普通指令的使用方式一樣v-自定義指令名稱
如v-focus
五、自定義指令的鉤子函數(shù)
有以下五個(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)忽略不必要的模板更新。componentUpdated:指令所在組件的 VNode 及其子 VNode 全部更新后調(diào)用。unbind:只調(diào)用一次,指令與元素解綁時(shí)調(diào)用。
每個(gè)鉤子函數(shù)有以下參數(shù):
- el:指令所綁定的元素,可以用來(lái)直接操作 DOM。
- binding:一個(gè)對(duì)象,包含以下 property:
- name:指令名,不包括 v- 前綴。
- value:指令的綁定值,例如:v-my-directive="1 + 1" 中,綁定值為 2。
- oldValue:指令綁定的前一個(gè)值,僅在 update 和 componentUpdated 鉤子中可用。無(wú)論值是否改變都可用。
- 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),僅在 update 和 componentUpdated 鉤子中可用。
注意:bind和insert都只調(diào)用一次;bind在insert前執(zhí)行,也就是bind在dom樹(shù)繪制前調(diào)用,insert在dom樹(shù)繪制后調(diào)用;涉及dom操作的,我們一般都用insert,如自動(dòng)獲取焦點(diǎn)指令,只能用insert函數(shù)。
六、自定義指令傳參
<div v-test:[data1]>這是測(cè)試頁(yè)。。。。</div>
可以用binding.arg去接收":"后的參加參數(shù),這里傳遞了data1這個(gè)變量,data1必須用[]包裹,否則就是‘data1’這個(gè)字符串,[]中只能傳遞一個(gè)變量,多個(gè)變量可以用對(duì)象或數(shù)組組裝。binding.value去接收"="后的參數(shù),這里是個(gè)函數(shù)所以用bingding.value()去調(diào)用。
<div v-test:[data1]='func'>這是測(cè)試頁(yè)。。。。</div>
test: {
inserted(el, binding, vnode) {
// 獲取參數(shù)
console.log('test',binding.arg);
// 執(zhí)行傳遞的函數(shù)
binding.value({success: true,data:{}});
},
}七、常見(jiàn)自定義指令
1、拖拽
dragV: {
bind(drag, binding, vNode) {
drag.style.position = 'absolute';
drag.style.zIndex = '9999';
//當(dāng)鼠標(biāo)按下時(shí)
drag.onmousedown = e => {
//做到瀏覽器兼容
e = e || window.event
let diffX = e.clientX - drag.offsetLeft
let diffY = e.clientY - drag.offsetTop
//當(dāng)拉著box移動(dòng)時(shí)
document.onmousemove = e => {
// 瀏覽器兼容
e = e || window.event;
let left = e.clientX - diffX;
let top = e.clientY - diffY;
drag.style.left = left + 'px';
drag.style.top = top + 'px';
}
// 當(dāng)鼠標(biāo)抬起時(shí)
document.onmouseup = function() {
this.onmousemove = null
this.onmouseup = null
}
}
}
},2、防抖
<div v-debounce:[time]="debounceFunc">這是測(cè)試頁(yè)。。。。</div>
debounce:{
inserted(el, binding) {
let timer;
let delay = binding.arg || 500;
el.addEventListener('click', () => {
if (timer) {
clearTimeout(timer)
}
timer = setTimeout(() => {
binding.value()
}, delay)
})
},
}八. 應(yīng)用場(chǎng)景
8.1 自動(dòng)獲取焦點(diǎn)(官方示例)
// 注冊(cè)一個(gè)全局自定義指令 `v-focus`
Vue.directive('focus', {
// 當(dāng)被綁定的元素插入到 DOM 中時(shí)……
inserted: function (el) {
// 聚焦元素
el.focus()
}
})
8.2 一鍵 Copy的功能
- 首先建一個(gè) js 文件(v-copy.js)。定義一個(gè)對(duì)象。( 指令實(shí)際就是一個(gè)對(duì)象 )
import { Message } from 'ant-design-vue';
const vCopy = { // 名字愛(ài)取啥取啥
/*
bind 鉤子函數(shù),第一次綁定時(shí)調(diào)用,可以在這里做初始化設(shè)置
el: 作用的 dom 對(duì)象
value: 傳給指令的值,也就是我們要 copy 的值
*/
bind(el, { value }) {
el.$value = value; // 用一個(gè)全局屬性來(lái)存?zhèn)鬟M(jìn)來(lái)的值,因?yàn)檫@個(gè)值在別的鉤子函數(shù)里還會(huì)用到
el.handler = () => {
if (!el.$value) {
// 值為空的時(shí)候,給出提示,我這里的提示是用的 ant-design-vue 的提示,你們隨意
Message.warning('無(wú)復(fù)制內(nèi)容');
return;
}
// 動(dòng)態(tài)創(chuàng)建 textarea 標(biāo)簽
const textarea = document.createElement('textarea');
// 將該 textarea 設(shè)為 readonly 防止 iOS 下自動(dòng)喚起鍵盤,同時(shí)將 textarea 移出可視區(qū)域
textarea.readOnly = 'readonly';
textarea.style.position = 'absolute';
textarea.style.left = '-9999px';
// 將要 copy 的值賦給 textarea 標(biāo)簽的 value 屬性
textarea.value = el.$value;
// 將 textarea 插入到 body 中
document.body.appendChild(textarea);
// 選中值并復(fù)制
textarea.select();
// textarea.setSelectionRange(0, textarea.value.length);
const result = document.execCommand('Copy');
if (result) {
Message.success('復(fù)制成功');
}
document.body.removeChild(textarea);
};
// 綁定點(diǎn)擊事件,就是所謂的一鍵 copy 啦
el.addEventListener('click', el.handler);
},
// 當(dāng)傳進(jìn)來(lái)的值更新的時(shí)候觸發(fā)
componentUpdated(el, { value }) {
el.$value = value;
},
// 指令與元素解綁的時(shí)候,移除事件綁定
unbind(el) {
el.removeEventListener('click', el.handler);
},
};
export default vCopy;總結(jié)
到此這篇關(guān)于vue自定義指令的文章就介紹到這了,更多相關(guān)vue自定義指令內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vxe-Table開(kāi)發(fā)中的各種坑以及避坑指南
vxe-table是一個(gè)全功能的Vue表格,滿足絕大部分對(duì)Table的一切需求,與任意組件庫(kù)完美兼容,下面這篇文章主要給大家介紹了關(guān)于Vxe-Table開(kāi)發(fā)中各種坑以及避坑的相關(guān)資料,需要的朋友可以參考下2022-09-09
解決微信瀏覽器緩存站點(diǎn)入口文件(IIS部署Vue項(xiàng)目)
這篇文章主要介紹了解決微信瀏覽器緩存站點(diǎn)入口文件(IIS部署Vue項(xiàng)目),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06
Vue-cli 使用json server在本地模擬請(qǐng)求數(shù)據(jù)的示例代碼
本篇文章主要介紹了Vue-cli 使用json server在本地模擬請(qǐng)求數(shù)據(jù)的示例代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-11-11
vue實(shí)現(xiàn)前端按鈕組件權(quán)限管理
這篇文章主要為大家介紹了vue實(shí)現(xiàn)前端按鈕組件權(quán)限管理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
Vue實(shí)現(xiàn)拖放排序功能的實(shí)例代碼
本文通過(guò)實(shí)例代碼給大家介紹了Vue中實(shí)現(xiàn)拖放排序功能,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07

