Skip to content

useSelectComputed ​

useSelectComputed:通用下拉选择器交互 Hook ​

痛点来源 ​

下拉选择器(Select、Dropdown 等)是交互频率极高的表单控件,但其核心交互逻辑在多个组件中高度重复:

  • 需要管理下拉面板的显示/隐藏状态
  • 处理焦点状态(focused)以支持样式变化与键盘交互
  • 实现点击外部区域自动关闭(click outside)
  • 禁用状态下阻止所有交互
  • 外部 v-model 变化时需同步内部状态
  • 事件监听需在组件生命周期内正确添加与移除,避免内存泄漏

如果每个 Select 类组件都独立实现这些逻辑,不仅代码冗余,还容易出现:

  • 点击外部关闭失效或误触发
  • 事件监听未正确卸载导致内存泄漏
  • 禁用状态处理不一致
  • 焦点与下拉状态不同步

设计目标 ​

useSelect 的目标是:提供一套轻量、通用、可复用的下拉交互管理方案,将 Select 类组件的显示、焦点、点击外部关闭等核心交互逻辑完全抽象出来,让组件只需关注选项渲染与值选中逻辑。

核心特性 ​

特性说明
响应式下拉状态dropdownVisible 为 ref<boolean>,实时控制面板显示
焦点状态管理isFocused 支持样式(如边框高亮)与键盘导航基础
点击外部自动关闭通过全局 click 事件监听实现,基于选择器 .select-e 判断(可自定义)
禁用状态安全防护所有交互入口(如 toggle)优先检查 disabled,防止误操作
生命周期自动管理onMounted 添加监听,onUnmounted 自动移除,无需手动处理
外部 modelValue 监听预留 watch 位点,便于同步选中标签或其他衍生状态
泛型类型安全支持任意类型 T 的 modelValue,完美适配 string、number、object 等

设计价值 ​

useSelect 将 Select 类组件中最易出错、最重复的交互控制逻辑彻底剥离,使组件实现变得简洁而可靠:

所有 Select、Cascader、TreeSelect 等下拉类组件可共享同一套交互行为,确保体验高度一致 点击外部关闭逻辑集中管理,避免各组件重复实现且易遗漏卸载 焦点与禁用状态统一处理,支持无障碍与视觉反馈 组件模板只需关注“展示”与“选项选择”,交互细节完全交给 Hook 为后续扩展(如键盘导航、搜索过滤)预留清晰空间

基于 MIT 协议