第4节:el-select 弹窗事件控制(打开 / 关闭、选中事件、弹窗滚动事件)

第4节:el-select 弹窗事件控制(打开 / 关闭、选中事件、弹窗滚动事件)

本节重点:监听下拉弹窗的显示隐藏,区分「选中值变化」和「弹窗打开关闭」,弹窗相关事件,还有弹窗关闭阻止场景。

核心事件清单(el-select)

  1. visible-change:弹窗打开 / 关闭触发 ,参数 (boolean),true = 弹窗打开,false = 弹窗关闭
  2. change:选中的值发生变化才触发,弹窗打开关闭不会触发这个事件(很多新手混淆这点)
  3. blur:选择框失去焦点
  4. focus:选择框获得焦点

补充:el-select 没有直接的 popper-open,visible-change 就是用来监听下拉弹窗的。

完整可测试代码

复制代码
<template>
  <div class="container">
    <el-select
      v-model="selectVal"
      placeholder="请选择,看控制台打印事件"
      @visible-change="handleVisibleChange"
      @change="handleChange"
    >
      <el-option label="Vue" value="vue" />
      <el-option label="React" value="react" />
      <el-option label="Angular" value="angular" />
    </el-select>

    <div style="margin-top:20px">
      <p>弹窗状态:{{ popVisible ? '已打开' : '已关闭' }}</p>
      <p>当前选中值:{{ selectVal }}</p>
    </div>
  </div>
</template>

<script setup>
import { ref } from 'vue'
const selectVal = ref('')
const popVisible = ref(false)

// 弹窗打开/关闭事件
const handleVisibleChange = (flag) => {
  popVisible.value = flag
  console.log('visible-change 弹窗状态:', flag)
}

// 选中值变更事件
const handleChange = (val) => {
  console.log('change 选中新值:', val)
}
</script>

<style scoped>
.container {
  padding: 20px;
}
</style>

测试步骤

  1. 打开浏览器控制台(F12)
  2. 点击下拉框展开弹窗:触发 visible-change(true),change 不会触发
  3. 点击选项选中:先关闭弹窗 visible-change(false),然后触发 change
  4. 点击空白处关闭弹窗:只触发 visible-change(false),change 不触发
  5. 再次点开下拉:visible-change(true)

业务常见场景

  • 需要弹窗打开时远程请求加载选项数据 :写在 handleVisibleChange,判断 flag === true 请求

⚠️ 坑点:每次打开都会触发,注意加锁防止重复请求(比如加 loading 标记)

相关推荐
ruanno_top11 小时前
轮播每 3 秒自己翻页:键盘停不下来,读屏也不知道换了页
vue.js
1-1=012 小时前
Vue 3 模板语
前端·javascript·vue.js
Java小卷13 小时前
面向 Schema 编程,Vue 3 页面级渲染引擎!轻松玩转各场景 Validation!
vue.js·低代码
FungLeo16 小时前
成为全栈·Vue 管理后台篇·用 fetch 建一层可控的请求内核
前端·javascript·vue.js·http·fetch·formdata·接口封装
FungLeo18 小时前
成为全栈·Vue 管理后台篇·Vue Router如何守住多角色后台边界
前端·javascript·vue.js·rbac·vue router·路由守卫·前端权限
FungLeo18 小时前
成为全栈·Vue 管理后台篇·分页只显示第一页:从接口total 定位到前端修复
前端·vue.js·状态模式·分页·naive ui·服务端分页·前端问题排查
FungLeo19 小时前
成为全栈·Vue管理后台篇·仪表盘不是几张卡片:组合统计接口与角色视图
前端·javascript·vue.js·rbac·仪表盘·管理后台·tanstack query
ruanno_top19 小时前
可搜索的下拉框,键盘按不动:焦点进了下拉,事件还挂在触发器上
vue.js
FungLeo20 小时前
成为全栈·Vue 管理后台篇·Vue Query:服务端数据缓存、query key与变更失效
vue.js·数据获取·前端缓存·前端状态管理·tanstack query·vue query
北城笑笑20 小时前
Vue 109 ,从零搭建 Vue3 + Electron 工程:生态、安全桥接与打包选型( Vue + Electron )
前端·javascript·vue.js·安全·electron·vue