71 lines
1.3 KiB
Vue
71 lines
1.3 KiB
Vue
<template>
|
||
<text class="iconfont" :class="iconClass" :style="iconStyle" @click="handleClick"></text>
|
||
</template>
|
||
|
||
<script setup>
|
||
import { computed } from 'vue'
|
||
|
||
const props = defineProps({
|
||
// 图标名称,如:home、user、search
|
||
name: {
|
||
type: String,
|
||
required: true
|
||
},
|
||
// 图标大小(单位:rpx)
|
||
size: {
|
||
type: [String, Number],
|
||
default: 32
|
||
},
|
||
// 图标颜色
|
||
color: {
|
||
type: String,
|
||
default: ''
|
||
},
|
||
// 是否粗体
|
||
bold: {
|
||
type: Boolean,
|
||
default: false
|
||
}
|
||
})
|
||
|
||
const emit = defineEmits(['click'])
|
||
|
||
// 图标类名
|
||
const iconClass = computed(() => {
|
||
const prefix = props.name.startsWith('icon-') ? '' : 'icon-'
|
||
return `${prefix}${props.name}`
|
||
})
|
||
|
||
// 图标样式
|
||
const iconStyle = computed(() => {
|
||
const style = {
|
||
fontSize: `${props.size}rpx`
|
||
}
|
||
|
||
if (props.color) {
|
||
style.color = props.color
|
||
}
|
||
|
||
if (props.bold) {
|
||
style.fontWeight = 'bold'
|
||
}
|
||
|
||
return style
|
||
})
|
||
|
||
// 点击事件
|
||
const handleClick = (e) => {
|
||
emit('click', e)
|
||
}
|
||
</script>
|
||
|
||
<style scoped>
|
||
.iconfont {
|
||
font-style: normal;
|
||
-webkit-font-smoothing: antialiased;
|
||
-moz-osx-font-smoothing: grayscale;
|
||
display: inline-block;
|
||
}
|
||
</style>
|
||
|