Rewrite AppIcon from Vue SFC to TSX
parent
211c6de488
commit
bee13bf409
@ -0,0 +1,38 @@
|
||||
import { defineComponent, computed, h, type Component } from 'vue'
|
||||
|
||||
const icons = import.meta.glob('@/assets/icons/*.svg', {
|
||||
eager: true,
|
||||
import: 'default',
|
||||
query: '?component'
|
||||
}) as Record<string, Component>
|
||||
|
||||
export default defineComponent({
|
||||
name: 'AppIcon',
|
||||
|
||||
inheritAttrs: false,
|
||||
|
||||
props: {
|
||||
name: { type: String, default: 'heart' }
|
||||
},
|
||||
|
||||
emits: {
|
||||
click: (_event: MouseEvent) => true
|
||||
},
|
||||
|
||||
setup(props, { attrs, emit }) {
|
||||
const icon = computed(() => {
|
||||
const key = Object.keys(icons).find((k) => k.endsWith(`/${props.name}.svg`))
|
||||
return key ? icons[key] : null
|
||||
})
|
||||
|
||||
return () => {
|
||||
if (icon.value) {
|
||||
return h(icon.value as any, {
|
||||
...attrs,
|
||||
onClick: (event: MouseEvent) => emit('click', event)
|
||||
})
|
||||
}
|
||||
return <div class="widget-user-image" style={`background-image: url(${props.name})`} />
|
||||
}
|
||||
}
|
||||
})
|
||||
@ -1,28 +0,0 @@
|
||||
<script setup lang="ts">
|
||||
import { computed } from 'vue'
|
||||
import type { Component } from 'vue'
|
||||
|
||||
const props = defineProps({
|
||||
name: { type: String, default: 'heart' }
|
||||
})
|
||||
|
||||
const emit = defineEmits<{ click: [event: MouseEvent] }>()
|
||||
|
||||
defineOptions({ inheritAttrs: false })
|
||||
|
||||
const icons = import.meta.glob('@/assets/icons/*.svg', {
|
||||
eager: true,
|
||||
import: 'default',
|
||||
query: '?component'
|
||||
}) as Record<string, Component>
|
||||
|
||||
const icon = computed(() => {
|
||||
const key = Object.keys(icons).find((k) => k.endsWith(`/${props.name}.svg`))
|
||||
return key ? icons[key] : null
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<component :is="icon" v-bind="$attrs" @click="emit('click', $event as MouseEvent)" v-if="icon" />
|
||||
<div v-else class="widget-user-image" :style="`background-image: url(${name})`" />
|
||||
</template>
|
||||
Loading…
Reference in New Issue