Skip to content

Button 按钮

TuiButton 是一个基于 Vue 3 的轻量级按钮组件。它通过 type 属性提供了一套完整的语义化配色方案,并支持 plainroundcircle 等多种外观修饰符。该组件内置了 Loading 状态管理与 Disabled 逻辑,支持自定义 HEX 颜色注入,旨在为开发者提供开箱即用且高度可配置的按钮解决方案。

基础用法

使用 type 属性定义按钮的颜色类型。TechUI 提供了多种预设的语义化颜色。

vue
<template>
  <div class="demo-row">
    <TuiButton>Default</TuiButton>
    <TuiButton type="invert">Invert</TuiButton>
    <TuiButton type="focus">Focus</TuiButton>
    <TuiButton type="info">Info</TuiButton>
    <TuiButton type="primary">Primary</TuiButton>
    <TuiButton type="success">Success</TuiButton>
    <TuiButton type="warning">Warning</TuiButton>
    <TuiButton type="danger">Danger</TuiButton>
    <TuiButton type="emphasis">Emphasis</TuiButton>
  </div>
  <div class="demo-row">
    <TuiButton icon="tui-icon ti-cog">With Icon</TuiButton>
    <TuiButton type="primary" icon="tui-icon ti-star">With Icon</TuiButton>
  </div>
</template>

<style scoped>
.demo-row {
  display: flex;
  gap: 12px;
  margin-bottom: 12px;
  flex-wrap: wrap;
}
</style>

朴素按钮 Plain

使用 plain 属性将按钮设置为朴素样式(背景色透明或变淡,边框显色)。

vue
<template>
  <div class="demo-row">
    <TuiButton plain>Default</TuiButton>
    <TuiButton type="invert" plain>Invert</TuiButton>
    <TuiButton type="focus" plain>Focus</TuiButton>
    <TuiButton type="info" plain>Info</TuiButton>
    <TuiButton type="primary" plain>Primary</TuiButton>
    <TuiButton type="success" plain>Success</TuiButton>
    <TuiButton type="warning" plain>Warning</TuiButton>
    <TuiButton type="danger" plain>Danger</TuiButton>
    <TuiButton type="emphasis" plain>Emphasis</TuiButton>
  </div>
</template>

<style scoped>
.demo-row {
  display: flex;
  gap: 12px;
  flex-wrap: wrap;
}
</style>

圆角按钮 Round

使用 round 属性来定义圆角按钮。

vue
<template>
  <div class="demo-row">
    <TuiButton round>Default</TuiButton>
    <TuiButton type="primary" round>Primary</TuiButton>
    <TuiButton type="success" round>Success</TuiButton>
    <TuiButton type="warning" round>Warning</TuiButton>
    <TuiButton type="danger" round>Danger</TuiButton>
  </div>
  <div class="demo-row">
    <TuiButton type="primary" plain round>Plain Round</TuiButton>
    <TuiButton type="success" plain round>Plain Round</TuiButton>
  </div>
</template>

<style scoped>
.demo-row {
  display: flex;
  gap: 12px;
  margin-bottom: 12px;
  flex-wrap: wrap;
}
</style>

圆形图标 Circle

使用 circle 属性,通常配合 icon 使用,用于显示圆形图标按钮。

vue
<template>
  <div class="demo-row">
    <TuiButton icon="tui-icon ti-star" circle />
    <TuiButton type="primary" icon="tui-icon ti-search" circle />
    <TuiButton type="success" icon="tui-icon ti-check" circle />
    <TuiButton type="warning" icon="tui-icon ti-alert" circle />
    <TuiButton type="danger" icon="tui-icon ti-close" circle />
  </div>
  <div class="demo-row">
    <TuiButton type="primary" icon="tui-icon ti-pencil" circle plain />
    <TuiButton type="danger" icon="tui-icon ti-trash" circle plain />
  </div>
</template>

<style scoped>
.demo-row {
  display: flex;
  gap: 12px;
  margin-bottom: 12px;
  flex-wrap: wrap;
}
</style>
  • link: 表现为链接样式,无背景,Hover 时有下划线或颜色变化。
  • text: 表现为纯文本按钮,无边框。
  • textWithBG: 文字按钮在特定状态下是否保留背景色。
vue
<template>
  <div class="title">Link 模式</div>
  <div class="demo-row">
    <TuiButton link>Default</TuiButton>
    <TuiButton type="primary" link>Primary</TuiButton>
    <TuiButton type="success" link>Success</TuiButton>
    <TuiButton type="warning" link>Warning</TuiButton>
    <TuiButton type="danger" link>Danger</TuiButton>
  </div>

  <div class="title">Text 模式</div>
  <div class="demo-row">
    <TuiButton text>Text Default</TuiButton>
    <TuiButton type="primary" text>Text Primary</TuiButton>
    <TuiButton type="danger" text>Text Danger</TuiButton>
  </div>
  
  <div class="title">Text (Background Always On)</div>
  <div class="demo-row">
    <TuiButton text textWithBG>BG On</TuiButton>
    <TuiButton type="primary" text textWithBG>BG On</TuiButton>
  </div>
