|
|
|
@ -1,5 +1,11 @@ |
|
|
|
<template> |
|
|
|
<span ref="elRef" :class="[$attrs.class, 'app-iconify anticon']" :style="getWrapStyle"></span> |
|
|
|
<SvgIcon :size="size" :name="getSvgIcon" v-if="isSvgIcon" :class="[$attrs.class]" /> |
|
|
|
<span |
|
|
|
v-else |
|
|
|
ref="elRef" |
|
|
|
:class="[$attrs.class, 'app-iconify anticon']" |
|
|
|
:style="getWrapStyle" |
|
|
|
></span> |
|
|
|
</template> |
|
|
|
<script lang="ts"> |
|
|
|
import type { PropType } from 'vue'; |
|
|
|
@ -13,12 +19,16 @@ |
|
|
|
computed, |
|
|
|
CSSProperties, |
|
|
|
} from 'vue'; |
|
|
|
|
|
|
|
import SvgIcon from './SvgIcon.vue'; |
|
|
|
import Iconify from '@purge-icons/generated'; |
|
|
|
import { isString } from '/@/utils/is'; |
|
|
|
import { propTypes } from '/@/utils/propTypes'; |
|
|
|
|
|
|
|
const SVG_END_WITH_FLAG = '|svg'; |
|
|
|
export default defineComponent({ |
|
|
|
name: 'GIcon', |
|
|
|
components: { SvgIcon }, |
|
|
|
props: { |
|
|
|
// icon name |
|
|
|
icon: propTypes.string, |
|
|
|
@ -34,28 +44,30 @@ |
|
|
|
setup(props) { |
|
|
|
const elRef = ref<ElRef>(null); |
|
|
|
|
|
|
|
const getIconRef = computed(() => { |
|
|
|
const { icon, prefix } = props; |
|
|
|
return `${prefix ? prefix + ':' : ''}${icon}`; |
|
|
|
}); |
|
|
|
const isSvgIcon = computed(() => props.icon?.endsWith(SVG_END_WITH_FLAG)); |
|
|
|
const getSvgIcon = computed(() => props.icon.replace(SVG_END_WITH_FLAG, '')); |
|
|
|
const getIconRef = computed(() => `${props.prefix ? props.prefix + ':' : ''}${props.icon}`); |
|
|
|
|
|
|
|
const update = async () => { |
|
|
|
if (unref(isSvgIcon)) return; |
|
|
|
|
|
|
|
const el = unref(elRef); |
|
|
|
if (el) { |
|
|
|
await nextTick(); |
|
|
|
const icon = unref(getIconRef); |
|
|
|
if (!icon) return; |
|
|
|
const svg = Iconify.renderSVG(icon, {}); |
|
|
|
if (svg) { |
|
|
|
el.textContent = ''; |
|
|
|
el.appendChild(svg); |
|
|
|
} else { |
|
|
|
const span = document.createElement('span'); |
|
|
|
span.className = 'iconify'; |
|
|
|
span.dataset.icon = icon; |
|
|
|
el.textContent = ''; |
|
|
|
el.appendChild(span); |
|
|
|
} |
|
|
|
if (!el) return; |
|
|
|
|
|
|
|
await nextTick(); |
|
|
|
const icon = unref(getIconRef); |
|
|
|
if (!icon) return; |
|
|
|
|
|
|
|
const svg = Iconify.renderSVG(icon, {}); |
|
|
|
if (svg) { |
|
|
|
el.textContent = ''; |
|
|
|
el.appendChild(svg); |
|
|
|
} else { |
|
|
|
const span = document.createElement('span'); |
|
|
|
span.className = 'iconify'; |
|
|
|
span.dataset.icon = icon; |
|
|
|
el.textContent = ''; |
|
|
|
el.appendChild(span); |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
@ -78,7 +90,7 @@ |
|
|
|
|
|
|
|
onMounted(update); |
|
|
|
|
|
|
|
return { elRef, getWrapStyle }; |
|
|
|
return { elRef, getWrapStyle, isSvgIcon, getSvgIcon }; |
|
|
|
}, |
|
|
|
}); |
|
|
|
</script> |
|
|
|
|