el-select單選時(shí)選擇后輸入框的is-focus狀態(tài)并沒有取消問題解決
前言
前兩天在封裝組件的時(shí)候,發(fā)現(xiàn)el-select 單選時(shí),選擇后輸入框的is-focus狀態(tài)并沒有取消,需要手動(dòng)點(diǎn)其它地方才會(huì)取消,于是想著找找為什么

一、通過調(diào)試源碼發(fā)現(xiàn)
輸入框在點(diǎn)擊選項(xiàng)后觸發(fā)blur,緊接著又觸發(fā)了一次focus 1.狀態(tài)樣式由計(jì)算屬性"wrapperKls"控制,又與“isFocused”相關(guān),且handleFocus和isFocused都由useFocusController提供


2.因此找到useFocusController的具體實(shí)現(xiàn),加入console.log就能觀察到focus觸發(fā)情況

查看控制臺(tái)

二、有devTools也可以觀察到,點(diǎn)擊選項(xiàng)后isFocused先變成false,又變成true
實(shí)際上還是上方useFocusController中的handleFocus改變了其值

三、找一下點(diǎn)擊選項(xiàng)后發(fā)生了什么
深扒一下,干了4件事
ctx.emit(UPDATE_MODEL_EVENT, option.value) // ctx.emit('update:modelValue', val) 更新雙向綁定的值
emitChange(option.value) // 值改變的情況下調(diào)用 ctx.emit('change', val) 觸發(fā)el-select的change事件
states.visible = false // 那么這時(shí)又發(fā)生了什么呢?
setSoftFocus() /* 看起來像是這個(gè)方法導(dǎo)致的
const _input = input.value || reference.value
if (_input) {
_input?.focus()
}
*/

四、經(jīng)過我的排除大法,有兩種情況會(huì)觸發(fā)的focus事件
- 由states.visible改變觸發(fā)
- 由setSoftFocus()方法觸發(fā)
如果想在點(diǎn)擊選項(xiàng)后不觸發(fā)focus,那么就需要同時(shí)注釋這兩行代碼才行
在不破壞代碼功能的情況下,加入一個(gè)方法setSoftBlur和一個(gè)prop
用戶在單選時(shí)如果傳入了autoBlur,那么
const setSoftBlur = () => {
const _input = input.value || reference.value
if (_input) {
_input?.blur()
}
}
/**
* @description when select one item, click option will let input blur
*/
autoBlur: Boolean,

tip:使用setTimeout涉及js任務(wù)隊(duì)列與事件循環(huán),將在下方執(zhí)行setSoftFocus之后調(diào)用setSoftBlur()
五、效果如圖


總結(jié)
到此這篇關(guān)于el-select單選時(shí)選擇后輸入框的is-focus狀態(tài)并沒有取消問題解決的文章就介紹到這了,更多相關(guān)el-select單選is-focus狀態(tài)沒有取消內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
flask和vue前后端分離項(xiàng)目部署的示例代碼
本文主要介紹了flask和vue前后端分離項(xiàng)目部署的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
詳解實(shí)現(xiàn)vue的數(shù)據(jù)響應(yīng)式原理
這篇文章主要介紹了詳解實(shí)現(xiàn)vue的數(shù)據(jù)響應(yīng)式原理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01

