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>