Skip to content
API 风格:

Button 按钮 ​

按钮组件,支持多种类型、尺寸、状态及国风主题色。

基础用法 ​

基础用法
vue
<script setup lang="ts">
</script>

<template>
  <!-- 默认 -->
  <LhButton>默认按钮</LhButton>
  <!-- primary -->
  <LhButton type="primary">主要按钮</LhButton>
  <!-- success -->
  <LhButton type="success">成功按钮</LhButton>
  <!-- warning -->
  <LhButton type="warning">警告按钮</LhButton>
  <!-- danger -->
  <LhButton type="danger">危险按钮</LhButton>
  <!-- info -->
  <LhButton type="info">信息按钮</LhButton>
</template>
vue
<script>
export default {}
</script>

<template>
  <!-- 默认 -->
  <LhButton>默认按钮</LhButton>
  <!-- primary -->
  <LhButton type="primary">主要按钮</LhButton>
  <!-- success -->
  <LhButton type="success">成功按钮</LhButton>
  <!-- warning -->
  <LhButton type="warning">警告按钮</LhButton>
  <!-- danger -->
  <LhButton type="danger">危险按钮</LhButton>
  <!-- info -->
  <LhButton type="info">信息按钮</LhButton>
</template>

不同尺寸 ​

不同尺寸
vue
<script setup lang="ts">
</script>

<template>
  <LhButton size="large">大型按钮</LhButton>
  <LhButton>默认按钮</LhButton>
  <LhButton size="small">小型按钮</LhButton>
  <LhButton size="mini">迷你按钮</LhButton>
</template>
vue
<script>
export default {}
</script>

<template>
  <LhButton size="large">大型按钮</LhButton>
  <LhButton>默认按钮</LhButton>
  <LhButton size="small">小型按钮</LhButton>
  <LhButton size="mini">迷你按钮</LhButton>
</template>

朴素按钮 ​

朴素按钮
vue
<script setup lang="ts">
</script>

<template>
  <LhButton plain>朴素按钮</LhButton>
  <LhButton type="primary" plain>主要按钮</LhButton>
  <LhButton type="success" plain>成功按钮</LhButton>
</template>
vue
<script>
export default {}
</script>

<template>
  <LhButton plain>朴素按钮</LhButton>
  <LhButton type="primary" plain>主要按钮</LhButton>
  <LhButton type="success" plain>成功按钮</LhButton>
</template>

圆形按钮 ​

圆形按钮
vue
<script setup lang="ts">
</script>

<template>
  <LhButton circle>圆</LhButton>
  <LhButton type="primary" circle>主</LhButton>
  <LhButton type="success" circle>成</LhButton>
</template>
vue
<script>
export default {}
</script>

<template>
  <LhButton circle>圆</LhButton>
  <LhButton type="primary" circle>主</LhButton>
  <LhButton type="success" circle>成</LhButton>
</template>

加载状态 ​

加载状态
vue
<script setup lang="ts">
import { ref } from 'vue'

const loading1 = ref(false)
</script>

<template>
  <!-- 点击加载 -->
  <LhButton :loading="loading1" @click="loading1 = true">点击加载</LhButton>
  <!-- 加载中 -->
  <LhButton type="primary" loading>加载中</LhButton>
</template>
vue
<script>
export default {
  data() {
    return { loading1: false }
  },
}
</script>

<template>
  <!-- 点击加载 -->
  <LhButton :loading="loading1" @click="loading1 = true">点击加载</LhButton>
  <!-- 加载中 -->
  <LhButton type="primary" loading>加载中</LhButton>
</template>

禁用状态 ​

禁用状态
vue
<script setup lang="ts">
</script>

<template>
  <LhButton disabled>禁用按钮</LhButton>
  <LhButton type="primary" disabled>主要按钮</LhButton>
</template>
vue
<script>
export default {}
</script>

<template>
  <LhButton disabled>禁用按钮</LhButton>
  <LhButton type="primary" disabled>主要按钮</LhButton>
</template>

Block 按钮 ​

Block 按钮
vue
<script setup lang="ts">
</script>

<template>
  <!-- 块级按钮 -->
  <LhButton block>块级按钮</LhButton>
  <!-- 主要块级 -->
  <LhButton type="primary" block>主要块级</LhButton>
</template>
vue
<script>
export default {}
</script>

<template>
  <!-- 块级按钮 -->
  <LhButton block>块级按钮</LhButton>
  <!-- 主要块级 -->
  <LhButton type="primary" block>主要块级</LhButton>
</template>

圆角按钮 ​

round 提供大圆角胶囊外形(与整圆的 circle 不同)。

圆角按钮
vue
<script setup lang="ts">
</script>

