el-select单选时选择后输入框的is-focus状态并没有取消问题解决

 更新时间:2024年01月10日 15:57:31   作者:君子使物,不为物使  
这篇文章主要给大家介绍了关于el-select单选时选择后输入框的is-focus状态并没有取消问题的解决过程,文中通过图文以及代码示例将解决的办法介绍的非常详细,需要的朋友可以参考下

前言

前两天在封装组件的时候,发现el-select 单选时,选择后输入框的is-focus状态并没有取消,需要手动点其它地方才会取消,于是想着找找为什么

一、通过调试源码发现

输入框在点击选项后触发blur,紧接着又触发了一次focus 1.状态样式由计算属性"wrapperKls"控制,又与“isFocused”相关,且handleFocus和isFocused都由useFocusController提供

2.因此找到useFocusController的具体实现,加入console.log就能观察到focus触发情况

查看控制台

二、有devTools也可以观察到,点击选项后isFocused先变成false,又变成true

实际上还是上方useFocusController中的handleFocus改变了其值

三、找一下点击选项后发生了什么

深扒一下,干了4件事

ctx.emit(UPDATE_MODEL_EVENT, option.value)	// ctx.emit('update:modelValue', val) 更新双向绑定的值
emitChange(option.value)	// 值改变的情况下调用 ctx.emit('change', val) 触发el-select的change事件
states.visible = false	// 那么这时又发生了什么呢?
setSoftFocus()	/* 看起来像是这个方法导致的
	const _input = input.value || reference.value
    if (_input) {
      _input?.focus()
    }
*/

四、经过我的排除大法,有两种情况会触发的focus事件

  • 由states.visible改变触发
  • 由setSoftFocus()方法触发

如果想在点击选项后不触发focus,那么就需要同时注释这两行代码才行
在不破坏代码功能的情况下,加入一个方法setSoftBlur和一个prop
用户在单选时如果传入了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任务队列与事件循环,将在下方执行setSoftFocus之后调用setSoftBlur()

五、效果如图

第一个选择框没有

总结

到此这篇关于el-select单选时选择后输入框的is-focus状态并没有取消问题解决的文章就介绍到这了,更多相关el-select单选is-focus状态没有取消内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue实现pc端拍照上传功能

    vue实现pc端拍照上传功能

    这篇文章主要为大家详细介绍了vue实现pc端拍照上传功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 可能是vue中使用axios最详细教程

    可能是vue中使用axios最详细教程

    Axios是一个基于Promise用于浏览器和nodejs的HTTP客户端,本质上也是对原生XHR的封装,只不过它是Promise的实现版本,符合最新的ES规范,下面这篇文章主要给大家介绍了关于vue中使用axios最详细教程的相关资料,需要的朋友可以参考下
    2022-08-08
  • vue请求函数和路由的安装使用过程

    vue请求函数和路由的安装使用过程

    这篇文章主要介绍了vue请求函数和路由的安装使用过程,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-08-08
  • Vue标签属性动态传参并拼接字符串的操作方法

    Vue标签属性动态传参并拼接字符串的操作方法

    这篇文章主要介绍了Vue标签属性动态传参并拼接字符串的操作方法,我们需要根据传入值的类型,在placeholder属性赋值"请输入长度",“请输入宽度”,"请输入厚度"等提示字符,本文通过实例代码介绍的非常详细,需要的朋友参考下吧
    2023-11-11
  • vue使用highcharts自定义图例点击事件

    vue使用highcharts自定义图例点击事件

    这篇文章主要为大家详细介绍了vue使用highcharts自定义图例点击事件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Vue 应用中结合vux使用微信 jssdk的方法

    Vue 应用中结合vux使用微信 jssdk的方法

    今天小编就为大家分享一篇Vue 应用中结合vux使用微信 jssdk的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • 前端JS也可以连点成线详解(Vue中运用AntVG6)

    前端JS也可以连点成线详解(Vue中运用AntVG6)

    这篇文章主要给大家介绍了关于前端JS连点成线(Vue中运用 AntVG6)的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-01-01
  • vue echarts实现航班选座案例分析

    vue echarts实现航班选座案例分析

    这篇文章主要介绍了vue echarts实现航班选座案例分析,代码是使用echarts来实现的,主要用到的是svg和自定义地图的相关知识,需要的朋友可以参考下
    2022-05-05
  • Ant Design的可编辑Tree的实现操作

    Ant Design的可编辑Tree的实现操作

    这篇文章主要介绍了Ant Design的可编辑Tree的实现操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • Vue中图片Src使用变量的方法

    Vue中图片Src使用变量的方法

    这篇文章主要介绍了Vue中图片Src使用变量的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10

最新评论