世上无难事,只要肯放弃- vue+typescript封装按钮

215 阅读1分钟

1.本人一直有一个奇妙的想法,一直受益于ant-design UI组件库,今日突然萌生了一个想法,想自己去尝试写一个ui库,但是 发现还是十分有难度的 ,于是 就基于vue+typescript 封装了一个最基本的按钮。并且想分享出来,看未来如果有这个能力,再继续写下去。。。

效果图如下:

使用组件代码:

<template>
  <div class="home">
    <h1>按钮组件封装</h1>
    <UIButton @click="onClick" large class="m20">large</UIButton>
    <UIButton @click="onClick" class="m20">normal</UIButton>
    <UIButton @click="onClick" small class="m20">small</UIButton>
    <UIButton @click="onClick" disabled class="m20">disabled</UIButton>

    <UIButton @click="onClick" type="primary" class="m20">primary</UIButton>
    <UIButton @click="onClick" type="dashed" class="m20">dashed</UIButton>
    <UIButton @click="onClick" type="danger" class="m20">danger</UIButton>
    <UIButton @click="onClick" type="link" class="m20">link</UIButton>
  </div>
</template>

<script lang="ts">
// @ is an alias to /src
import { Component, Vue } from "vue-property-decorator";

import UIButton from "@/components/UIButton";
@Component({
  components: {
    UIButton,
  },
})
export default class Home extends Vue {
  private onClick(event: MouseEvent) {
    console.log(event);
  }
}
</script>

<style lang="stylus" scope>
.m20 {
  margin-right: 20px;
}
</style>

封装组件代码:

<template>
  <button
    class="ui-btns"
    @click="onClickBtn"
    :class="{
    'ui-btns-large':large,
    'ui-btns-small':small,
    'ui-btns-disabled':disabled,
    'ui-btns-primary':type==='primary',
    'ui-btns-dashed':type==='dashed',
    'ui-btns-danger':type==='danger',
    'ui-btns-danger':type==='danger',
    'ui-btns-link':type==='link',
     }"
  >
    <slot>button</slot>
  </button>
</template>


<script lang="ts">
import { Component, Vue, Emit, Prop } from "vue-property-decorator";

@Component
export default class UIButton extends Vue {
  @Prop(Boolean) private large: boolean | undefined;
  @Prop(Boolean) private small: boolean | undefined;
  @Prop(Boolean) private disabled: boolean | undefined;
  @Prop(String) private type: string | undefined;

  @Emit("click") private emitClickEvent(event: MouseEvent) {
    console.log("11");
  }

  private mounted() {
    console.log("type", this.type);
  }

  private onClickBtn(event: MouseEvent) {
    this.emitClickEvent(event);
  }
}
</script>


<style lang="stylus" scope>
.ui-btns {
  min-width: 64px;
  height: 34px;
  padding: 0 16px;
  background: #fff;
  color: #000;
  font-size: 18px;
  border: 1px solid #d9d9d9;
  border-radius: 4px;
  cursor: pointer;
  user-select: none;
  outline: none;

  &:hover {
    color: #40a9ff;
    background-color: #fff;
    border-color: #40a9ff;
  }

  &.ui-btns-large {
    min-width: 100px;
    height: 40px;
    font-size: 24px;
  }

  &.ui-btns-small {
    min-width: 50px;
    height: 30px;
    font-size: 16px;
  }

  &.ui-btns-disabled {
    background: #f5f5f5;
    color: rgba(0, 0, 0, 0.25);
    border-color: #d9d9d9;
    cursor: not-allowed;
  }

  &.ui-btns-primary {
    background: #1890ff;
    color: #fff;
    border: 1px solid #1890ff;

    &:hover {
      background-color: #40a9ff;
      border-color: #40a9ff;
    }
  }

  &.ui-btns-dashed {
    background: #fff;
    color: rgba(0, 0, 0, 0.65);
    border: 1px solid #d9d9d9;
    border-style: dashed;

    &:hover {
      color: #40a9ff;
      background-color: #fff;
      border-color: #40a9ff;
    }
  }

  &.ui-btns-danger {
    background: #ff4d4f;
    color: #fff;
    border: 1px solid #ff4d4f;

    &:hover {
      color: #fff;
      background-color: #ff7875;
      border-color: #ff7875;
    }
  }

  &.ui-btns-link {
    color: #1890ff;
    background-color: transparent;
    border-color: transparent;
    box-shadow: none;
  }
}
</style>