BookInfo.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. <template>
  2. <div class="pt-15 text-black-3 text-base">
  3. <div class="">日期选择</div>
  4. <div
  5. @click="showCalendarPicker = true"
  6. class="h-40 rounded-full border-[2px] px-15 mt-10 border-[#f7f7f7] flex items-center justify-between"
  7. >
  8. <span class="flex items-center space-x-10">
  9. <span>出发:{{ startDate }}</span>
  10. <span class="text-[#FF2222]"
  11. >{{ calendarData[startDate]?.adultPrice || "???"
  12. }}{{ detailData.priceUnit }}</span
  13. >
  14. </span>
  15. <span
  16. class="iconfont icon-caret-down text-primary"
  17. style="font-size: 24px"
  18. ></span>
  19. </div>
  20. <div class="mt-15">
  21. <div class="">人数选择</div>
  22. <div
  23. @click="showAdultNumberPicker = true"
  24. class="h-40 rounded-full border-[2px] px-15 mt-10 border-[#f7f7f7] flex items-center justify-between"
  25. >
  26. <span>成人:{{ adultNumber }}</span>
  27. <span class="flex-1 text-primary ml-20">12周岁及以上</span>
  28. <span
  29. class="iconfont icon-caret-down text-primary"
  30. style="font-size: 24px"
  31. ></span>
  32. </div>
  33. <div
  34. @click="showChildrenNumberPicker = true"
  35. class="h-40 rounded-full border-[2px] px-15 mt-10 border-[#f7f7f7] flex items-center justify-between"
  36. >
  37. <span>儿童:{{ childrenNumber }}</span>
  38. <span class="flex-1 text-primary ml-20">2-12周岁(不含)</span>
  39. <span
  40. class="iconfont icon-caret-down text-primary"
  41. style="font-size: 24px"
  42. ></span>
  43. </div>
  44. </div>
  45. <div class="mt-15">
  46. <div class="">预定须知</div>
  47. <div class="mt-10 flex flex-col space-y-3 text-sm text-black-6">
  48. <span>*该产品最少1人起订,成人+儿童最多支持16人</span>
  49. <span>*此线路因服务能力有限,无法接待婴儿(14天-2周岁(不含))出行</span>
  50. <span>*出于安全考虑,18岁以下未成年人需要至少一名成年旅客陪同</span>
  51. </div>
  52. </div>
  53. <van-popup
  54. v-model:show="showAdultNumberPicker"
  55. destroy-on-close
  56. round
  57. position="bottom"
  58. >
  59. <van-picker
  60. :columns="adultNumberPickerOptions"
  61. @cancel="showAdultNumberPicker = false"
  62. @confirm="onAdultNumberConfirm"
  63. />
  64. </van-popup>
  65. <van-popup
  66. v-model:show="showChildrenNumberPicker"
  67. destroy-on-close
  68. round
  69. position="bottom"
  70. >
  71. <van-picker
  72. :columns="childrenNumberPickerOptions"
  73. @cancel="showChildrenNumberPicker = false"
  74. @confirm="onChildrenNumberConfirm"
  75. />
  76. </van-popup>
  77. <van-popup
  78. v-model:show="showCalendarPicker"
  79. destroy-on-close
  80. round
  81. position="bottom"
  82. >
  83. <TravelProjectDetailBookInfoCalendar
  84. v-model:date="startDate"
  85. :calendar-data="calendarData"
  86. @on-close="showCalendarPicker = false"
  87. />
  88. </van-popup>
  89. </div>
  90. </template>
  91. <script setup>
  92. const props = defineProps({
  93. calendarData: {
  94. type: Object,
  95. default: () => {},
  96. },
  97. detailData: {
  98. type: Object,
  99. default: () => ({}),
  100. },
  101. });
  102. const startDate = defineModel("startDate");
  103. const adultNumber = defineModel("adultNumber");
  104. const childrenNumber = defineModel("childrenNumber");
  105. // 选择成人人数
  106. const showAdultNumberPicker = ref(false);
  107. const adultNumberPickerOptions = Array.from({ length: 9 }, (_, i) => i).map(
  108. (e) => ({
  109. text: `${e}人`,
  110. value: e,
  111. })
  112. );
  113. function onAdultNumberConfirm({ selectedValues }) {
  114. adultNumber.value = selectedValues[0];
  115. showAdultNumberPicker.value = false;
  116. }
  117. // 选择儿童人数
  118. const showChildrenNumberPicker = ref(false);
  119. const childrenNumberPickerOptions = Array.from({ length: 9 }, (_, i) => i).map(
  120. (e) => ({
  121. text: `${e}人`,
  122. value: e,
  123. })
  124. );
  125. function onChildrenNumberConfirm({ selectedValues }) {
  126. childrenNumber.value = selectedValues[0];
  127. showChildrenNumberPicker.value = false;
  128. }
  129. const showCalendarPicker = ref(false);
  130. // 选择日历
  131. </script>
  132. <style lang="scss" scoped></style>