Radio.vue 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. <template>
  2. <div
  3. :class="['ptc-radio', { 'ptc-radio--checked': checked }]"
  4. @click="onClick"
  5. >
  6. <slot />
  7. </div>
  8. </template>
  9. <script setup lang="ts">
  10. import { inject, computed } from 'vue'
  11. const props = defineProps<{ value: any; modelValue?: any }>()
  12. const emit = defineEmits<{
  13. (e: 'update:modelValue', value: any): void
  14. }>()
  15. const parent = inject<any>('RadioGroup')
  16. const checked = computed(
  17. () => props.value === (parent ? parent.modelValue.value : props.modelValue)
  18. )
  19. function onClick() {
  20. if (checked.value) return
  21. parent
  22. ? parent.emit('update:modelValue', props.value)
  23. : emit('update:modelValue', props.value)
  24. }
  25. </script>
  26. <style lang="scss">
  27. .ptc-radio {
  28. position: relative;
  29. border-radius: 8px;
  30. border: 2px solid #d9d9d9;
  31. color: #666;
  32. &--checked {
  33. border-color: $primary-color;
  34. color: $primary-color;
  35. &::after {
  36. content: '';
  37. position: absolute;
  38. right: 0;
  39. bottom: 0;
  40. @include icon('@img/check.png', 68px, 72px);
  41. }
  42. }
  43. &:not(.ptc-radio--checked) [class*='icon-'] {
  44. filter: grayscale(1);
  45. opacity: 0.65;
  46. }
  47. }
  48. </style>