Vue輸入框狀態(tài)切換&自動獲取輸入框焦點的實現方法
場景:
點擊button按鈕展示輸入框,并自動獲取對話框焦點,失去焦點時展示button按鈕
實現:
1.點擊button按鈕展示輸入框,失去焦點時展示button按鈕
- 在data中定義
visibility,確定輸入框的展示狀態(tài),默認為false - 定義
changeVisibility方法,并給button綁定點擊事件@click="changeVisibility",實現點擊按鈕展示輸入框,給輸入框綁定失去焦點事件@blur="changeVisibility" - 定義
input和button元素,綁定條件渲染指令v-if,當visibility為false時展示按鈕,反之展示輸入框
代碼實現:
<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.自動獲取對話框焦點
文本框的焦點可以通過.focus()獲取,因此我們可以通過this.$refs.inputRef.focus()獲取到顯示的輸入框的焦點(inputRef是創(chuàng)建文本框時添加的ref引用)。但是方法定義在組件渲染之前,因此直接在方法中添加會導致控制臺報錯:Error in v-on handler: "TypeError: Cannot read properties of undefined (reading 'focus')"。這是由于瀏覽器執(zhí)行到this.$refs.inputRef.focus()
時,input元素還沒有被渲染到頁面上,此時DOM中還不存在指定的input元素。為了避免這種情況,可以使用以下三種方法推遲焦點的獲取
- 設置定時器, 推遲焦點的獲取
setTimeout(()=> {
this.$refs.inputRef.focus()
},0)設置一個0ms的定時器,當瀏覽器執(zhí)行到定時器時,會將定時器內部的函數放入延遲隊列中,當定時器的等待事件結束后,會將函數放入消息隊列的末尾,消息隊列的執(zhí)行按照先進先出原則,當前面的任務執(zhí)行完成后,瀏覽器會自動執(zhí)行this.$refs.inputRef.focus()實現焦點的獲取
- 使用
$nextTick方法, 將獲取焦點推遲到下一個 DOM 更新周期
this.$nextTick(()=> {
this.$refs.inputRef.focus()
})組件的$nextTick(cb)方法,會把 cb 回調推遲到下一個 DOM 更新周期之后執(zhí)行。
通俗的理解是:等組件的 DOM 更新完成之后,再執(zhí)行 cb 回調函數。從而能保證 cb 回調函數可以操作到最新的 DOM 元素。
將獲取焦點放到updated生命周期中執(zhí)行(不推薦)
使用這個方法時,需要加上if判斷,否則每一次this.visibility發(fā)生變化時,都會執(zhí)行一次更新,增加服務器的負擔
updated() {
if (this.visibility){
this.$refs.inputRef.focus()
}
}當組件處于updated時,頁面已經根據最新的數據渲染完成了,此時我們執(zhí)行this.$refs.inputRef.focus()就可以正常獲取輸入框的焦點
到此這篇關于Vue輸入框狀態(tài)切換&自動獲取輸入框焦點の實現的文章就介紹到這了,更多相關Vue動獲取輸入框焦點內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Vue-cli proxyTable 解決開發(fā)環(huán)境的跨域問題詳解
本篇文章主要介紹了Vue-cli proxyTable 解決開發(fā)環(huán)境的跨域問題詳解,非常具有實用價值,需要的朋友可以參考下2017-05-05
基于vue-cli3+typescript的tsx開發(fā)模板搭建過程分享
這篇文章主要介紹了搭建基于vue-cli3+typescript的tsx開發(fā)模板,本文通過實例代碼截圖的形式給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02

