解决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>
万事大吉,下课!
相关推荐
wx_lidysun5 小时前
Nextjs学习笔记
前端·react·next
无羡仙7 小时前
从零构建 Vue 弹窗组件
前端·vue.js
源心锁8 小时前
👋 手搓 gzip 实现的文件分块压缩上传
前端·javascript
源心锁9 小时前
丧心病狂!在浏览器全天候记录用户行为排障
前端·架构
GIS之路9 小时前
GDAL 实现投影转换
前端
烛阴9 小时前
从“无”到“有”:手动实现一个 3D 渲染循环全过程
前端·webgl·three.js
BD_Marathon9 小时前
SpringBoot——辅助功能之切换web服务器
服务器·前端·spring boot
Kagol9 小时前
JavaScript 中的 sort 排序问题
前端·javascript
eason_fan10 小时前
Service Worker 缓存请求:前端性能优化的进阶利器
前端·性能优化
光影少年10 小时前
rn如何和原生进行通信,是单线程还是多线程,通信方式都有哪些
前端·react native·react.js·taro