Vue輸入框狀態(tài)切換&自動獲取輸入框焦點(diǎn)的實(shí)現(xiàn)方法
場景:
點(diǎn)擊button
按鈕展示輸入框,并自動獲取對話框焦點(diǎn),失去焦點(diǎn)時展示button
按鈕
實(shí)現(xiàn):
1.點(diǎn)擊button
按鈕展示輸入框,失去焦點(diǎn)時展示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í)現(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.自動獲取對話框焦點(diǎn)
文本框的焦點(diǎn)可以通過.focus()
獲取,因此我們可以通過this.$refs.inputRef.focus()
獲取到顯示的輸入框的焦點(diǎn)(inputRef
是創(chuàng)建文本框時添加的ref
引用)。但是方法定義在組件渲染之前,因此直接在方法中添加會導(dǎo)致控制臺報錯:Error in v-on handler: "TypeError: Cannot read properties of undefined (reading 'focus')"
。這是由于瀏覽器執(zhí)行到this.$refs.inputRef.focus()
時,input
元素還沒有被渲染到頁面上,此時DOM中還不存在指定的input
元素。為了避免這種情況,可以使用以下三種方法推遲焦點(diǎn)的獲取
- 設(shè)置定時器, 推遲焦點(diǎn)的獲取
setTimeout(()=> { this.$refs.inputRef.focus() },0)
設(shè)置一個0ms的定時器,當(dāng)瀏覽器執(zhí)行到定時器時,會將定時器內(nèi)部的函數(shù)放入延遲隊(duì)列中,當(dāng)定時器的等待事件結(jié)束后,會將函數(shù)放入消息隊(duì)列的末尾,消息隊(duì)列的執(zhí)行按照先進(jìn)先出原則,當(dāng)前面的任務(wù)執(zhí)行完成后,瀏覽器會自動執(zhí)行this.$refs.inputRef.focus()
實(shí)現(xiàn)焦點(diǎn)的獲取
- 使用
$nextTick
方法, 將獲取焦點(diǎn)推遲到下一個 DOM 更新周期
this.$nextTick(()=> { this.$refs.inputRef.focus() })
組件的$nextTick(cb)
方法,會把 cb 回調(diào)推遲到下一個 DOM 更新周期之后執(zhí)行。
通俗的理解是:等組件的 DOM 更新完成之后,再執(zhí)行 cb 回調(diào)函數(shù)。從而能保證 cb 回調(diào)函數(shù)可以操作到最新的 DOM 元素。
將獲取焦點(diǎn)放到updated
生命周期中執(zhí)行(不推薦)
使用這個方法時,需要加上if
判斷,否則每一次this.visibility
發(fā)生變化時,都會執(zhí)行一次更新,增加服務(wù)器的負(fù)擔(dān)
updated() { if (this.visibility){ this.$refs.inputRef.focus() } }
當(dāng)組件處于updated
時,頁面已經(jīng)根據(jù)最新的數(shù)據(jù)渲染完成了,此時我們執(zhí)行this.$refs.inputRef.focus()
就可以正常獲取輸入框的焦點(diǎn)
到此這篇關(guān)于Vue輸入框狀態(tài)切換&自動獲取輸入框焦點(diǎn)の實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Vue動獲取輸入框焦點(diǎn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Element實(shí)現(xiàn)表格表頭添加搜索圖標(biāo)和功能
這篇文章主要介紹了使用Element實(shí)現(xiàn)表格表頭添加搜索圖標(biāo)和功能,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07Elementui按鈕設(shè)置默認(rèn)選中狀態(tài)的實(shí)現(xiàn)過程
這篇文章主要給大家介紹了關(guān)于Elementui按鈕設(shè)置默認(rèn)選中狀態(tài)的實(shí)現(xiàn)過程,文中通過圖文以及示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Elementui具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2023-07-07Vue-cli proxyTable 解決開發(fā)環(huán)境的跨域問題詳解
本篇文章主要介紹了Vue-cli proxyTable 解決開發(fā)環(huán)境的跨域問題詳解,非常具有實(shí)用價值,需要的朋友可以參考下2017-05-05vue實(shí)現(xiàn)父子組件雙向綁定的方法總結(jié)
Vue.js 是一種流行的 JavaScript 框架,它提供了一種簡單且高效的方式來構(gòu)建用戶界面,在 Vue 中,父子組件之間的雙向綁定是一種常見的需求,下面我們就來學(xué)習(xí)一下vue中父子組件雙向綁定的常用方法吧2023-10-10vue 1.x 交互實(shí)現(xiàn)仿百度下拉列表示例
本篇文章主要介紹了vue 1.x 交互實(shí)現(xiàn)仿百度下拉列表示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10Vue3使用hooks解決字典數(shù)據(jù)的顯示問題
我們在使用 element-plus的時候,經(jīng)常會使用一些字典數(shù)據(jù), 在搜索框的時候,字典數(shù)數(shù)要使用 el-select el-option 來顯示,但是經(jīng)常會遇到字典數(shù)據(jù)的顯示問題,所以本文給大家介紹了Vue3使用hooks解決字典數(shù)據(jù)的顯示問題,需要的朋友可以參考下2024-12-12基于vue-cli3+typescript的tsx開發(fā)模板搭建過程分享
這篇文章主要介紹了搭建基于vue-cli3+typescript的tsx開發(fā)模板,本文通過實(shí)例代碼截圖的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02