解决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>
万事大吉,下课!
相关推荐
dy171723 分钟前
element-plus表格默认展开有子的数据
前端·javascript·vue.js
2501_915918414 小时前
Web 前端可视化开发工具对比 低代码平台、可视化搭建工具、前端可视化编辑器与在线可视化开发环境的实战分析
前端·低代码·ios·小程序·uni-app·编辑器·iphone
程序员的世界你不懂5 小时前
【Flask】测试平台开发,新增说明书编写和展示功能 第二十三篇
java·前端·数据库
索迪迈科技5 小时前
网络请求库——Axios库深度解析
前端·网络·vue.js·北京百思可瑞教育·百思可瑞教育
gnip5 小时前
JavaScript二叉树相关概念
前端
attitude.x6 小时前
PyTorch 动态图的灵活性与实用技巧
前端·人工智能·深度学习
β添砖java6 小时前
CSS3核心技术
前端·css·css3
空山新雨(大队长)6 小时前
HTML第八课:HTML4和HTML5的区别
前端·html·html5
猫头虎-前端技术6 小时前
浏览器兼容性问题全解:CSS 前缀、Grid/Flex 布局兼容方案与跨浏览器调试技巧
前端·css·node.js·bootstrap·ecmascript·css3·媒体