zj-shortCalendar.vue 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. <template>
  2. <view class="date">
  3. <view class="date_dl">
  4. <view class="dd" v-for="(item,index) in week" :key="index">{{item}}</view>
  5. </view>
  6. <view class="date_dd">
  7. <view class="dd" @click="item_click(item, index)" v-for="(item, index) in week_list" :key="index">
  8. <view
  9. class="num"
  10. :class="[item.today ? 'today' : '', item.active ? 'active' : '']">
  11. {{item.today ? '今天':item.day}}
  12. </view>
  13. </view>
  14. </view>
  15. </view>
  16. </template>
  17. <script>
  18. export default {
  19. props:{
  20. value:{
  21. type: String,
  22. default: ''
  23. },
  24. },
  25. data(){
  26. return {
  27. week:['一','二','三','四','五','六','日'],
  28. week_list:[],
  29. start_date:'',
  30. end_date:'',
  31. prev_date:'',
  32. next_date:'',
  33. nowYear:'',
  34. nowMonth:'',
  35. nowDay:'',
  36. retract:false,
  37. nowTime:0,
  38. date:'',
  39. }
  40. },
  41. watch:{
  42. value(value){
  43. this.get_date(this.date_parse(value));
  44. },
  45. },
  46. created(){
  47. this.init();
  48. },
  49. methods:{
  50. change(){
  51. let value = {
  52. fulldate: this.date.replace(/-(\d)(?!\d)/g, '-0$1')
  53. };
  54. this.$emit('change',value)
  55. },
  56. init(){
  57. if(this.value){
  58. this.get_date(this.date_parse(this.value));
  59. this.item_click({
  60. date: this.value,
  61. day: this.value.slice(8, 10)
  62. })
  63. }else{
  64. this.get_date();
  65. }
  66. },
  67. set_to_day(){
  68. this.week_list.forEach((item, index)=>{
  69. if(item.date == `${this.date}`){
  70. item.active = true;
  71. }else{
  72. item.active = false;
  73. }
  74. })
  75. },
  76. item_click(item){
  77. console.log(item);
  78. if(item.empty) return false;
  79. this.date = item.date;
  80. this.nowDay = item.day;
  81. let now_arr = item.date.split('-')
  82. this.nowYear = now_arr[0];
  83. this.nowMonth = now_arr[1];
  84. this.nowDay = now_arr[2];
  85. this.set_to_day()
  86. this.nowTime = this.date_parse(`${item.date}`);
  87. this.change();
  88. },
  89. date_parse(str){
  90. return Date.parse(str.replace(/-(\d)(?!\d)/g, '-0$1'));
  91. },
  92. get_date(value = ''){
  93. let date = new Date();
  94. if(value){
  95. date = new Date(value);
  96. }
  97. let nowMonth = date.getMonth() + 1,
  98. nowYear = date.getFullYear(),
  99. nowDay = date.getDate(),
  100. nowTime = date.getTime(),
  101. nowWeek = date.getDay();
  102. let days = this.get_month_days(nowMonth,nowYear);
  103. let start_date = new Date(nowYear,nowMonth - 1, 1);
  104. let end_date = new Date(nowYear,nowMonth - 1, days);
  105. let prev_date = new Date(start_date.getTime() - 1);
  106. let next_date = new Date(end_date.getTime() + 86401 * 1000);
  107. let date_arrs = [];
  108. let week_list = [];
  109. let count_days = 14;
  110. let needNextMonth = (days - nowDay) < count_days;
  111. for(let i = 1; i <= (needNextMonth ? days : nowDay+count_days); i++){
  112. if(i >= nowDay) {
  113. date_arrs.push({
  114. day: i,
  115. today: i == nowDay ? true : false,
  116. active: false,
  117. date: `${nowYear}-${nowMonth < 9 ? ('0' + nowMonth) : nowMonth}-${i < 9 ? ('0' + i) : i}`
  118. })
  119. if(i == nowDay){
  120. this.date = `${nowYear}-${nowMonth < 9 ? ('0' + nowMonth) : nowMonth}-${i < 9 ? ('0' + i) : i}`;
  121. }
  122. }
  123. }
  124. let date_arrs_length = date_arrs.length;
  125. if(needNextMonth && date_arrs_length < 14){
  126. for(let i = 1; i <= count_days - date_arrs_length; i++){
  127. date_arrs.push({
  128. day: i,
  129. today: false,
  130. active: false,
  131. date: `${next_date.getFullYear()}-${next_date.getMonth()+1}-${i}`
  132. })
  133. }
  134. }
  135. for(let i=0; i < nowWeek - 1; i++) {
  136. date_arrs.unshift({
  137. day: '',
  138. empty: true
  139. })
  140. }
  141. this.week_list = date_arrs;
  142. this.nowYear = nowYear;
  143. this.nowMonth = nowMonth;
  144. this.nowDay = nowDay;
  145. this.nowTime = nowTime;
  146. this.start_date = start_date;
  147. this.end_date = end_date;
  148. this.prev_date = prev_date;
  149. this.next_date = next_date;
  150. },
  151. get_month_days(nowMonth,nowYear){
  152. let month_arr = [1,3,5,7,8,10,12];
  153. let days = 0;
  154. if(nowMonth == 2){
  155. if(nowYear % 4 == 0){
  156. days = 29;
  157. }else{
  158. days = 28;
  159. }
  160. }else if(month_arr.indexOf(nowMonth) >= 0){
  161. days = 31;
  162. }else{
  163. days = 30;
  164. }
  165. return days;
  166. }
  167. }
  168. }
  169. </script>
  170. <style lang="scss" scoped>
  171. .date{
  172. width: 100%;
  173. }
  174. .head{
  175. display: flex; align-items: center; height: 100rpx; justify-content: center;
  176. border-bottom: 1rpx solid #f5f5f5; color: #333333;
  177. .title{
  178. width: 200rpx; font-size: 30rpx; text-align: center;
  179. }
  180. .icon{
  181. display: block;
  182. .next{
  183. transform: rotate(180deg); display: block;
  184. }
  185. }
  186. }
  187. .retract{
  188. display: flex; justify-content: center; align-items: center; height: 80rpx;;
  189. .iconfont{
  190. transform: rotate(90deg);
  191. &.retract_icon{
  192. transform: rotate(270deg);
  193. }
  194. }
  195. }
  196. .date_dl{
  197. display: flex; width: 100%;
  198. .dd{
  199. flex:1; text-align: center;
  200. height: 80rpx;
  201. font-size: 26rpx;
  202. display: flex;
  203. flex-direction: column;
  204. align-items: center;
  205. justify-content: center;
  206. position: relative;
  207. color: #666;
  208. }
  209. }
  210. .date_dd {
  211. display: flex; width: 100%;
  212. flex-wrap: wrap;
  213. .dd{
  214. width: calc(100%/7);
  215. text-align: center;
  216. height: 80rpx;
  217. font-size: 26rpx;
  218. display: flex;
  219. flex-direction: column;
  220. align-items: center;
  221. justify-content: center;
  222. position: relative;
  223. .num{
  224. width: 60rpx; height: 60rpx; border-radius: 50%; line-height: 60rpx;
  225. &.disabled{
  226. color: #f1f1f1;
  227. }
  228. &.month{
  229. color: #333333;
  230. }
  231. &.today{
  232. color: $theme-color; font-size: 24rpx;
  233. }
  234. &.active{
  235. background: $theme-color; color:#fff;
  236. }
  237. }
  238. }
  239. }
  240. </style>