SimpleDropDownPicker.vue 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. <template>
  2. <view
  3. class="simple-dropdown-box"
  4. @click="show=true"
  5. >
  6. <picker @change="bindPickerChange" :value="selectedIndex" :range="columns" range-key="name">
  7. {{ dispayText }} ▼
  8. </picker>
  9. </view>
  10. </template>
  11. <script setup lang="ts">
  12. import { computed, ref, type PropType } from 'vue';
  13. export interface SimpleDropDownPickerItem {
  14. id: number,
  15. name: string,
  16. }
  17. const props = defineProps({
  18. columns: {
  19. type: Object as PropType<SimpleDropDownPickerItem[]|null>,
  20. default: null,
  21. },
  22. modelValue: {
  23. type: Number,
  24. default: null,
  25. },
  26. defaultText: {
  27. type: String,
  28. default: '请选择',
  29. },
  30. })
  31. const emit = defineEmits([
  32. 'update:modelValue',
  33. ])
  34. const show = ref(false);
  35. const dispayText = computed(() => {
  36. if (props.columns) {
  37. return props.columns.find(item => item.id == props.modelValue)?.name
  38. || props.defaultText;
  39. }
  40. return props.defaultText;
  41. });
  42. const selectedIndex = computed(() => {
  43. let index = -1;
  44. if (props.columns)
  45. index = props.columns.findIndex(item => item.id == props.modelValue);
  46. return index >= 0 ? index : 0;
  47. });
  48. function bindPickerChange(e:{ detail: { value: number }}) {
  49. show.value = false;
  50. emit('update:modelValue', props.columns?.[e.detail.value]?.id ?? null);
  51. }
  52. </script>
  53. <style lang="scss">
  54. .simple-dropdown-box {
  55. position: relative;
  56. padding: 16rpx 18rpx;
  57. border-radius: 30rpx;
  58. background: #FFFFFF;
  59. white-space: nowrap;
  60. overflow: hidden;
  61. text-overflow: ellipsis;
  62. }
  63. </style>