Vue輸入框狀態(tài)切換&自動(dòng)獲取輸入框焦點(diǎn)的實(shí)現(xiàn)方法
場(chǎng)景:
點(diǎn)擊button按鈕展示輸入框,并自動(dòng)獲取對(duì)話框焦點(diǎn),失去焦點(diǎn)時(shí)展示button按鈕
實(shí)現(xiàn):
1.點(diǎn)擊button按鈕展示輸入框,失去焦點(diǎn)時(shí)展示button按鈕
- 在data中定義
visibility,確定輸入框的展示狀態(tài),默認(rèn)為false - 定義
changeVisibility方法,并給button綁定點(diǎn)擊事件@click="changeVisibility",實(shí)現(xiàn)點(diǎn)擊按鈕展示輸入框,給輸入框綁定失去焦點(diǎn)事件@blur="changeVisibility" - 定義
input和button元素,綁定條件渲染指令v-if,當(dāng)visibility為false時(shí)展示按鈕,反之展示輸入框
代碼實(shí)現(xiàn):
<template>
<div>
<label for="input">
<input type="text" ref="inputRef" v-if="visibility" @blur="changeVisibility">
<button @click="changeVisibility" v-else>展示文本框</button>
</label>
</div>
</template>
<script>
export default {
data() {
return {
visibility: false
}
},
methods: {
changeVisibility() {
this.visibility = !this.visibility // 切換 visibility,控制輸入框的顯示狀態(tài)
}
}
}
</script>2.自動(dòng)獲取對(duì)話框焦點(diǎn)
文本框的焦點(diǎn)可以通過.focus()獲取,因此我們可以通過this.$refs.inputRef.focus()獲取到顯示的輸入框的焦點(diǎn)(inputRef是創(chuàng)建文本框時(shí)添加的ref引用)。但是方法定義在組件渲染之前,因此直接在方法中添加會(huì)導(dǎo)致控制臺(tái)報(bào)錯(cuò):Error in v-on handler: "TypeError: Cannot read properties of undefined (reading 'focus')"。這是由于瀏覽器執(zhí)行到this.$refs.inputRef.focus()
時(shí),input元素還沒有被渲染到頁面上,此時(shí)DOM中還不存在指定的input元素。為了避免這種情況,可以使用以下三種方法推遲焦點(diǎn)的獲取
- 設(shè)置定時(shí)器, 推遲焦點(diǎn)的獲取
setTimeout(()=> {
this.$refs.inputRef.focus()
},0)設(shè)置一個(gè)0ms的定時(shí)器,當(dāng)瀏覽器執(zhí)行到定時(shí)器時(shí),會(huì)將定時(shí)器內(nèi)部的函數(shù)放入延遲隊(duì)列中,當(dāng)定時(shí)器的等待事件結(jié)束后,會(huì)將函數(shù)放入消息隊(duì)列的末尾,消息隊(duì)列的執(zhí)行按照先進(jìn)先出原則,當(dāng)前面的任務(wù)執(zhí)行完成后,瀏覽器會(huì)自動(dòng)執(zhí)行this.$refs.inputRef.focus()實(shí)現(xiàn)焦點(diǎn)的獲取
- 使用
$nextTick方法, 將獲取焦點(diǎn)推遲到下一個(gè) DOM 更新周期
this.$nextTick(()=> {
this.$refs.inputRef.focus()
})組件的$nextTick(cb)方法,會(huì)把 cb 回調(diào)推遲到下一個(gè) DOM 更新周期之后執(zhí)行。
通俗的理解是:等組件的 DOM 更新完成之后,再執(zhí)行 cb 回調(diào)函數(shù)。從而能保證 cb 回調(diào)函數(shù)可以操作到最新的 DOM 元素。
將獲取焦點(diǎn)放到updated生命周期中執(zhí)行(不推薦)
使用這個(gè)方法時(shí),需要加上if判斷,否則每一次this.visibility發(fā)生變化時(shí),都會(huì)執(zhí)行一次更新,增加服務(wù)器的負(fù)擔(dān)
updated() {
if (this.visibility){
this.$refs.inputRef.focus()
}
}當(dāng)組件處于updated時(shí),頁面已經(jīng)根據(jù)最新的數(shù)據(jù)渲染完成了,此時(shí)我們執(zhí)行this.$refs.inputRef.focus()就可以正常獲取輸入框的焦點(diǎn)
到此這篇關(guān)于Vue輸入框狀態(tài)切換&自動(dòng)獲取輸入框焦點(diǎn)の實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Vue動(dòng)獲取輸入框焦點(diǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于vue組件的更新機(jī)制?resize()?callResize()
這篇文章主要介紹了關(guān)于vue組件的更新機(jī)制?resize()?callResize(),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04
Vue使用axios(Ajax)+ElementUI實(shí)現(xiàn)登錄實(shí)踐
本文介紹了如何使用Vue和ElementUI框架創(chuàng)建一個(gè)登錄頁面,并實(shí)現(xiàn)前后端交互,同時(shí),還討論了跨域問題的解決方案以及ES6中的箭頭函數(shù)2026-03-03
Vue?element實(shí)現(xiàn)權(quán)限管理業(yè)務(wù)流程詳解
目前本人再使用vue-element-admin項(xiàng)目時(shí)都是通過直接刪除一些用不上的路由來進(jìn)行側(cè)邊欄的清除,但是其實(shí)有一個(gè)更加好的辦法來對(duì)項(xiàng)目的側(cè)邊欄顯示的內(nèi)用進(jìn)行管理,就是權(quán)限管理,其實(shí)也不知道這個(gè)方法好不好,原理上來說時(shí)跟直接刪除該路由的方式時(shí)一樣的2022-08-08
解決vue ui報(bào)錯(cuò)Couldn‘t parse bundle asset“C:
這篇文章主要介紹了解決vue ui報(bào)錯(cuò)Couldn‘t parse bundle asset“C:\Users\Administrator\vue_project1\dist\js\about.js“. Analyzer問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
vue組件屬性(props)及私有數(shù)據(jù)data解析
這篇文章主要介紹了vue組件屬性(props)及私有數(shù)據(jù)data解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
vue--點(diǎn)擊當(dāng)前增加class,其他刪除class的方法
今天小編就為大家分享一篇vue--點(diǎn)擊當(dāng)前增加class,其他刪除class的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-09-09
如何通過Vue自帶服務(wù)器實(shí)現(xiàn)Ajax請(qǐng)求跨域(vue-cli)
從A頁面訪問到B頁面,并且要獲取到B頁面上的數(shù)據(jù),而兩個(gè)頁面所在的端口、協(xié)議和域名中哪怕有一個(gè)不對(duì)等,那么這種行為就叫跨域,這篇文章給大家介紹如何通過Vue自帶服務(wù)器實(shí)現(xiàn)Ajax請(qǐng)求跨域(vue-cli),感興趣的朋友一起看看吧2023-10-10
前端vue+element使用SM4國(guó)密加密解密的詳細(xì)實(shí)例
國(guó)密即國(guó)家密碼局認(rèn)定的國(guó)產(chǎn)密碼算法,主要有SM1,SM2,SM3,SM4,下面這篇文章主要給大家介紹了關(guān)于前端vue+element使用SM4國(guó)密加密解密的相關(guān)資料,需要的朋友可以參考下2023-03-03
解決element?ui?cascader?動(dòng)態(tài)加載回顯問題
這篇文章主要介紹了element?ui?cascader?動(dòng)態(tài)加載回顯問題解決方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08

