SimpleDropDownPicker.vue 1.2 KB

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