IconButton.vue 1011 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. <template>
  2. <ElButton
  3. :type="type"
  4. :loading="loading"
  5. :disabled="disabled"
  6. :size="size"
  7. :class="{ square }"
  8. v-bind="$attrs"
  9. >
  10. <Icon :icon="icon" :color="iconColor" :width="iconSize" :height="iconSize"></Icon>
  11. <slot>{{ label }}</slot>
  12. </ElButton>
  13. </template>
  14. <script setup lang="ts">
  15. import { ElButton } from 'element-plus'
  16. import Icon from '../icon/Icon.vue'
  17. import { computed } from 'vue'
  18. const props = withDefaults(
  19. defineProps<{
  20. icon: string
  21. iconColor?: string
  22. size?: 'small' | 'large' | 'default'
  23. loading?: boolean
  24. type?: 'primary' | 'success' | 'warning' | 'danger' | 'info' | 'default'
  25. disabled?: boolean
  26. square?: boolean
  27. label?: string
  28. }>(),
  29. {
  30. size: 'default',
  31. type: 'default',
  32. loading: false
  33. }
  34. )
  35. const iconSize = computed(() => (props.size === 'large' ? 20 : props.size === 'small' ? 12 : 16))
  36. </script>
  37. <style lang="less" scoped>
  38. .square {
  39. &.el-button {
  40. padding: 8px;
  41. &--large {
  42. padding: 12px;
  43. }
  44. &--small {
  45. padding: 5px;
  46. }
  47. }
  48. }
  49. </style>