fs-checkbox-button.vue 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. <template>
  2. <view
  3. class="fs-checkbox-button"
  4. :class="[
  5. selected ? checkedColorType : 'fs-checkbox-button-default',
  6. {'fs-checkbox-button-radius':radius, 'fs-checkbox-button-round':round},
  7. buttonSize
  8. ]"
  9. :style="{color:checkedColor}"
  10. @click="handleToggle">
  11. {{label}}
  12. <slot />
  13. </view>
  14. </template>
  15. <script setup>
  16. import { inject, watch, toRefs, ref } from 'vue'
  17. const props = defineProps({
  18. label: String,
  19. value: {
  20. type: null,
  21. required: true
  22. },
  23. checkedColor: String,
  24. checkedColorType: String,
  25. size: {
  26. type: String,
  27. validator(value) {
  28. return ['mini', 'small', 'medium'].includes(value)
  29. }
  30. },
  31. })
  32. const checkboxGroup = inject('checkboxGroup')
  33. const { inline, radius, round } = checkboxGroup
  34. const checkedColorType = props.checkedColorType || checkboxGroup.checkedColorType
  35. const checkedColor = props.checkedColor || checkboxGroup.checkedColor
  36. const buttonSize = props.size || checkboxGroup.size
  37. let selected = ref(false)
  38. checkboxGroup.updateChildren({
  39. selected,
  40. value: props.value
  41. })
  42. const handleToggle = () => {
  43. checkboxGroup.updateValue(props.value)
  44. }
  45. </script>
  46. <style lang="scss" scoped>
  47. .fs-checkbox-button {
  48. padding: 10rpx 30rpx;
  49. white-space: nowrap;
  50. border: 2rpx solid currentColor;
  51. margin-right: 20rpx;
  52. margin-bottom: 20rpx;
  53. &-default {
  54. color: #999999;
  55. }
  56. &-radius{
  57. border-radius: var(--radius);
  58. }
  59. &-round{
  60. border-radius: 60rpx;
  61. }
  62. &.medium{
  63. padding: 8rpx 25rpx;
  64. font-size: 13px;
  65. }
  66. &.small{
  67. padding: 6rpx 20rpx;
  68. font-size: 12px;
  69. }
  70. &.mini{
  71. padding: 2rpx 15rpx;
  72. font-size: 11px;
  73. }
  74. }
  75. </style>