<template>
  <LhButton round>圆角按钮</LhButton>
  <LhButton type="primary" round>圆角主要</LhButton>
</template>
vue
<script>
export default {}
</script>

<template>
  <LhButton round>圆角按钮</LhButton>
  <LhButton type="primary" round>圆角主要</LhButton>
</template>

图标按钮 ​

icon 接受图标名,也可用 #icon 插槽自定义渲染。

图标按钮
vue
<script setup lang="ts">
</script>

<template>
  <!-- 搜索 -->
  <LhButton icon="search">搜索</LhButton>
  <!-- 收藏 -->
  <LhButton type="primary" icon="star">收藏</LhButton>
  <!-- 自定义图标插槽 -->
  <LhButton circle>
    <template #icon>🔍</template>
  </LhButton>
</template>
vue
<script>
export default {}
</script>

<template>
  <!-- 搜索 -->
  <LhButton icon="search">搜索</LhButton>
  <!-- 收藏 -->
  <LhButton type="primary" icon="star">收藏</LhButton>
  <!-- 自定义图标插槽 -->
  <LhButton circle>
    <template #icon>🔍</template>
  </LhButton>
</template>

链接按钮 ​

设置 href 后渲染为 <a> 标签,target 控制打开方式;未设置 href 时 native-type 决定原生 button 类型。

链接按钮
GitHub
vue
<script setup lang="ts">
</script>

<template>
  <LhButton href="https://github.com/lhgb-top/lh-ui-plus" target="_blank">GitHub</LhButton>
  <LhButton native-type="submit" type="primary">提交</LhButton>
</template>
vue
<script>
export default {}
</script>

<template>
  <LhButton href="https://github.com/lhgb-top/lh-ui-plus" target="_blank">GitHub</LhButton>
  <LhButton native-type="submit" type="primary">提交</LhButton>
</template>

sx 快速布局 ​

通过 sx 属性快速设置间距与尺寸,无需编写额外 CSS。

sx 间距布局
vue
<script setup lang="ts">
</script>

<template>
  <LhButton type="primary" :sx="{ mt: 2, mx: 1 }">上方间距 2,水平间距 1</LhButton>
</template>
vue
<script>
export default {}
</script>

<template>
  <LhButton type="primary" :sx="{ mt: 2, mx: 1 }">上方间距 2,水平间距 1</LhButton>
</template>

sx 基于 8px 基准:mt: 2 → marginTop: 16px,mx: 1 → marginLeft: 8px; marginRight: 8px。完整属性请参考 sx 快速布局。

自定义主题 ​

为按钮应用自定义的主题色,通过 LhConfigProvider 的 themeVars 属性覆盖 CSS 变量。

青花瓷主题
vue
<script setup lang="ts">
import { LhConfigProvider, LhButton } from '@lh-ui/vue3'

const cerblueTheme = {
  'primary-color': '#2B4C7C',
  'primary-color-hover': '#3D649E',
  'primary-color-bg': '#E8EDF3',
  'bg-color': '#F0F4F8',
}
</script>

<template>
  <LhConfigProvider :theme-vars="cerblueTheme">
    <!-- 青花瓷按钮 -->
    <LhButton type="primary">青花瓷按钮</LhButton>
    <!-- 成功 -->
    <LhButton type="success">成功</LhButton>
  </LhConfigProvider>
</template>
vue
<script>
import { LhConfigProvider, LhButton } from '@lh-ui/vue3'

export default {
  components: { LhConfigProvider, LhButton },
  data() {
    return {
      cerblueTheme: {
        'primary-color': '#2B4C7C',
        'primary-color-hover': '#3D649E',
        'primary-color-bg': '#E8EDF3',
        'bg-color': '#F0F4F8',
      },
    }
  },
}
</script>

<template>
  <LhConfigProvider :theme-vars="cerblueTheme">
    <!-- 青花瓷按钮 -->
    <LhButton type="primary">青花瓷按钮</LhButton>
    <!-- 成功 -->
    <LhButton type="success">成功</LhButton>
  </LhConfigProvider>
</template>

更多主题请参考 主题定制。

国际化 ​

按钮文字可以通过 LhConfigProvider 配合语言包实现国际化切换。

国际化
vue
<script setup lang="ts">
import { ref, computed } from 'vue'
import { LhConfigProvider, LhButton, zhCN, enUS } from '@lh-ui/vue3'

const locale = ref('zh-CN')
const messages = computed(() => locale.value === 'zh-CN' ? zhCN : enUS)
</script>

