index.vue 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <template>
  2. <text
  3. :class="[fontClass, iconClass]"
  4. :style="{ color: color, fontSize: size + 'rpx',verticalAlign: 'middle'}"
  5. @click="handleClick"
  6. ></text>
  7. </template>
  8. <script setup>
  9. /**
  10. * 图标组件
  11. * 基于iconfont图标库
  12. */
  13. import { computed } from 'vue';
  14. // 组件属性定义
  15. const props = defineProps({
  16. // 图标名称,对应iconfont中的类名,如'icon-home'
  17. name: {
  18. type: String,
  19. required: true
  20. },
  21. // 图标库:legacy(旧库)/base(基础库)/biz(业务库)
  22. // 不传默认使用旧库,兼容现有代码
  23. lib: {
  24. type: String,
  25. default: 'legacy'
  26. },
  27. // 图标颜色
  28. color: {
  29. type: String,
  30. default: '#000'
  31. },
  32. // 图标大小,单位rpx
  33. size: {
  34. type: [Number, String],
  35. default: 32
  36. }
  37. });
  38. // 事件
  39. const emit = defineEmits(['click']);
  40. // 选择字体库class
  41. const fontClass = computed(() => {
  42. if (props.lib === 'base') return 'icon-base'
  43. if (props.lib === 'biz') return 'icon-biz'
  44. return 'iconfont'
  45. })
  46. // 计算完整的图标类名
  47. const iconClass = computed(() => {
  48. return props.name;
  49. });
  50. // 点击事件处理
  51. const handleClick = (event) => {
  52. emit('click', event);
  53. };
  54. </script>
  55. <style>
  56. /* 引入iconfont样式 */
  57. @import '../../static/iconfont/iconfont.css';
  58. @import '../../static/iconfont/icon-base/iconfont.css';
  59. @import '../../static/iconfont/icon-biz/iconfont.css';
  60. .iconfont,
  61. .icon-base,
  62. .icon-biz{
  63. line-height: 1;
  64. }
  65. </style>