vue文件
csharp
<template>
<button
class="button"
:class="[
`button-${type}`,
{
'is-plain': plain,
'is-round': round,
'is-circle': circle,
'is-disabled': disabled,
},
]"
:disabled="disabled"
@click="clickHandle"
>
<i v-if="icon" :class="`icon-${icon}`"></i>
<span v-if="$slots.default">
<slot></slot>
</span>
</button>
</template>
<script lang="ts">
import { defineComponent } from "vue";
import { buttonProps } from "./button";
export default defineComponent({
name: "Button",
props: buttonProps,
emits: ["click"],
setup(_, { emit }) {
function clickHandle(e: Event) {
emit("click", e);
}
return {
clickHandle,
};
},
});
</script>
<!-- <script setup lang='ts'>
defineOptions({
name: 'Button',
})
import { buttonProps, buttonEmits } from "./button";
defineProps(buttonProps)
const emit = defineEmits(buttonEmits)
const clickHandle = (e: Event) => {
emit('click', e)
}
</script> -->
<style scoped></style>
ts文件
csharp
// 该文件用于定义 button 的 props 属性
// 将 props 定义为 button 的类型
// ExtractPropTypes 是 vue3 所提供的一个工具类型
// 用于从 vue 组件的 props 对象中提取 ts 类型
import type { ExtractPropTypes } from "vue";
// 定义 props
export const buttonProps = {
type: {
type: String,
default: "default",
},
plain: {
type: Boolean,
default: false,
},
round: {
type: Boolean,
default: false,
},
circle: {
type: Boolean,
default: false,
},
disabled: {
type: Boolean,
default: false,
},
icon: {
type: String,
default: "",
},
};
export const buttonEmits = {
click: (e: MouseEvent) => e instanceof MouseEvent,
}
export type ButtonProps = ExtractPropTypes<typeof buttonProps>;
export type ButtonEmits = typeof buttonEmits