vue文件
<template><buttonclass="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文件
// 该文件用于定义 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