詳解vue如何使用自定義指令
自定義指令到底是什么
首先一定要明白,自定義指令其實(shí)就是一個(gè)對(duì)象!只是該對(duì)象中包含了類似組件生命周期鉤子的函數(shù)而已,如created,mounted,該鉤子函數(shù)會(huì)收到當(dāng)前DOM元素作為參數(shù),從而可以使用該DOM元素進(jìn)行操作。
<template> <input id="IamInput" v-focus /> </template> <script setup> const vFocus = { mounted: (el:any) => { console.log('el是啥子哦',el); el.focus() } } //當(dāng)然也可以不寫成箭頭函數(shù) const vFocus = { mounted: function (el: any) { console.log('el是啥子哦', el); el.focus(); }, }; </script>
當(dāng)然上面只是局部注冊(cè),我們一般用的是全局注冊(cè),即在main.ts中進(jìn)行注冊(cè):
const vFocus = { mounted: function (el: any) { console.log('el是啥子哦', el); el.focus(); }, }; app.directive('focus',vFocus)
自定義指令中的鉤子函數(shù)
自定義指令中提供了許多鉤子函數(shù),我們可以在不同的鉤子函數(shù)中調(diào)用不同的參數(shù)
const myDirective = { // 在綁定元素的 attribute 前 // 或事件監(jiān)聽(tīng)器應(yīng)用前調(diào)用 created(el, binding, vnode, prevVnode) { // 下面會(huì)介紹各個(gè)參數(shù)的細(xì)節(jié) }, // 在元素被插入到 DOM 前調(diào)用 beforeMount(el, binding, vnode, prevVnode) {}, // 在綁定元素的父組件 // 及他自己的所有子節(jié)點(diǎn)都掛載完成后調(diào)用 mounted(el, binding, vnode, prevVnode) {}, // 綁定元素的父組件更新前調(diào)用 beforeUpdate(el, binding, vnode, prevVnode) {}, // 在綁定元素的父組件 // 及他自己的所有子節(jié)點(diǎn)都更新后調(diào)用 updated(el, binding, vnode, prevVnode) {}, // 綁定元素的父組件卸載前調(diào)用 beforeUnmount(el, binding, vnode, prevVnode) {}, // 綁定元素的父組件卸載后調(diào)用 unmounted(el, binding, vnode, prevVnode) {} }
為了容易理解,我們直接用一個(gè)案例來(lái)學(xué)習(xí)自定義指令即可。
案例
<template> <input id="IamInput" v-focus="num" /> <el-button @click="num++">點(diǎn)擊使得num++</el-button> </template> <script lang="ts" setup> const num=ref(1) const vFocus = { mounted(el: any,binding:any, vnode:any, prevVnode:any) { el.value=binding.value //el是DOM元素,el.value就是input框的值,我們?cè)谠貟燧d時(shí)設(shè)置一個(gè)默認(rèn)值為1 }, updated (el: any,binding:any, vnode:any, prevVnode:any) { // 我們?cè)谠馗聲r(shí)設(shè)置乘以2倍的操作 console.log('binding',binding); el.value=binding.value//更新input框的內(nèi)容 }, }; //在main.ts中全局掛載 app.directive('focus',vFocus) </script>
- 該案例非常簡(jiǎn)單,大家應(yīng)該一看就明白,首先定義一個(gè)input框,然后定義自定義指令,在DOM元素掛載時(shí)把binding.value(如官網(wǎng)所說(shuō),binging中的value參數(shù)就是傳遞給DOM元素的值,在這里就是num)賦值給el.value,el.value是什么?當(dāng)然就是輸入框的內(nèi)容啦,所有一上來(lái),輸入框中的值就是num的值,即1(注:其實(shí)這里一上來(lái)是2,因?yàn)镈OM掛載時(shí)mounted和update鉤子都會(huì)觸發(fā),會(huì)把值*2)
- 當(dāng)點(diǎn)擊按鈕時(shí),num會(huì)+1,由于num變化了,v-focus這個(gè)指令中的binging.value也發(fā)生了變化,因此會(huì)觸發(fā)自定義指令中的update鉤子,此時(shí)我們對(duì)其做乘以2的操作,并賦值給輸入框
掛載時(shí)
點(diǎn)擊按鈕時(shí)
總結(jié)
以前總害怕自定義指令,覺(jué)得很難,其實(shí)搞懂了發(fā)現(xiàn)很簡(jiǎn)單,只不過(guò)就是一種封裝的思想,在一個(gè)對(duì)象中可以拿到當(dāng)前的DOM元素,并對(duì)其做操作,該對(duì)象中有不同的鉤子供我們使用,就是如此easy~
到此這篇關(guān)于詳解vue如何使用自定義指令的文章就介紹到這了,更多相關(guān)vue自定義指令內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue中解決微信html5原生ios虛擬鍵返回不刷新問(wèn)題
這篇文章主要介紹了vue中解決微信html5原生ios虛擬鍵返回不刷新問(wèn)題,本文給大家分享解決方法,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10Vue-CLI3.x 自動(dòng)部署項(xiàng)目至服務(wù)器的方法步驟
本教程講解的是 Vue-CLI 3.x 腳手架搭建的vue項(xiàng)目, 利用scp2自動(dòng)化部署到靜態(tài)文件服務(wù)器 Nginx,感興趣的可以了解一下2021-11-11vue使用vuedraggable實(shí)現(xiàn)嵌套多層拖拽排序功能
這篇文章主要為大家詳細(xì)介紹了vue使用vuedraggable實(shí)現(xiàn)嵌套多層拖拽排序功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04vue使用數(shù)組splice方法失效,且總刪除最后一項(xiàng)的問(wèn)題及解決
這篇文章主要介紹了vue使用數(shù)組splice方法失效,且總刪除最后一項(xiàng)的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09vue-cli 3.0 自定義vue.config.js文件,多頁(yè)構(gòu)建的方法
今天小編就為大家分享一篇vue-cli 3.0 自定義vue.config.js文件,多頁(yè)構(gòu)建的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09vuejs2.0運(yùn)用原生js實(shí)現(xiàn)簡(jiǎn)單的拖拽元素功能示例
本篇文章主要介紹了vuejs2.0運(yùn)用原生js實(shí)現(xiàn)簡(jiǎn)單的拖拽元素功能示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02webpack 3 + Vue2 使用dotenv配置多環(huán)境的步驟
這篇文章主要介紹了webpack 3 + Vue2 使用dotenv配置多環(huán)境,env文件在配置文件都可以用, vue頁(yè)面用的時(shí)候需要在 webpack.base.conf.js 重新配置,需要的朋友可以參考下2023-11-11