实际情况对应的代码段

<!DOCTYPE html>
<html>
<head>
  <title>test</title>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.12"></script>
  <!-- 引入样式 -->
  <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
  <!-- 引入组件库 -->
  <script src="https://unpkg.com/element-ui/lib/index.js"></script>
</head>
<body>

<div id=app>
  <template>
    <el-select v-model="value" filterable placeholder="请选择">
      <el-option
        v-for="item in options"
        :key="item.value"
        :label="item.label"
        :value="item.value">
      </el-option>
    </el-select>
  </template>
</div>

<script>
  let app = new Vue({
    el: "#app",
    data: {
      options: [{
          value: '选项1',
          label: '黄金糕'
        }, {
          value: '选项2',
          label: '双皮奶'
        }, {
          value: '选项3',
          label: '蚵仔煎'
        }, {
          value: '选项4',
          label: '龙须面'
        }, {
          value: '选项5',
          label: '北京烤鸭'
        }],
        value: ''
    }
  })

</script>

</body>
</html>

在这段HTML中,点击一次select选择框之后会导致select组件获得焦点,并且如果后续在页面中没有其他操作,select组件不会失去焦点,在切屏返回后select组件会由于具有焦点而导致自动展开下拉列表。

这不算是el-select的bug,而是其本身设计就是如此。

解决方法需要用到el-select提供的另一个事件属性:visible-change

ElementUI如是说:

在select组件上监控一下这个事件,并在事件响应中添加相应的获得焦点或失去焦点的操作即可。

 

解决方案

<el-select ref="select" v-model="value" filterable placeholder="请选择"
    @visible-change="visibleChange">
  <el-option
    v-for="item in options"
    :key="item.value"
    :label="item.label"
    :value="item.value">
  </el-option>
</el-select>

在组件上添加ref="select"方便获取组件,以及事件@visible-change="visibleChange"

添加方法:

let app = new Vue({
  el: "#app",
  data: {...
  },
  methods: {
    visibleChange(flag) {
      if (flag) {
        this.$refs.select.focus()
      } else {
        this.$refs.select.blur()
      }
    }
  }
})

 

Logo

前往低代码交流专区

更多推荐