Skip to content

Button 按钮

新粗野主义风格的按钮组件,支持 9 种变体、4 种尺寸 + icon 模式、加载状态和 asChild 组合支持。

预览

Preview

变体

尺寸

状态

提交按钮

安装

pnpm dlx brutx-vue@latest add button

用法

vue
<script setup>
import { Button } from 'brutx-ui-vue'
</script>

<template>
    <Button variant="primary" size="default">
        Click me
    </Button>
</template>

加载状态

vue
<script setup>
import { ref } from 'vue'
import { Button } from 'brutx-ui-vue'

const isLoading = ref(false)

async function handleSubmit() {
    isLoading.value = true
    await new Promise(resolve => setTimeout(resolve, 2000))
    isLoading.value = false
}
</script>

<template>
    <Button variant="primary" :loading="isLoading" @click="handleSubmit">
        Save Changes
    </Button>
</template>

禁用状态

vue
<script setup>
import { Button } from 'brutx-ui-vue'
</script>

<template>
    <Button variant="primary" disabled>
        Disabled
    </Button>
</template>

提交按钮与等待文本

通过 type="submit" 将按钮渲染为表单提交按钮。配合 loadingpendingText 可在提交期间显示等待文本(替换插槽内容),未传入 pendingText 时回退到 i18n 默认值(submitButton.submitting):

vue
<script setup>
import { ref } from 'vue'
import { Button } from 'brutx-ui-vue'

const isLoading = ref(false)

async function handleSubmit() {
    isLoading.value = true
    await new Promise(resolve => setTimeout(resolve, 2000))
    isLoading.value = false
}
</script>

<template>
    <form @submit.prevent="handleSubmit">
        <Button type="submit" variant="primary" :loading="isLoading" pending-text="保存中...">
            保存
        </Button>
    </form>
</template>

仅当 type="submit"loading=true 时才会显示等待文本并隐藏插槽内容;其他情况下插槽内容照常渲染,加载图标仍然显示。

asChild

使用 asChild 将按钮样式渲染到自定义元素上(例如路由链接):

vue
<script setup>
import { Button } from 'brutx-ui-vue'
import { RouterLink } from 'vue-router'
</script>

<template>
    <Button as-child>
        <RouterLink to="/about">About</RouterLink>
    </Button>
</template>

故障效果

Button 内置 effect="glitch",可直接启用故障撕裂动画。

vue
<template>
    <Button
        effect="glitch"
        variant="primary"
        glitch-trigger="click"
        glitch-speed="fast"
        glitch-direction="both"
        data-text="GLITCH"
    >
        GLITCH
    </Button>
</template>

变体

变体说明
default背景色,硬阴影
primaryPrimary(珊瑚色)背景
secondarySecondary(薄荷青)背景
accentAccent(黄色)背景
dangerDestructive(红色)背景,白色文字
successSuccess(绿色)背景
outline透明背景,悬停时反转
ghost无边框和阴影,柔和悬停效果
link无边框和阴影,悬停时显示下划线
vue
<template>
    <Button variant="primary">Primary 变体</Button>
</template>

尺寸

尺寸高度内边距字体大小
smh-9px-3 py-1text-sm
defaulth-11px-5 py-2text-base
lgh-14px-8 py-3text-lg
xlh-16px-10 py-4text-xl
iconh-11 w-11p-0

Props

属性类型默认值说明
variant'default' | 'primary' | 'secondary' | 'accent' | 'danger' | 'success' | 'outline' | 'ghost' | 'link''default'按钮变体样式
size'sm' | 'default' | 'lg' | 'xl' | 'icon''default'按钮尺寸,icon 为正方形图标按钮
asChildbooleanfalse将按钮样式渲染到子元素上,用于组合路由链接等
type'button' | 'submit' | 'reset'undefined原生 button 类型;为 submit 时启用 pendingText 行为
loadingbooleanfalse显示加载动画并禁用按钮
disabledbooleanfalse禁用按钮
pendingTextstringundefined(回退到 i18n submitButton.submitting加载中显示的等待文本,仅在 type="submit"loading 时生效
effect'none' | 'glitch''none'可选视觉效果
glitchTrigger'hover' | 'click' | 'autoplay' | 'none''hover'故障动画触发方式,仅在 effect="glitch" 时生效
glitchIntervalnumber3000自动播放间隔(毫秒),仅在 glitchTrigger="autoplay" 时生效
glitchSpeed'slow' | 'medium' | 'fast''medium'故障动画速度
glitchDirection'horizontal' | 'vertical' | 'both''horizontal'故障撕裂方向
classstringundefined自定义 CSS 类名

事件

按钮组件会传播所有原生 DOM 事件(如 clickmouseenter 等),无需额外配置。

事件参数说明
clickMouseEvent点击按钮时触发,加载或禁用状态时不触发

插槽

插槽作用域说明
default按钮内容

可访问性

  • 键盘操作:支持 Space / Enter 触发点击
  • ARIA 属性:禁用状态自动设置 disabled 属性(非 asChild 模式)或 aria-disabled="true"asChild 模式);加载状态自动设置 aria-busy="true"
  • 焦点管理:支持键盘导航和焦点样式(focus:outline

蛮力铸就。