Appearance
Fontawesome结合Vue3
文档地址:https://docs.fontawesome.com/web/use-with/vue
json
npm i --save @fortawesome/fontawesome-svg-core
npm i --save @fortawesome/free-solid-svg-icons
npm i --save @fortawesome/vue-fontawesome@latest-3Icon.vue
html
<template>
<i class="vk-icon" :class="{[`vk-icon--${type}`] : type }" :style="customStyles" v-bind="$attrs">
<font-awesome-icon v-bind="filteredProps"/>
</i>
</template>
<script setup lang="ts">
import { computed } from 'vue'
import { omit } from 'lodash-es'
import type { IconProps } from './types'
import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
defineOptions({
name: 'VkIcon',
inheritAttrs: false
})
const props = defineProps<IconProps>()
const filteredProps = computed(() => omit(props, ['type', 'color']))
const customStyles = computed(() => {
return props.color ? { color: props.color } : {}
})
</script>style.css
css
.vk-icon {
--vk-icon-color: inherit;
display: inline-flex;
justify-content: center;
align-items: center;
position: relative;
fill: currentColor;
color: var(--vk-icon-color);
font-size: inherit;
}
@each $val in primary,info,success,warning,danger {
.vk-icon--$(val) {
--vk-icon-color: var(--vk-color-$(val));
}
}types.ts
typescript
import type { IconDefinition } from '@fortawesome/fontawesome-svg-core'
export interface IconProps {
border?: boolean
fixedWidth?: boolean
flip?: 'horizontal' | 'vertical' | 'both'
icon: object | Array<string> | string | IconDefinition
mask?: object | Array<string> | string
listItem?: boolean
pull?: 'right' | 'left'
pulse?: boolean
rotation?: 90 | 180 | 270 | '90' | '180' | '270'
swapOpacity?: boolean
size?: '2xs' | 'xs' | 'sm' | 'lg' | 'xl' | '2xl' | '1x' | '2x' | '3x' | '4x' | '5x' | '6x' | '7x' | '8x' | '9x' | '10x'
spin?: boolean
transform?: object | string
symbol?: boolean | string
title?: string
inverse?: boolean
bounce?: boolean
shake?: boolean
beat?: boolean
fade?: boolean
beatFade?: boolean
spinPulse?: boolean
spinReverse?: boolean
type?: 'primary'| 'success'| 'warning'| 'danger'| 'info'
color?: string
}