解决element下拉框组件的filterable属性带来的选择完成后切屏再切回页面,下拉框会自动展开的BUG

背景

我们负责的测试,突然在某一天发现了,使用element的下拉框组件el-select( el-select-v2 同样)的时候,如果支持搜索选项时,当选择完选项,这个时候切换了浏览器的页面,然后再回到系统的时候,会发生很神奇的现象,下拉框居然自动展开了😮。这可不能忍,怎么解决呢?

BUG如图所示,选择完再切换标签页回来会自动展开

插件版本

js 复制代码
"element-ui": "2.15.13"
"el-select-v2": "^1.4.5"

解决方案

修改main.js文件

js 复制代码
//main.js文件
// el-select 和 el-select-v2 组件下拉框关闭时触发失焦操作:解决filterable属性带来的选择完成后切屏再切回页面,下拉框会自动展开的BUG
Vue.directive('select-blur', {
  bind(el, binding, vnode) {
    const selectComponent = vnode.componentInstance;
    // 定义解绑函数
    let unbindFunction = null;
    // 处理 el-select 组件
    if (selectComponent.$options.name === 'ElSelect') {
      const unwatch = selectComponent.$watch('visible', (newVal) => {
        if (!newVal) {
          selectComponent.blur();
        }
      });
      unbindFunction = () => {
        unwatch(); // 解绑 watcher
      };
    }
    // 处理 el-select-v2 组件
    else if (selectComponent.$options.name === 'ElSelectV2') {
      const handleVisibilityChange = (visible) => {
        if (!visible) {
          selectComponent.blur();
        }
      };
      // 尝试绑定到 el-select-v2 的内部事件
      if (selectComponent.$refs.select) {
        selectComponent.$refs.select.$on('visible-change', handleVisibilityChange);
      } else {
        vnode.context.$nextTick(() => {
          if (selectComponent.$refs.select) {
            selectComponent.$refs.select.$on('visible-change', handleVisibilityChange);
          }
        });
      }
      unbindFunction = () => {
        if (selectComponent.$refs.select) {
          selectComponent.$refs.select.$off('visible-change', handleVisibilityChange);
        }
      };
    }
    // 将解绑函数存储在 vnode 上
    vnode.__unbindSelectBlur = unbindFunction;
  },
  unbind(el, binding, vnode) {
    const unbindFunction = vnode.__unbindSelectBlur;
    if (unbindFunction) {
      unbindFunction(); // 调用解绑函数
      vnode.__unbindSelectBlur = null; // 清除存储的解绑函数
    }
  }
});

使用方法

js 复制代码
<el-select v-select-blur filterable></el-select>
<ElSelectV2 v-select-blur filterable></ElSelectV2>
万事大吉,下课!
相关推荐
卷福同学1 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端
赵庆明老师2 小时前
Vben精讲:21-详解web-antd:tsconfig.json
前端·json·vim
wc882 小时前
微软EDGE浏览器功能学习
前端·学习·edge
Csvn2 小时前
🎯 原生 `<dialog>` 元素:终于可以扔掉一半的自定义弹窗组件了?
前端
Csvn2 小时前
🎨 CSS @layer:用「层叠优先级」终结样式打架的世纪难题
前端
濮水大叔3 小时前
不必把 Vue3 写成“麻花”:从状态碎片到对象协作,重新理解 Zova 的前端心智模型
前端·typescript·vue3·ioc·tsx·zova
Vuji4 小时前
MCP: 一条 tool 调用链路的旅程
前端·人工智能
万少4 小时前
DeepSeek-V4-Flash 正式版上线了,但这 3 个坑我帮你提前踩了
前端·javascript·后端
明月_清风5 小时前
🚀 Palantir Foundry 本体论实战:当 Ontology 从"知识图谱"进化为"企业操作系统"
前端·后端
驳是5 小时前
入坑 Nginx,看这一篇就够了
前端