Skip to content

useColorComputed ​

useColorComputed:颜色与状态样式计算 Hook ​

痛点来源 ​

在 UI 组件(如 Button、Tag、Badge 等)中,颜色与交互状态的样式处理往往是最复杂的重复逻辑之一:

  • 需要支持自定义 colorBg、colorText、colorBorder
  • plain(朴素)模式下,背景、文字、边框需根据类型(如 primary、success)使用主题变量,并处理透明度
  • 不同交互状态(hover、active)需要动态切换颜色
  • 禁用状态下颜色需统一为透明 + 固定文字/边框色
  • 颜色格式可能为变量(如 var(--el-color-primary)),需支持透明度转换(如 rgba(var(...), 0.2))

若每个组件都自行实现这些规则,不仅逻辑冗余,还极易导致视觉不一致、主题切换失效、暗色模式适配困难等问题。

设计目标 ​

useColorComputed 的目标是:集中统一处理所有组件的颜色与状态样式逻辑,提供一套响应式、可配置、与主题系统深度集成的内联样式计算方案,让组件只需传入少数颜色相关 props,即可获得完整的视觉状态表现。

核心特性 ​

特性说明
响应式样式输出返回 ComputedRef<CSSProperties>,支持 Ref 类型的 isHovered/isActive 实时响应
完整状态覆盖优先处理 disabled → plain → 自定义颜色 → 基础 fallback,逻辑清晰不冲突
plain 模式智能处理区分 default 类型与有色类型(如 primary),自动使用主题变量并处理 hover/active 切换与透明度
主题变量深度支持通过 useColorUtils.toRGBA 实现 var(--xxx) 的透明度转换,确保与 CSS 变量系统无缝协作
自定义颜色优先当传入 colorBg、colorText、colorBorder 时,直接覆盖主题逻辑,支持完全自由定制
禁用状态统一固定为透明背景 + 白色文字/边框,视觉一致性强
类型安全通过 ColorComputedProps 接口明确约束 props,支持 TypeScript 完整推导

设计价值 ​

useColorComputed 是组件库中视觉统一性的关键一环,它与 useClassComputed、useStyleComputed 共同构成完整的表现层解决方案:

useClassComputed → 负责结构化类名(BEM) useStyleComputed → 负责尺寸、布局等通用内联样式 useColorComputed → 专注颜色与状态(plain、hover、active、disabled)

通过这一 Hook:

所有组件的颜色行为高度一致,无需重复编写复杂条件 与主题系统(CSS 变量)深度绑定,切换主题时自动生效 支持自定义颜色与 plain 模式,兼顾灵活性与规范性 状态切换平滑响应式,交互体验统一

基于 MIT 协议