前端有道 前端有道
导航
算法
开发
  • Git

    • Git导读
  • 收藏夹 (opens new window)
  • 工具库 (opens new window)
  • netlify Vuepress (opens new window)
  • vercel Vuepress (opens new window)
  • Vuepress2.0 (opens new window)
  • netlify Vuepress2.0 (opens new window)
留言区
娱乐
关于
  • 时间轴
  • 标签
  • 分类

星野

给岁月以文明
导航
算法
开发
  • Git

    • Git导读
  • 收藏夹 (opens new window)
  • 工具库 (opens new window)
  • netlify Vuepress (opens new window)
  • vercel Vuepress (opens new window)
  • Vuepress2.0 (opens new window)
  • netlify Vuepress2.0 (opens new window)
留言区
娱乐
关于
  • 时间轴
  • 标签
  • 分类
  • 基础知识

  • 工程化

  • 组件库

    • 手写el-form表单组件
    • Vue Toast组件开发
    • Vue button组件开发
    • Vue icon组件开发
    • Vue input组件开发
    • Vue message组件开发
    • Vue Popover组件开发
  • CSS

  • ES6-ES12

  • JavaScript

  • Vue2

  • Vue3

  • webpack

  • 浏览器

  • 开发
  • 组件库
星野
2021-5-29
0

Vue button组件开发

<template>
  <button class="lcx-button" :class="btnClass">
    <lcx-icon :icon="icon" v-if="icon" />
    <slot></slot>
  </button>
</template>
<script>
export default {
  name: 'lcx-button',
  props: {
    type: {
      type: String,
      default: '',
      validator(type) {
        if (
          type &&
          !['primary', 'success', 'info', 'danger', 'warning'].includes(type)
        ) {
          // eslint-disable-next-line no-console
          console.error(
            'type类型必须为其中一种' +
              ['primary', 'success', 'info', 'danger', 'warning'].join('、')
          );
          return false;
        }
        return true;
      }
    },
    icon: {
      type: String,
      default: ''
    }
  },
  computed: {
    btnClass() {
      let classes = [];
      if (this.type) {
        classes.push(`lcx-button-${this.type}`);
      }
      return classes;
    }
  }
};
</script>
<style lang="scss" scoped>
@import '@/assets/css/_var.scss';
.lcx-button {
  display: inline-block;
  white-space: nowrap;
  cursor: pointer;
  background: #fff;
  color: #606266;
  -webkit-appearance: none;
  text-align: center;
  box-sizing: border-box;
  margin: 0;
  padding: 12px 20px;
  font-size: 16px;
  border-radius: 4px;
  border: 1px solid #dcdfe6;
  background-color: #fff;
  &:hover {
    color: $primary;
    border-color: #c6e2ff;
    background-color: #ecf5ff;
  }
  &:focus,
  &:active {
    color: $primary;
    border-color: #c6e2ff;
    background-color: #ecf5ff;
    outline: none;
  }
  ::v-deep .icon {
    margin-right: 5px;
    color: #fff;
  }

  @each $type,
    $color
      in (
        primary: $primary,
        success: $success,
        info: $info,
        danger: $danger,
        warning: $warning
      )
  {
    &-#{$type} {
      color: #fff;
      background-color: $color;
    }
  }
  @each $type,
    $color
      in (
        primary: $primary-background-hover,
        success: $success-background-hover,
        info: $info-background-hover,
        danger: $danger-background-hover,
        warning: $warning-background-hover
      )
  {
    &-#{$type}:hover {
      color: #fff;
      background-color: $color;
      border-color: $color;
    }
  }

  @each $type,
    $color
      in (
        primary: $primary-background-active,
        success: $success-background-active,
        info: $info-background-active,
        danger: $danger-background-active,
        warning: $warning-background-active
      )
  {
    &-#{$type}:active,
    &-#{$type}:focus {
      color: #fff;
      background-color: $color;
      border-color: $color;
    }
  }
}
</style>

#vue
上次更新: 2022/05/09, 06:48:29
Vue Toast组件开发
Vue icon组件开发

← Vue Toast组件开发 Vue icon组件开发→

最近更新
01
图解Git
05-10
02
关于 - 网站错误反馈
05-10
03
关于 - 赞赏❤️的用途
05-10
更多文章>
加入前端有道交流群 | Copyright © 2018-2025 星野 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式