<template>
  <LhConfigProvider :locale="messages">
    <LhButton @click="locale = locale === 'zh-CN' ? 'en-US' : 'zh-CN'">
      {{ locale === 'zh-CN' ? '切换至英文' : 'Switch to Chinese' }}
    </LhButton>
  </LhConfigProvider>
</template>
vue
<script>
import { LhConfigProvider, LhButton, zhCN, enUS } from '@lh-ui/vue3'

export default {
  components: { LhConfigProvider, LhButton },
  data() {
    return { locale: 'zh-CN' }
  },
  computed: {
    messages() {
      return this.locale === 'zh-CN' ? zhCN : enUS
    },
  },
}
</script>

<template>
  <LhConfigProvider :locale="messages">
    <LhButton @click="locale = locale === 'zh-CN' ? 'en-US' : 'zh-CN'">
      {{ locale === 'zh-CN' ? '切换至英文' : 'Switch to Chinese' }}
    </LhButton>
  </LhConfigProvider>
</template>

Button API ​

Props ​

属性名说明类型默认值
type按钮类型"success" | "warning" | "error" | "info" | "danger" | "default" | "primary"LH_BUTTON_TYPE_CONST.default
size按钮尺寸,未传时从 ConfigProvider 继承"small" | "medium" | "large" | "mini" | "x-large"—
loading加载状态booleanfalse
disabled禁用状态booleanfalse
plain是否为朴素按钮booleanfalse
block是否块级booleanfalse
round是否为圆角按钮booleanfalse
circle是否为圆形按钮booleanfalse
icon图标名称(内置 LhIcon 图标,如 search;需自定义渲染时用 icon 插槽覆盖)LhIconName—
nativeType原生 button 类型(仅未传 href 时生效)"button" | "submit" | "reset"'button'
href链接地址(传入后渲染为 <a> 而非 <button>)string''
target链接打开方式string'_self'
themeVars组件级主题变量,覆盖 ConfigProvider 配置{ [x: string]: string; }—
bgPattern组件级背景花纹,覆盖 ConfigProvider 配置string—
sxsx 快速布局属性LhSxProps—

Events ​

事件名说明回调参数
click点击事件(event: MouseEvent)

Slots ​

插槽名说明
default按钮内容
icon自定义图标渲染(覆盖 icon 属性的默认 LhIcon)

无障碍 ​

  • 键盘焦点环:根元素统一提供 :focus-visible 焦点环(键盘导航时显示,鼠标点击不显示),用 --lh-primary-color 主题变量着色,明暗模式自动跟随,无需额外配置
  • 图标按钮命名:按钮只有图标没有文字时(如圆形图标按钮),屏幕阅读器无法获知用途,必须传 aria-label,该属性会自动透传到根元素。icon prop 直接传内置图标名(如 icon="search");需要图标以外的自定义渲染时用 icon 插槽:
    vue
    <LhButton circle aria-label="搜索">
      <template #icon>
        <LhIcon name="search" />
      </template>
    </LhButton>
  • 动效降级:加载动画尊重系统 prefers-reduced-motion 设置(减弱动态效果时停用旋转)

类型定义 ​

本组件对外导出的 TypeScript 类型结构如下(自动提取自 packages/components/button/src/types.ts 与 @lh-ui/share/core/* 源码,点击各条目展开查看完整定义;属性说明见上方 Props 表):

LhButtonProps
ts
export interface LhButtonProps {
  type?: LhButtonType
  /** 尺寸,可选。若不传则从 ConfigProvider 继承 */
  size?: LhButtonSize
  loading?: boolean
  disabled?: boolean
  plain?: boolean
  block?: boolean
  round?: boolean
  circle?: boolean
  /** 图标名称(内置 LhIcon 图标,如 `search`;需自定义渲染时用 `icon` 插槽覆盖) */
  icon?: LhIconName
  nativeType?: 'button' | 'submit' | 'reset'
  href?: string
  target?: string
  /** 组件级主题变量,覆盖 ConfigProvider 的全局 themeVars 和 componentTheme */
  themeVars?: Record<string, string>
  /** 组件级背景花纹,覆盖 ConfigProvider 配置(不受 patternComponents 白名单限制) */
  bgPattern?: string
  /** sx 快速布局属性 */
  sx?: LhSxProps
}
LhButtonType
ts
export type LhButtonType = (typeof LH_BUTTON_TYPE_CONST)[keyof typeof LH_BUTTON_TYPE_CONST]
LhButtonSize
ts
export type LhButtonSize = (typeof LH_BUTTON_SIZE_CONST)[keyof typeof LH_BUTTON_SIZE_CONST]
LhIconName (来自 @lh-ui/share/core/icon (svgs.ts))
ts
export type LhIconName = keyof typeof LH_ICON_SVGS_CONST