PickertType.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. <template>
  2. <view class="picker-address">
  3. <uni-popup ref="popRef">
  4. <view class="picker-address-content">
  5. <view class="picker-address-top">
  6. <view class="picker-address-action cancel" @click="onCancel">取消</view>
  7. <view class="picker-address-action confirm" @click="onConfirm">确定</view>
  8. </view>
  9. <picker-view indicator-class='is-selected' :value="[selectedFeedbackIndex]" @change="onFeedbackChange">
  10. <picker-view-column>
  11. <view class="addr-item" :class="selectedFeedbackIndex == index ? 'selected' : ''"
  12. v-for="(item, index) in feedbackList" :key="index">
  13. {{ item.name }}
  14. </view>
  15. </picker-view-column>
  16. </picker-view>
  17. </view>
  18. </uni-popup>
  19. </view>
  20. </template>
  21. <script lang="ts" setup>
  22. import { ref, onMounted, computed, watch } from 'vue';
  23. const emits = defineEmits(['change']);
  24. const props = defineProps({
  25. feedbackArray: {
  26. type: Array,
  27. default: () => []
  28. },
  29. feedbackType: {
  30. type: [String, Number],
  31. default: ""
  32. }
  33. });
  34. watch(() => props.feedbackType, () => {
  35. if (props.feedbackType) {
  36. updateFeedbackIndex(props.feedbackType);
  37. }
  38. });
  39. const popRef = ref();
  40. const feedbackList = ref([]); // 反馈列表
  41. const selectedFeedbackIndex = ref(0); // 选中的反馈索引
  42. const selectedFeedback = computed(() => {
  43. return feedbackList.value[selectedFeedbackIndex.value] || { name: '反馈', value: null };
  44. });
  45. const onCancel = () => {
  46. popRef.value.close();
  47. };
  48. const onConfirm = () => {
  49. emits('change', selectedFeedback.value);
  50. onCancel();
  51. };
  52. const onFeedbackChange = (e) => {
  53. selectedFeedbackIndex.value = e.detail.value[0];
  54. };
  55. const openPop = () => {
  56. feedbackList.value = props.feedbackArray;
  57. popRef.value.open('bottom');
  58. };
  59. const updateFeedbackIndex = (feedbackType) => {
  60. const index = feedbackList.value.findIndex(feedback => feedback.value === feedbackType);
  61. selectedFeedbackIndex.value = index !== -1 ? index : 0;
  62. };
  63. onMounted(() => {
  64. if (props.feedbackType) {
  65. updateFeedbackIndex(props.feedbackType);
  66. }
  67. });
  68. defineExpose({ openPop });
  69. </script>
  70. <style lang="scss" scoped>
  71. .picker-address {
  72. .picker-address-content {
  73. background-color: #fff;
  74. border-radius: 16rpx 16rpx 0 0;
  75. .picker-address-top {
  76. height: 96rpx;
  77. @include flex-between;
  78. border-bottom: 1px solid $uni-border-color;
  79. .picker-address-action {
  80. font-size: $uni-font-size-xl;
  81. line-height: $uni-line-height-xl;
  82. @include flex;
  83. padding: 0 32rpx;
  84. &.cancel {
  85. color: $uni-text-color !important;
  86. }
  87. &.confirm {
  88. color: $uni-color-primary;
  89. }
  90. }
  91. }
  92. .addr-item {
  93. height: 96rpx !important;
  94. font-size: $uni-font-size-xl;
  95. line-height: $uni-line-height-xl;
  96. @include flex-center;
  97. &.selected {
  98. font-size: $uni-font-size-xxl;
  99. line-height: $uni-line-height-xxl;
  100. }
  101. }
  102. }
  103. :deep(uni-picker-view) {
  104. margin-top: 24rpx;
  105. }
  106. :deep(.is-selected) {
  107. height: 96rpx !important;
  108. color: $uni-text-color;
  109. font-size: $uni-font-size-xxl;
  110. line-height: $uni-line-height-xxl;
  111. }
  112. picker-view {
  113. width: 100%;
  114. height: 600rpx;
  115. padding: 0 32rpx;
  116. box-sizing: border-box;
  117. overflow: hidden;
  118. }
  119. }
  120. </style>