DoublePicker.vue 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <template>
  2. <div class="double-picker">
  3. <div class="picker-column">
  4. <!-- <label :for="'picker-' + column1Name">{{ column1Label }}:</label> -->
  5. <select class="custom-select"
  6. :id="'picker-' + column1Name"
  7. v-model="selectedColumn1"
  8. @change="updateColumn2"
  9. >
  10. <option
  11. v-for="item in column1Data"
  12. :key="item.value"
  13. :value="item.value"
  14. >
  15. {{ item.label }}
  16. </option>
  17. </select>
  18. </div>
  19. <div class="picker-column">
  20. <!-- <label :for="'picker-' + column2Name">{{ column2Label }}:</label> -->
  21. <select class="custom-select"
  22. :id="'picker-' + column2Name"
  23. v-model="selectedColumn2"
  24. >
  25. <option
  26. v-for="item in column2Data"
  27. :key="item.value"
  28. :value="item.value"
  29. >
  30. {{ item.label }}
  31. </option>
  32. </select>
  33. </div>
  34. </div>
  35. </template>
  36. <script>
  37. export default {
  38. props: {
  39. column1Label: {
  40. type: String,
  41. default: "第一列"
  42. },
  43. column2Label: {
  44. type: String,
  45. default: "第二列"
  46. },
  47. column1Data: {
  48. type: Array,
  49. required: true
  50. },
  51. column2Data: {
  52. type: Array,
  53. required: true
  54. },
  55. column1Name: {
  56. type: String,
  57. default: "column1"
  58. },
  59. column2Name: {
  60. type: String,
  61. default: "column2"
  62. }
  63. },
  64. data() {
  65. return {
  66. selectedColumn1: "",
  67. selectedColumn2: ""
  68. };
  69. },
  70. methods: {
  71. updateColumn2() {
  72. this.$emit("update:column2Data", this.getColumn2Data());
  73. this.selectedColumn2 = ""; // 清空第二列选择
  74. },
  75. getColumn2Data() {
  76. // 根据第一列的选择返回第二列的数据
  77. const selectedColumn1 = this.column1Data.find(
  78. item => item.value === this.selectedColumn1
  79. );
  80. return selectedColumn1 ? selectedColumn1.children || [] : [];
  81. }
  82. },
  83. watch: {
  84. selectedColumn1() {
  85. this.$emit("input", {
  86. column1: this.selectedColumn1,
  87. column2: this.selectedColumn2
  88. });
  89. },
  90. selectedColumn2() {
  91. this.$emit("input", {
  92. column1: this.selectedColumn1,
  93. column2: this.selectedColumn2
  94. });
  95. }
  96. }
  97. };
  98. </script>
  99. <style scoped>
  100. .select-container {
  101. display: flex;
  102. width: 200px; /* 可以根据需要调整宽度 */
  103. }
  104. .custom-select {
  105. appearance: none; /* 去掉默认样式 */
  106. -webkit-appearance: none;
  107. -moz-appearance: none;
  108. background-color: transparent; /* 背景透明 */
  109. border: none; /* 去掉边框 */
  110. outline: none; /* 去掉焦点边框 */
  111. padding: 8px 12px; /* 添加内边距 */
  112. font-size: 16px; /* 字体大小 */
  113. width: 100%; /* 宽度占满容器 */
  114. cursor: pointer; /* 鼠标指针样式 */
  115. color: #333; /* 字体颜色 */
  116. }
  117. /* 添加自定义下拉箭头(可选) */
  118. .select-container::after {
  119. content: "▾";
  120. position: absolute;
  121. right: 10px;
  122. top: 50%;
  123. transform: translateY(-50%);
  124. pointer-events: none; /* 防止箭头影响点击 */
  125. color: #999; /* 箭头颜色 */
  126. }
  127. .double-picker {
  128. display: flex;
  129. justify-content: space-between;
  130. }
  131. .picker-column {
  132. flex: 1;
  133. }
  134. label {
  135. display: block;
  136. margin-bottom: 5px;
  137. }
  138. select {
  139. width: 100%;
  140. padding: 5px;
  141. font-size: 14px;
  142. }
  143. </style>