index.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. <template>
  2. <div class="date-picker">
  3. <div class="date-picker-box" >
  4. <vc-date-picker
  5. ref="Calendar"
  6. class="calendar"
  7. v-model="date"
  8. :first-day-of-week="1"
  9. :disabled-dates='disabledDates'
  10. @transition-start="queryMoth"
  11. @dayclick="onDayClick">
  12. </vc-date-picker>
  13. </div>
  14. <van-divider @click="foldBox">
  15. <van-icon v-if="showPicker" name="arrow-up" color="#ccc" size="20"/>
  16. <van-icon v-else name="arrow-down" color="#ccc" size="20"/>
  17. </van-divider>
  18. <!-- <p class="hide-line" @click="foldBox">-->
  19. <!-- <span>-->
  20. <!-- <van-icon v-if="showPicker" name="arrow-up" color="#ccc" size="20"/>-->
  21. <!-- <van-icon v-else name="arrow-down" color="#ccc" size="20"/>-->
  22. <!-- </span>-->
  23. <!-- </p>-->
  24. </div>
  25. </template>
  26. <script>
  27. import dayjs from "dayjs";
  28. export default {
  29. data(){
  30. let date = dayjs().add(1, 'day').format('YYYY-MM-DD');
  31. return{
  32. date:new Date(),
  33. showPicker:true,
  34. num:0,
  35. height:null,
  36. disabledDates:{
  37. start: date
  38. }
  39. }
  40. },
  41. mounted() {
  42. },
  43. watch:{
  44. // 监听显示状态
  45. showPicker (){
  46. let weeksBox = document.getElementsByClassName('vc-day');
  47. let pickerBox = document.getElementsByClassName('date-picker-box')[0];
  48. if( this.showPicker){
  49. for(let i = 0; i < weeksBox.length;i++){
  50. weeksBox[i].style.transitionDuration = `.5s`;
  51. weeksBox[i].style.transform = `translate(0, 0)`;
  52. }
  53. pickerBox.style.height = `${this.height}px`;
  54. console.log('show')
  55. }else {
  56. this.height = pickerBox.offsetHeight;
  57. for(let i = 0; i < weeksBox.length;i++){
  58. weeksBox[i].style.transitionDuration = `.5s`;
  59. weeksBox[i].style.transform = `translate(0, -${this.num * 32}px)`;
  60. }
  61. pickerBox.style.height = `100px`;
  62. console.log('hide')
  63. }
  64. }
  65. },
  66. methods:{
  67. foldBox(){
  68. let Calendar = this.$refs.Calendar;
  69. console.log(Calendar,'Calendar')
  70. this.num = Calendar.dateParts[0].week - 1;
  71. this.showPicker = !this.showPicker;
  72. },
  73. // 获取年、月份
  74. queryMoth(){
  75. let Calendar = this.$refs.Calendar;
  76. let year = Calendar.$refs.calendar.pages[0].year;
  77. let month = Calendar.$refs.calendar.pages[0].month;
  78. this.$emit('Mouth',{year,month});
  79. if(!this.showPicker) this.showPicker = true;
  80. },
  81. //点击日期
  82. onDayClick(day){
  83. if(day.isDisabled) return;
  84. console.log(day,'day')
  85. // let dayLine = day.classes[7].substring(5);
  86. // this.num = dayLine -1;
  87. this.$emit('change',day.id)
  88. },
  89. }
  90. }
  91. </script>
  92. <style lang="scss">
  93. .date-picker {
  94. width: 100%;
  95. background-color: #fff;
  96. box-sizing: border-box;
  97. .calendar {
  98. border: none;
  99. width: 100%;
  100. }
  101. .vc-header{
  102. width: 100%;
  103. background-color: #fff;
  104. position: relative;
  105. z-index:10;
  106. }
  107. .vc-arrow{
  108. position: relative;
  109. z-index:10;
  110. }
  111. .vc-weeks{
  112. overflow: hidden;
  113. transition-duration: .8s;
  114. background-color: #fff;
  115. padding-top: 0;
  116. }
  117. .vc-weekday{
  118. position: relative;
  119. padding-top: 10px;
  120. background-color: #fff;
  121. z-index:10;
  122. }
  123. .vc-day{
  124. transition-duration: .5s;
  125. }
  126. .date-picker-box{
  127. overflow: hidden;
  128. transition-duration: .5s;
  129. }
  130. .hide-line{
  131. box-sizing: border-box;
  132. display: flex;
  133. height: 1px;
  134. width: 100%;
  135. margin: 30px 0;
  136. background-color: #eaeaea;
  137. justify-content: center;
  138. align-items: center;
  139. >span{
  140. display: inline-block;
  141. padding: 6px;
  142. background-color: #fff;
  143. }
  144. }
  145. .van-divider{
  146. margin: 10px 20px;
  147. }
  148. }
  149. </style>