RelationshipPicker.vue 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. <template>
  2. <view class="relationship-picker-wrap">
  3. <view class="form-item required" v-if="showLabel">
  4. <text class="label"><text class="required-mark">*</text>关系类型</text>
  5. </view>
  6. <picker :range="typeNames" @change="onChange" :disabled="disabled || loadError">
  7. <view class="picker" :class="{ 'picker-disabled': disabled || loadError, 'picker-error': loadError }">
  8. <text v-if="loading" class="status-text">加载中...</text>
  9. <text v-else-if="loadError" class="status-text error-text" @tap.stop="loadTypes">加载失败,点击重试</text>
  10. <text v-else>{{ selectedName || '请选择关系类型' }}</text>
  11. </view>
  12. </picker>
  13. </view>
  14. </template>
  15. <script>
  16. import { getRelationshipTypes } from '../utils/api.js'
  17. export default {
  18. name: 'RelationshipPicker',
  19. props: {
  20. value: { type: String, default: '' },
  21. disabled: { type: Boolean, default: false },
  22. showLabel: { type: Boolean, default: true }
  23. },
  24. data() {
  25. return {
  26. relationshipTypes: [],
  27. loading: false,
  28. loadError: false
  29. }
  30. },
  31. computed: {
  32. typeNames() {
  33. var names = []
  34. for (var i = 0; i < this.relationshipTypes.length; i++) {
  35. names.push(this.relationshipTypes[i].typeName)
  36. }
  37. return names
  38. },
  39. selectedName() {
  40. if (!this.value) return ''
  41. for (var i = 0; i < this.relationshipTypes.length; i++) {
  42. if (this.relationshipTypes[i].typeKey === this.value) {
  43. return this.relationshipTypes[i].typeName
  44. }
  45. }
  46. return ''
  47. }
  48. },
  49. mounted() {
  50. this.loadTypes()
  51. },
  52. methods: {
  53. async loadTypes() {
  54. this.loading = true
  55. this.loadError = false
  56. try {
  57. var res = await getRelationshipTypes()
  58. if (res.code === 200 && res.data) {
  59. this.relationshipTypes = res.data
  60. }
  61. } catch (e) {
  62. console.error('加载关系类型失败', e)
  63. this.loadError = true
  64. } finally {
  65. this.loading = false
  66. }
  67. },
  68. onChange(e) {
  69. var idx = e.detail.value
  70. if (idx >= 0 && idx < this.relationshipTypes.length) {
  71. this.$emit('input', this.relationshipTypes[idx].typeKey)
  72. }
  73. }
  74. }
  75. }
  76. </script>
  77. <style scoped>
  78. .picker {
  79. border: 1rpx solid #ddd;
  80. border-radius: 10rpx;
  81. padding: 20rpx;
  82. font-size: 28rpx;
  83. color: #666;
  84. }
  85. .picker-disabled {
  86. background: #f5f5f5;
  87. color: #999;
  88. }
  89. .form-item {
  90. margin-bottom: 10rpx;
  91. }
  92. .form-item .label {
  93. display: block;
  94. font-size: 28rpx;
  95. color: #333;
  96. margin-bottom: 10rpx;
  97. font-weight: bold;
  98. }
  99. .required-mark {
  100. color: #F97316;
  101. margin-right: 4rpx;
  102. }
  103. .status-text {
  104. font-size: 28rpx;
  105. color: #999;
  106. }
  107. .error-text {
  108. color: #F97316;
  109. }
  110. .picker-error {
  111. border-color: #F97316;
  112. }
  113. </style>