Gender.vue 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. <script setup lang="ts">
  2. import { useI18n } from 'vue-i18n'
  3. import MaleIcon from '~/assets/images/common/male.png'
  4. import FemaleIcon from '~/assets/images/common/female.png'
  5. interface Props {
  6. gender: 0 | 1 | 2 // 0=未知,1=男,2=女
  7. age?: number
  8. }
  9. const props = defineProps<Props>()
  10. // If gender is unknown (0), don't display the component
  11. const shouldDisplay = computed(() => props.gender !== 0)
  12. const genderIcon = computed(() => {
  13. return props.gender === 1 ? MaleIcon : FemaleIcon
  14. })
  15. const { t } = useI18n()
  16. const genderText = computed(() => {
  17. return props.gender === 1 ? t('gender.male') : t('gender.female')
  18. })
  19. </script>
  20. <template>
  21. <div
  22. v-if="shouldDisplay"
  23. class="gender-display inline-flex items-center justify-end"
  24. >
  25. <img
  26. :src="genderIcon"
  27. :alt="genderText"
  28. class="gender-icon absolute"
  29. >
  30. <div class="age-container flex items-center justify-center">
  31. <span class="age-text text-xs font-medium text-white z-10">
  32. {{ age || t('gender.ageUnknown') }}
  33. </span>
  34. </div>
  35. </div>
  36. </template>
  37. <style lang="scss" scoped>
  38. .gender-display {
  39. width: 32px;
  40. height: 15px;
  41. position: relative;
  42. .gender-icon {
  43. object-fit: contain;
  44. }
  45. .age-container {
  46. width: 14px;
  47. margin-right: 4px;
  48. .age-text {
  49. font-size: 11px;
  50. line-height: 14px;
  51. }
  52. }
  53. }
  54. </style>