db-btn.vue 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. <template>
  2. <button
  3. class="db-btn"
  4. :class="[
  5. 'db-btn--' + type,
  6. plain ? 'db-btn--plain' : '',
  7. size === 'small' ? 'db-btn--small' : '',
  8. block ? 'db-btn--block' : '',
  9. disabled || loading ? 'db-btn--disabled' : ''
  10. ]"
  11. :disabled="disabled || loading"
  12. @click="onClick"
  13. >
  14. {{ loading ? '处理中...' : '' }}
  15. <slot v-if="!loading" />
  16. </button>
  17. </template>
  18. <script setup>
  19. const props = defineProps({
  20. type: { type: String, default: 'default' },
  21. size: { type: String, default: 'normal' },
  22. plain: Boolean,
  23. block: Boolean,
  24. loading: Boolean,
  25. disabled: Boolean
  26. })
  27. const emit = defineEmits(['click'])
  28. function onClick(e) {
  29. if (props.disabled || props.loading) return
  30. emit('click', e)
  31. }
  32. </script>
  33. <style scoped>
  34. .db-btn {
  35. display: inline-flex;
  36. align-items: center;
  37. justify-content: center;
  38. margin: 0;
  39. padding: 0 14px;
  40. height: 32px;
  41. line-height: 30px;
  42. font-size: 13px;
  43. border-radius: 6px;
  44. border: 1px solid #ebedf0;
  45. background: #fff;
  46. color: #323233;
  47. }
  48. .db-btn--small {
  49. height: 28px;
  50. padding: 0 10px;
  51. font-size: 12px;
  52. }
  53. .db-btn--block {
  54. display: flex;
  55. width: 100%;
  56. height: 44px;
  57. font-size: 15px;
  58. }
  59. .db-btn--primary {
  60. background: #52b788;
  61. border-color: #52b788;
  62. color: #fff;
  63. }
  64. .db-btn--primary.db-btn--plain {
  65. background: #fff;
  66. color: #52b788;
  67. }
  68. .db-btn--danger {
  69. background: #ee0a24;
  70. border-color: #ee0a24;
  71. color: #fff;
  72. }
  73. .db-btn--danger.db-btn--plain {
  74. background: #fff;
  75. color: #ee0a24;
  76. }
  77. .db-btn--disabled {
  78. opacity: 0.5;
  79. }
  80. </style>