Skip to content

Button 按钮

按钮组件,默认跟随父组件宽度,支持同时设置typestatusdisabled

组件源码
vue
<script lang="ts" setup>
defineProps<{
  type?: 'primary' | 'outline';
  status?: 'default' | 'danger';
  disabled?: boolean;
}>();
</script>

<template>
  <button
    name="button"
    type="button"
    autocomplete="off"
    class="base-button"
    :class="{
      'base-button--primary': type === 'primary' || !type,
      'base-button--outline': type === 'outline',
      'base-button--danger': status === 'danger',
      'base-button--disabled': disabled
    }">
    <slot />
  </button>
</template>

<style lang="scss" scoped>
$primary-color: #2f54eb;
$primary-color-hover: #597ef7;
$primary-color-disabled: #9dbefa;
$danger-color: #f5222d;
$danger-color-hover: #d4380d;
$danger-color-disabled: #fa8c96;

.base-button {
  all: unset;
  box-sizing: border-box;
  padding: 8px 12px;
  width: 100%;
  border-radius: 6px;
  border: none;
  cursor: pointer;
  font-size: 16px;
  text-align: center;
}

.base-button--primary {
  background: $primary-color;
  color: #fff;

  &:hover, &:focus {
    background-color: $primary-color-hover;
  }

  &.base-button--disabled {
    background-color: $primary-color-disabled;
  }

  &.base-button--danger {
    background-color: $danger-color;

    &:hover, &:focus {
      background-color: $danger-color-hover;
    }

    &.base-button--disabled {
      background-color: $danger-color-disabled;
    }
  }
}

.base-button--outline {
  color: $primary-color;
  background: #fff;
  border: 1px solid $primary-color;

  &:hover, &:focus {
    border-color: $primary-color-hover;
    color: $primary-color-hover;
    background-color: transparent;
  }

  &.base-button--disabled {
    border-color: $primary-color-disabled;
    color: $primary-color-disabled;
  }

  &.base-button--danger {
    border-color: $danger-color;
    color: $danger-color;

    &:hover, &:focus {
      border-color: $danger-color-hover;
      color: $danger-color-hover;
    }

    &.base-button--disabled {
      border-color: $danger-color-disabled;
      color: $danger-color-disabled;
    }
  }
}

.base-button--disabled {
  cursor: not-allowed;
}
</style>

基本用法

示例代码
vue
<template>
  <div class="container">
    <BaseButton>默认按钮</BaseButton>
    <div class="pl-20">
      <BaseButton status="danger">危险按钮</BaseButton>
    </div>

    <div class="pl-20"><BaseButton disabled>禁用按钮</BaseButton></div>
    <div class="pl-20">
      <BaseButton status="danger" disabled>禁用按钮</BaseButton>
    </div>
  </div>

  <div class="pt-20 container">
    <BaseButton type="outline">线框按钮</BaseButton>
    <div class="pl-20">
      <BaseButton type="outline" status="danger">危险按钮</BaseButton>
    </div>

    <div class="pl-20">
      <BaseButton type="outline" disabled>禁用按钮</BaseButton>
    </div>
    <div class="pl-20">
      <BaseButton type="outline" status="danger" disabled>禁用按钮</BaseButton>
    </div>
  </div>
</template>

<script lang="ts" setup>
import BaseButton from '@/BaseButton/BaseButton.vue';
</script>


<style lang="scss" scoped>
.container {
  display: flex;
  align-items: center;
  justify-content: space-around;
}

.pl-20 {
  padding-left: 20px;
  width: 100%;
}

.pt-20 {
  padding-top: 20px;
}
</style>

API

Props

参数名说明类型默认值
type类型'primary' | 'outline'primary
status状态'default' | 'danger'default
disabled是否禁用booleanfalse

Events

事件名说明参数
click点击按钮时触发(禁用时也会触发)event: MouseEvent

Slots

插槽名说明参数
default需要显示的内容-

Released under the MIT License.