fs-radio-button.vue 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. <template>
  2. <view
  3. class="fs-radio-button"
  4. :class="[
  5. selected ? checkedColorType : 'fs-radio-button-default',
  6. {'fs-radio-button-radius':radius, 'fs-radio-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, reactive, watch, 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. checked: Boolean
  32. })
  33. const radioGroup = inject('radioGroup')
  34. const { radius, round } = radioGroup
  35. const checkedColorType = props.checkedColorType || radioGroup.checkedColorType
  36. const checkedColor = props.checkedColor || radioGroup.checkedColor
  37. const buttonSize = props.size || radioGroup.size
  38. let selected = ref(props.checked)
  39. watch(() => props.checked, val => {
  40. selected.value = val
  41. })
  42. radioGroup.updateChildren({
  43. selected,
  44. value: props.value
  45. })
  46. const handleToggle = () => {
  47. radioGroup.updateValue(props.value)
  48. }
  49. </script>
  50. <style lang="scss" scoped>
  51. .fs-radio-button {
  52. padding: 10rpx 30rpx;
  53. white-space: nowrap;
  54. border: 2rpx solid currentColor;
  55. margin-right: 20rpx;
  56. margin-bottom: 20rpx;
  57. &-default {
  58. color: #999999;
  59. }
  60. &-radius{
  61. border-radius: var(--radius);
  62. }
  63. &-round{
  64. border-radius: 60rpx;
  65. }
  66. &.medium{
  67. padding: 8rpx 25rpx;
  68. font-size: 13px;
  69. }
  70. &.small{
  71. padding: 6rpx 20rpx;
  72. font-size: 12px;
  73. }
  74. &.mini{
  75. padding: 2rpx 15rpx;
  76. font-size: 11px;
  77. }
  78. }
  79. </style>