Vue自定義指令v-focus實(shí)例詳解
前言
本文直接參考vue2.0官方文檔, 并演示博主項(xiàng)目中的使用
自定義指令 directive
除了核心功能默認(rèn)內(nèi)置的指令 (v-model 和 v-show),Vue 也允許注冊(cè)自定義指令。注意,在 Vue2.0 中,代碼復(fù)用和抽象的主要形式是組件。然而,有的情況下,你仍然需要對(duì)普通 DOM 元素進(jìn)行底層操作,這時(shí)候就會(huì)用到自定義指令。舉個(gè)聚焦輸入框的例子:
當(dāng)頁(yè)面加載時(shí),該元素將獲得焦點(diǎn) (注意:autofocus 在移動(dòng)版 Safari 上不工作)。事實(shí)上,只要你在打開(kāi)這個(gè)頁(yè)面后還沒(méi)點(diǎn)擊過(guò)任何內(nèi)容,這個(gè)輸入框就應(yīng)當(dāng)還是處于聚焦?fàn)顟B(tài)?,F(xiàn)在讓我們用指令來(lái)實(shí)現(xiàn)這個(gè)功能:
// 注冊(cè)一個(gè)全局自定義指令 `v-focus`
Vue.directive('focus', {
// 當(dāng)被綁定的元素插入到 DOM 中時(shí)……
inserted: function (el) {
// 聚焦元素
el.focus()
}
})
然后你可以在模板中任何元素上使用新的 v-focus property,如下:
<input v-focus>
項(xiàng)目實(shí)際使用
技術(shù)背景
- vue2.0
- nuxt.js
- ElementUI
實(shí)際操作
首先不同于vue-cli腳手架在入口main.js里面定義自定義指令,在nuxt.js中,nuxt.config.js作為項(xiàng)目的入口文件和配置文件,定義自定義指令也是在這里定義
我們直接跳到nuxt.config.js的plugins配置項(xiàng)
plugins:該配置項(xiàng)用于配置那些需要在 根vue.js應(yīng)用 實(shí)例化之前需要運(yùn)行的 Javascript 插件。
拿博主項(xiàng)目例子來(lái)看,在plugins文件夾下新建directive.js文件,引入Vue,定義自定義指令

組件中使用,直接在想要默認(rèn)焦點(diǎn)的地方寫(xiě)入v-focus即可,如下圖:

優(yōu)勢(shì)
一個(gè)字:簡(jiǎn)單 O(∩_∩)O哈哈~
和傳統(tǒng)方式比較:
傳統(tǒng)方法使用ElementUI input提供的focus()來(lái)手動(dòng)觸發(fā),通過(guò)$refs[ref].focus()來(lái)使 input 獲取焦點(diǎn)
然而我們?cè)谑褂玫臅r(shí)候,尤其是將其放在mounted或者created或watch()的immediate: true初始化時(shí),經(jīng)常會(huì)失效,原因就是,組件渲染需要時(shí)間,如果JS處理比渲染的快,就會(huì)造成失效問(wèn)題,如何解決呢?那就是延后處理,常用的主要有兩種方法:
setTimeout(fn, 0) 永遠(yuǎn)的神
這里涉及到JavaScript的EventLoop,簡(jiǎn)單來(lái)講,setTimeout的回調(diào)是異步的,js會(huì)將異步的任務(wù)放在同步任務(wù)后處理。
指定某個(gè)任務(wù)在主線程最早可得的空閑時(shí)間執(zhí)行,也就是說(shuō),盡可能早得執(zhí)行。它在"任務(wù)隊(duì)列"的尾部添加一個(gè)事件,因此要等到同步任務(wù)和"任務(wù)隊(duì)列"現(xiàn)有的事件都處理完,才會(huì)得到執(zhí)行。
所以我們可以將focus()放在settimeout回調(diào)中:
setTimeout(function () {
this.$refs['ref名'].focus()
}, 0)
$nextTick(callback)
在下次 DOM 更新循環(huán)結(jié)束之后執(zhí)行延遲回調(diào)。在修改數(shù)據(jù)之后立即使用這個(gè)方法,獲取更新后的 DOM。
目的也是等待組件渲染結(jié)束后執(zhí)行,用法:
this.$nextTick(function () {
this.$refs['ref名'].focus()
})
小結(jié)
綜上所述,自定義指令v-focus的好處就顯而易見(jiàn)了
- 不必在控件上定義ref
- 不用通過(guò)settimeout和nextTick的方式延遲執(zhí)行
以上就是Vue自定義指令v-focus實(shí)例詳解的詳細(xì)內(nèi)容,更多關(guān)于Vue自定義指令v-focus的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Vue中Class和Style實(shí)現(xiàn)v-bind綁定的幾種用法
項(xiàng)目開(kāi)發(fā)中給元素添加/刪除 class 是非常常見(jiàn)的行為之一, 例如網(wǎng)站導(dǎo)航都會(huì)給選中項(xiàng)添加一個(gè) active 類(lèi)用來(lái)區(qū)別選與未選中的樣式,那么在 vue 中 我們?nèi)绾翁幚磉@類(lèi)的效果呢?下面我們就一起來(lái)了解一下2021-05-05
Vue+Element UI 樹(shù)形控件整合下拉功能菜單(tree + dropdown +input)
這篇文章主要介紹了Vue+Element UI 樹(shù)形控件整合下拉功能菜單(tree + dropdown +input)的方法,幫助大家更好的理解和學(xué)習(xí)vue,感興趣的朋友可以了解下2020-08-08
vue通過(guò)數(shù)據(jù)過(guò)濾實(shí)現(xiàn)表格合并
這篇文章主要為大家詳細(xì)介紹了vue通過(guò)數(shù)據(jù)過(guò)濾實(shí)現(xiàn)表格合并,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
vue中封裝axios并實(shí)現(xiàn)api接口的統(tǒng)一管理
這篇文章主要介紹了vue中封裝axios并實(shí)現(xiàn)api接口的統(tǒng)一管理的方法,幫助大家更好的理解和使用vue,感興趣的朋友可以了解下2020-12-12
Vue實(shí)現(xiàn)星級(jí)評(píng)價(jià)效果
這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)星級(jí)評(píng)價(jià)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
vue文本識(shí)別"\n"換行問(wèn)題的解決方式
在頁(yè)面中經(jīng)常會(huì)遇到自定義文本,如果文本過(guò)長(zhǎng)就需要換行,在HTML中可以通過(guò)標(biāo)簽換行,也可以通過(guò)\n轉(zhuǎn)椅字符換行,下面這篇文章主要給大家介紹了關(guān)于vue文本識(shí)別“\n”換行問(wèn)題的解決方式,需要的朋友可以參考下2022-11-11
vue 項(xiàng)目中使用websocket的正確姿勢(shì)
這篇文章主要介紹了vue 項(xiàng)目中使用websocket的實(shí)例代碼,通過(guò)實(shí)例代碼給大家介紹了在utils下新建websocket.js文件的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01
vue mixins組件復(fù)用的幾種方式(小結(jié))
這篇文章主要介紹了vue mixins組件復(fù)用的幾種方式(小結(jié)),vue中提供了一種混合機(jī)制mixins,用來(lái)更高效的實(shí)現(xiàn)組件內(nèi)容的復(fù)用,有興趣的可以了解一下2017-09-09

