1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
| <template>
| <svg
| :class="[prefixCls, $attrs.class, spin && 'svg-icon-spin']"
| :style="getStyle"
| aria-hidden="true"
| >
| <use :xlink:href="symbolId" />
| </svg>
| </template>
| <script lang="ts" setup>
| import type { CSSProperties } from 'vue';
| import { computed } from 'vue';
| import { useDesign } from '@/hooks/web/useDesign';
|
| defineOptions({ name: 'SvgIcon' });
|
| const props = defineProps({
| prefix: {
| type: String,
| default: 'icon',
| },
| name: {
| type: String,
| required: true,
| },
| size: {
| type: [Number, String],
| default: 16,
| },
| spin: {
| type: Boolean,
| default: false,
| },
| });
|
| const { prefixCls } = useDesign('svg-icon');
| const symbolId = computed(() => `#${props.prefix}-${props.name}`);
|
| const getStyle = computed((): CSSProperties => {
| const { size } = props;
| let s = `${size}`;
| s = `${s.replace('px', '')}px`;
| return {
| width: s,
| height: s,
| };
| });
| </script>
| <style lang="less" scoped>
| @prefix-cls: ~'@{namespace}-svg-icon';
|
| .@{prefix-cls} {
| display: inline-block;
| overflow: hidden;
| fill: currentcolor;
| vertical-align: -0.15em;
| }
|
| .svg-icon-spin {
| animation: loadingCircle 1s infinite linear;
| }
| </style>
|
|