</template>

<style scoped>
.title {
  font-size: 14px;
  color: var(--vp-c-text-2);
  margin: 10px 0;
}
.demo-row {
  display: flex;
  gap: 12px;
  margin-bottom: 20px;
  flex-wrap: wrap;
}
</style>

状态 Disabled & Loading

  • disabled: 禁用状态,不可点击。
  • loading: 加载中状态,会自动显示 loading 图标并禁用点击。
vue
<template>
  <div class="demo-row">
    <TuiButton disabled>Disabled</TuiButton>
    <TuiButton type="primary" disabled>Disabled</TuiButton>
    <TuiButton type="primary" plain disabled>Disabled Plain</TuiButton>
    <TuiButton type="primary" link disabled>Disabled Link</TuiButton>
  </div>
  <div class="demo-row">
    <TuiButton loading>Loading</TuiButton>
    <TuiButton type="primary" loading>Submitting</TuiButton>
    <TuiButton type="success" plain loading circle></TuiButton>
  </div>
</template>

<style scoped>
.demo-row {
  display: flex;
  gap: 12px;
  margin-bottom: 12px;
  flex-wrap: wrap;
}
</style>

尺寸 Size

支持 large, default (不填), small 三种尺寸。

vue
<template>
  <div class="demo-row">
    <TuiButton type="primary" size="large">Large</TuiButton>
    <TuiButton type="primary">Default</TuiButton>
    <TuiButton type="primary" size="small">Small</TuiButton>
  </div>
  <div class="demo-row">
    <TuiButton type="primary" round size="large">Large</TuiButton>
    <TuiButton type="primary" round>Default</TuiButton>
    <TuiButton type="primary" round size="small">Small</TuiButton>
  </div>
</template>

<style scoped>
.demo-row {
  display: flex;
  gap: 12px;
  align-items: center;
  margin-bottom: 12px;
}
</style>

自定义颜色

通过 customColor 属性,可以传入 Hex 颜色值来强制覆盖按钮的主色调。

vue
<script setup>
import { $c } from "@techui/colors"; // 假设这是内部颜色库,演示用
const customHex = '#8a2be2'; // BlueViolet
</script>

<template>
  <div class="demo-row">
    <TuiButton :customColor="customHex">Custom Hex</TuiButton>
    
    <TuiButton plain :customColor="customHex">Custom Plain</TuiButton>
    
    <TuiButton round :customColor="customHex">Custom Round</TuiButton>
  </div>
</template>

<style scoped>
.demo-row {
  display: flex;
  gap: 12px;
}
</style>

按钮组

使用 <TuiButtonGroup> 容器将多个按钮组合在一起。

vue
<template>
  <div class="demo-col">
    <TuiButtonGroup>
      <TuiButton type="primary">Prev</TuiButton>
      <TuiButton type="primary">Next</TuiButton>
    </TuiButtonGroup>

    <TuiButtonGroup>
      <TuiButton type="default" icon="tui-icon ti-star">Star</TuiButton>
      <TuiButton type="default" icon="tui-icon ti-share">Share</TuiButton>
      <TuiButton type="default" icon="tui-icon ti-pencil">Edit</TuiButton>
    </TuiButtonGroup>

    <TuiButtonGroup vertical>
      <TuiButton type="primary" icon="tui-icon ti-plus"></TuiButton>
      <TuiButton type="primary" icon="tui-icon ti-minus"></TuiButton>
    </TuiButtonGroup>
  </div>
</template>

<style scoped>
.demo-col {
  display: flex;
  flex-direction: column;
  gap: 12px;
  align-items: flex-start;
}
</style>

API 参考

Props

参数说明类型可选值默认值
type按钮类型 (颜色主题)stringdefault / invert / focus / info / primary / success / warning / danger / emphasisdefault
plain是否为朴素按钮boolean-false
round是否为圆角按钮boolean-false
circle是否为圆形按钮boolean-false
link是否为链接按钮boolean-false
text是否为文字按钮boolean-false
textWithBG文字按钮是否保留背景boolean-false
disabled是否禁用boolean-false
loading是否加载中boolean-false
size尺寸stringlarge / small-
icon图标类名string--
customColor自定义颜色string / Array--
native-type原生 button 类型stringbutton / submit / resetbutton

Slots

插槽名说明
default按钮内容
icon图标插槽 (若不使用 icon 属性)

Events

事件名说明回调参数
click点击按钮时触发(event: Event)