@xtdev/xt-miniprogram-ui 1.2.41 → 1.2.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,18 +1,22 @@
1
1
  /*
2
2
  * @Author: Mr.Hu
3
3
  * @Date: 2023-12-29 09:48:47
4
- * @Description: 日期组件-js逻辑
4
+ * @Description: 日期组件-支持上拉下拉循环选择
5
5
  * @LastEditors: Mr.Hu
6
6
  */
7
+ let LASTMONTH = null; // 用于储存上一次选中的月份
7
8
  // 获取当前月份的天数
8
9
  const getDaysInMonth = (year, month) => {
9
10
  const daysInMonth = new Date(year, month, 0).getDate();
10
11
  return daysInMonth;
11
- }
12
+ };
12
13
  // 深拷贝
13
14
  const deepClone = (val) => {
14
- if (!val) return null;
15
- const isObject = (obj) => Object.prototype.toString.call(obj) === '[object object]';
15
+ if (!val) {
16
+ return null;
17
+ }
18
+ const isObject = (obj) =>
19
+ Object.prototype.toString.call(obj) === "[object object]";
16
20
  let newResult = Array.isArray(val) ? [] : {};
17
21
  for (const key in val) {
18
22
  if (Object.prototype.hasOwnProperty.call(val, key)) {
@@ -20,12 +24,12 @@ const deepClone = (val) => {
20
24
  }
21
25
  }
22
26
  return newResult;
23
- }
27
+ };
24
28
  // 获取默认时间
25
29
  const getDefaultDate = () => {
26
30
  const now = new Date();
27
- return `${now.getFullYear()}-${now.getMonth()+1}-${now.getDate()}`;
28
- }
31
+ return `${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()}`;
32
+ };
29
33
  // 查找数组中第二个出现的元素下标
30
34
  const findSecondIndexOf = (arr, predicate) => {
31
35
  const firstIndex = arr.findIndex(predicate);
@@ -34,8 +38,8 @@ const findSecondIndexOf = (arr, predicate) => {
34
38
  }
35
39
  // 从第一个匹配项的下一个位置继续查找
36
40
  return arr.slice(firstIndex + 1).findIndex(predicate);
37
- }
38
-
41
+ };
42
+
39
43
  Component({
40
44
  behaviors: [],
41
45
  properties: {
@@ -47,92 +51,104 @@ Component({
47
51
  // 弹窗标题
48
52
  title: {
49
53
  type: String,
50
- value: '日期筛选'
54
+ value: "日期筛选",
51
55
  },
52
56
  // 日期选择器模式 date 年月日选择 dateRange 时间范围选择 yearMonth 年月
53
57
  type: {
54
58
  type: String,
55
- value: 'dateRange',
59
+ value: "dateRange",
56
60
  observer: function (value) {
57
- this.setData({filtType: value})
58
- }
61
+ this.setData({ filtType: value });
62
+ },
59
63
  },
60
64
  // 最小可选日期
61
65
  minDate: {
62
66
  type: String,
63
- value: '1990-1-1'
67
+ value: "1990-1-1",
64
68
  },
65
69
  // 最大可选日期
66
70
  maxDate: {
67
71
  type: String,
68
- value: ''
72
+ value: "",
69
73
  },
70
74
  // 当前时间
71
75
  currentDate: {
72
76
  type: String,
73
- value: ''
77
+ value: "",
74
78
  },
75
79
  // 展示切换按钮
76
80
  showChangeTab: {
77
81
  type: Boolean,
78
- value: false
82
+ value: false,
79
83
  },
80
84
  // 确认按钮文字
81
85
  confirmButtonText: {
82
86
  type: String,
83
- value: '确认'
87
+ value: "确认",
84
88
  },
85
89
  // 取消按钮文字
86
90
  cancelButtonText: {
87
91
  type: String,
88
- value: '重置'
89
- }
92
+ value: "重置",
93
+ },
90
94
  },
91
95
  data: {
92
96
  years: [], // 年份数组
93
97
  months: [], // 月份数组
94
98
  days: [], // 天份数组
95
99
  dateArr: [9999, 1, 1], // 下拉数组下标
96
- dateValue: '', // 选中的日期值
97
- dateStr: '', // 选中的日期显示字符
100
+ dateValue: "", // 选中的日期值
101
+ dateStr: "", // 选中的日期显示字符
98
102
  startDateArr: [], // 开始日期数组下标
99
- startDateValue: '', // 开始日期选中值
100
- startDateStr: '', // 开始日期字符
103
+ startDateValue: "", // 开始日期选中值
104
+ startDateStr: "", // 开始日期字符
101
105
  endDateArr: [], // 结束日期数组下标
102
- endDateValue: '', // 结束日期选中值
103
- endDateStr: '', // 结束日期字符
104
- defaultDate: '', // 默认日期(组件接收的|当前时间)
105
- checkedType: 'start', // 当前选择的日期类型
106
+ endDateValue: "", // 结束日期选中值
107
+ endDateStr: "", // 结束日期字符
108
+ defaultDate: "", // 默认日期(组件接收的|当前时间)
109
+ checkedType: "start", // 当前选择的日期类型
106
110
  clickedEnd: false, // 点击结束时间
107
- filtType: 'dateRange', // 选择器模式
111
+ filtType: "dateRange", // 选择器模式
112
+ btnDisabled: false, // 按钮禁用
113
+ newDaysArr: [], // 新的天数数组列表,储存拖动之后的天数数组值,用于拖动结束后更新
114
+ newDateArr: [], // 新的选中值,储存拖动之后当前选中的值,用于拖动结束后更新
108
115
  typeEnums: {
109
- date: '按日筛选',
110
- dateRange: '按月筛选',
116
+ date: "按日筛选",
117
+ dateRange: "按月筛选",
111
118
  },
112
- indicatorSyle: 'font-size: 40rpx;font-weight: 800;height: 60px'
119
+ indicatorSyle: "font-size: 40rpx;font-weight: 800;height: 60px",// 自定义样式
113
120
  },
114
121
  lifetimes: {
115
- created() {
116
- },
122
+ created() {},
117
123
  async attached() {
118
124
  await this.initPickerArr();
119
125
  this.setDefaultDate();
120
- await this.handelDays('', true);
121
- }
126
+ this.handelDays("", true);
127
+ },
122
128
  },
123
129
  methods: {
124
130
  // 初始化日期数组
125
131
  initPickerArr(curSelDate, dateValue) {
126
- const { minYear, maxYear, minMonth,
127
- maxMonth, minDay, maxDay,
128
- selYearColum, selMonthColum, selDayColum } = this.getMinAndMaxDate(curSelDate, dateValue);
129
- return new Promise(resolve => {
130
- if (selDayColum){
132
+ const {
133
+ minYear,
134
+ maxYear,
135
+ minMonth,
136
+ maxMonth,
137
+ minDay,
138
+ maxDay,
139
+ selYearColum,
140
+ selMonthColum,
141
+ selDayColum,
142
+ } = this.getMinAndMaxDate(curSelDate, dateValue);
143
+ return new Promise((resolve) => {
144
+ if (selDayColum) {
131
145
  resolve();
132
146
  return;
133
147
  }
134
- const years = [], months = [], days = [];
135
-
148
+ const years = [],
149
+ months = [],
150
+ days = [];
151
+
136
152
  for (let i = minYear; i <= maxYear; i++) {
137
153
  years.push(i);
138
154
  }
@@ -144,37 +160,55 @@ Component({
144
160
  }
145
161
  if (curSelDate) {
146
162
  this.setData({
147
- months
148
- })
149
- } else if (curSelDate && selMonthColum) {
163
+ months,
164
+ });
165
+ } else if (selMonthColum) {
150
166
  this.setData({
151
- days
152
- })
167
+ days,
168
+ });
153
169
  } else {
154
170
  this.setData({
155
171
  years,
156
172
  months,
157
- days
158
- })
173
+ days,
174
+ });
159
175
  }
160
176
  resolve();
161
- })
177
+ });
162
178
  },
163
179
  // 获取最小最大年月日, 当前所选择的列
164
180
  getMinAndMaxDate(curSelDate, dateValue) {
165
- let { data: { minDate, maxDate, currentDate, dateArr } } = this;
181
+ let {
182
+ data: { minDate, maxDate, currentDate, dateArr },
183
+ } = this;
166
184
  currentDate = currentDate || getDefaultDate();
167
- let minYear, maxYear, minMonth, maxMonth, minDay, maxDay = 31;
168
- const selYearColum = dateValue && dateArr ? dateValue[0] !== dateArr[0] : false; // 选择的是年份列
169
- const selMonthColum = dateValue && dateArr ? dateValue[1] !== dateArr[1] : false; // 选择的是月份列
170
- const selDayColum = dateValue && dateArr ? dateValue[2] !== dateArr[2] : false; // 选择的是日份列
171
- const curDateArr = this.transformToArr(curSelDate ? curSelDate : currentDate); //当前日期数组
172
- const curYear = curDateArr[0], curMonth= curDateArr[1], curDay = curDateArr[2];
185
+ let minYear,
186
+ maxYear,
187
+ minMonth,
188
+ maxMonth,
189
+ minDay,
190
+ maxDay = 31;
191
+ const selYearColum =
192
+ dateValue && dateArr ? dateValue[0] !== dateArr[0] : false; // 选择的是年份列
193
+ const selMonthColum =
194
+ dateValue && dateArr ? dateValue[1] !== dateArr[1] : false; // 选择的是月份列
195
+ const selDayColum =
196
+ dateValue && dateArr ? dateValue[2] !== dateArr[2] : false; // 选择的是日份列
197
+ const curDateArr = this.transformToArr(
198
+ curSelDate ? curSelDate : currentDate
199
+ );
200
+ // 当前日期数组
201
+ const curYear = curDateArr[0],
202
+ curMonth = curDateArr[1],
203
+ curDay = curDateArr[2];
173
204
  if (minDate && minDate.length) {
174
205
  const minDateArr = this.transformToArr(minDate);
175
206
  minYear = Number(minDateArr[0]);
176
- minMonth = (curYear && curYear == minDateArr[0]) ? minDateArr[1] : 1;
177
- minDay = (curYear && curYear == minDateArr[0] && curMonth == minDateArr[1]) ? minDateArr[2] : 1;
207
+ minMonth = curYear && curYear == minDateArr[0] ? minDateArr[1] : 1;
208
+ minDay =
209
+ curYear && curYear == minDateArr[0] && curMonth == minDateArr[1]
210
+ ? minDateArr[2]
211
+ : 1;
178
212
  } else {
179
213
  minYear = 1990;
180
214
  minMonth = 1;
@@ -183,45 +217,86 @@ Component({
183
217
  if (maxDate && maxDate.length) {
184
218
  const maxDateArr = this.transformToArr(maxDate);
185
219
  maxYear = maxDateArr[0];
186
- maxMonth = (curYear && curYear == maxDateArr[0]) ? maxDateArr[1] : 12;
187
- maxDay = (curYear && curYear == maxDateArr[0] && curMonth == maxDateArr[1]) ? maxDateArr[2] : 31;
220
+ maxMonth = curYear && curYear == maxDateArr[0] ? maxDateArr[1] : 12;
221
+ maxDay =
222
+ curYear && curYear == maxDateArr[0] && curMonth == maxDateArr[1]
223
+ ? maxDateArr[2]
224
+ : 31;
188
225
  } else {
189
226
  maxYear = new Date().getFullYear();
190
227
  maxMonth = 12;
191
- maxDay = getDaysInMonth(curYear, curMonth);;
228
+ maxDay = getDaysInMonth(curYear, curMonth);
192
229
  }
193
- return { minYear, maxYear, minMonth, maxMonth, minDay, maxDay, curYear, curMonth, curDay, selYearColum, selMonthColum, selDayColum };
230
+ return {
231
+ minYear,
232
+ maxYear,
233
+ minMonth,
234
+ maxMonth,
235
+ minDay,
236
+ maxDay,
237
+ curYear,
238
+ curMonth,
239
+ curDay,
240
+ selYearColum,
241
+ selMonthColum,
242
+ selDayColum,
243
+ };
194
244
  },
195
245
  // 处理传入日期格式
196
246
  transformToArr(dateStr) {
197
- if (!dateStr) return null;
198
- const dateArr = dateStr.split('-');
199
- if (!dateArr.length) return null;
247
+ if (!dateStr) {
248
+ return null;
249
+ }
250
+ const dateArr = dateStr.split("-");
251
+ if (!dateArr.length) {
252
+ return null;
253
+ }
200
254
  return dateArr;
201
255
  },
202
256
  // 设置默认年月日
203
257
  setDefaultDate() {
204
258
  const now = new Date();
205
- let { data: { dateValue, currentDate, dateStr, dateArr, defaultDate, minDate } } = this;
259
+ let {
260
+ data: {
261
+ dateValue,
262
+ currentDate,
263
+ dateStr,
264
+ dateArr,
265
+ defaultDate,
266
+ minDate,
267
+ },
268
+ } = this;
206
269
  currentDate = currentDate || getDefaultDate();
207
- let curDateArr = this.transformToArr(currentDate); //当前日期数组
270
+ let curDateArr = this.transformToArr(currentDate); // 当前日期数组
208
271
  const curYear = curDateArr[0];
209
- const curMonth= curDateArr[1];
272
+ const curMonth = curDateArr[1];
210
273
  const curDay = curDateArr[2];
211
274
  const minDateArr = this.transformToArr(minDate); // 最小可选日期数组
212
275
  const defaultYear = minDateArr ? minDateArr[0] : 1990;
213
- const defaultMonth = (minDateArr && curYear == minDateArr[0]) ? minDateArr[1] : 1;
214
- const defaultDay = (minDateArr && curYear == minDateArr[0] && curMonth == minDateArr[1]) ? minDateArr[2] : 1;
276
+ const defaultMonth =
277
+ minDateArr && curYear == minDateArr[0] ? minDateArr[1] : 1;
278
+ const defaultDay =
279
+ minDateArr && curYear == minDateArr[0] && curMonth == minDateArr[1]
280
+ ? minDateArr[2]
281
+ : 1;
215
282
  if (curDateArr && curDateArr.length) {
216
283
  // 如果有设置当前日期,则数组下标选中当前日期
217
284
  dateStr = `${curYear}年${curMonth}月${curDay}日`;
218
- dateArr = [curYear - defaultYear, curMonth - defaultMonth, curDateArr[2] - defaultDay];
285
+ dateArr = [
286
+ curYear - defaultYear,
287
+ curMonth - defaultMonth,
288
+ curDateArr[2] - defaultDay,
289
+ ];
219
290
  dateValue = `${curYear}-${curMonth}-${curDay}`;
220
291
  } else {
221
292
  // 如果有设置当前日期,则数组下标默认选中当前
222
- dateStr = `${now.getFullYear()}年${now.getMonth() + 1}月${now.getDate()}日`
223
- dateArr = [now.getFullYear() - 1990, now.getMonth(), now.getDate() - 1 ];
224
- dateValue = `${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()}`
293
+ dateStr = `${now.getFullYear()}年${
294
+ now.getMonth() + 1
295
+ }月${now.getDate()}日`;
296
+ dateArr = [now.getFullYear() - 1990, now.getMonth(), now.getDate() - 1];
297
+ dateValue = `${now.getFullYear()}-${
298
+ now.getMonth() + 1
299
+ }-${now.getDate()}`;
225
300
  }
226
301
  // 储存当前传入的原始值
227
302
  defaultDate = JSON.parse(JSON.stringify(dateValue));
@@ -232,194 +307,240 @@ Component({
232
307
  defaultDate,
233
308
  startDateArr: dateArr,
234
309
  startDateStr: dateStr,
235
- startDateValue: dateValue
310
+ startDateValue: dateValue,
236
311
  });
237
312
  },
238
313
  // 处理当前月的天数
239
314
  handelDays(value, isInitDate = false) {
240
- return new Promise(resolve => {
241
- let { data: { days, dateArr, years, months, minDate, maxDate } } = this;
242
- // 如果没有默认值
243
- if (!value) {
244
- const { minYear } = this.getMinAndMaxDate();
245
- let { data: { currentDate } } = this;
246
- currentDate = currentDate || getDefaultDate();
247
- value = this.transformToArr(currentDate); //当前日期数组
248
- value = [value[0] - minYear, value[1] - 1, value[2] - 1]
315
+ let {
316
+ data: { days, dateArr, years, months, minDate, maxDate, dateValue },
317
+ } = this;
318
+ // 如果没有默认值
319
+ if (!value) {
320
+ const { minYear } = this.getMinAndMaxDate();
321
+ let {
322
+ data: { currentDate },
323
+ } = this;
324
+ currentDate = currentDate || getDefaultDate();
325
+ value = this.transformToArr(currentDate); // 当前日期数组
326
+ value = [value[0] - minYear, value[1] - 1, value[2] - 1];
327
+ }
328
+ const selYear = years[value?.[0]],
329
+ selMonth = months[value?.[1]],
330
+ selDay = days[value?.[2]];
331
+ let {
332
+ minYear,
333
+ minMonth,
334
+ maxMonth,
335
+ minDay,
336
+ maxDay,
337
+ selYearColum,
338
+ selMonthColum,
339
+ selDayColum,
340
+ } = this.getMinAndMaxDate(`${selYear}-${selMonth}-${selDay}`, value);
341
+ // 获取当前日期数组,当前选中日期值
342
+ let newDaysArr = days,
343
+ newDateArr = value;
344
+ /****** 处理月份数组下拉列表 start******/
345
+ // 1.后面插入:如果当前选中的是月份,并且是接近最大月,并且当前月份后面没有重复月份,处理月份下拉数组
346
+ const isMonthLastColum =
347
+ selMonth >= maxMonth - 3 && (selMonthColum || selYearColum);
348
+ if (isMonthLastColum || (selMonth >= maxMonth - 3 && isInitDate)) {
349
+ for (let i = minMonth; i <= maxMonth; i++) {
350
+ months.push(i);
249
351
  }
250
- const selYear = years[value?.[0]],
251
- selMonth = months[value?.[1]],
252
- selDay = days.length > value?.[2] + 1 ? value?.[2] + 1 : days.length;
253
- let { minYear, minMonth, maxMonth, minDay, maxDay, selYearColum, selMonthColum, selDayColum } = this.getMinAndMaxDate(`${selYear}-${selMonth}-${selDay}`, value);
254
- // 获取当前日期数组,当前选中日期值
255
- let newDaysArr = days, newDateArr = value;
256
- // 如果所选天数组下标大于当月天数, 并且当前是切换月份
257
- if (value && value[2] >= maxDay && selMonthColum){
258
- newDateArr = [newDateArr[0], value[1], maxDay - 1]
352
+ this.setData({
353
+ months,
354
+ });
355
+ }
356
+ // 2.前面插入:如果当前选中的是月份,并且是接近最小月,并且当前月份前面没有重复月份,处理月份下拉数组
357
+ const isMonthFirstColum =
358
+ selMonth <= maxMonth - 3 && newDateArr[1] < maxMonth && selMonthColum; // 当前选中的第一月
359
+ if (isMonthFirstColum || (selMonth <= maxMonth - 3 && isInitDate)) {
360
+ for (let i = maxMonth; i >= minMonth; i--) {
361
+ months.unshift(i);
259
362
  }
260
- /** 处理月数组下拉列表 **/
261
- // 1.后面插入:如果当前选中的是月份,并且是接近最大月,并且当前月份后面没有重复月份,处理月份下拉数组
262
- const isMonthLastColum = selMonth >= maxMonth - 6 && (selMonthColum || selYearColum);
263
- if (isMonthLastColum || (selMonth >= maxMonth - 6 && isInitDate)) {
264
- for (let i = minMonth; i <= maxMonth; i++) {
265
- months.push(i);
363
+ newDateArr = [newDateArr[0], newDateArr[1] + maxMonth, newDateArr[2]];
364
+ this.setData({
365
+ months,
366
+ });
367
+ }
368
+ /****** 处理月份数组下拉列表 end******/
369
+
370
+ /****** 处理天数下拉列表 start******/
371
+ const firstIndex = findSecondIndexOf(newDaysArr, (el) => el == 1);
372
+ // 1.切换月份,更新天数组列表
373
+ if (selMonthColum || selYearColum) {
374
+ const newArray = [];
375
+ for (let j = 1; j <= 2; j++) {
376
+ for (let i = minDay; i <= maxDay; i++) {
377
+ newArray.push(i);
266
378
  }
267
- this.setData({
268
- months,
269
- })
270
379
  }
271
- // 2.前面插入:如果当前选中的是月份,并且是接近最小月,并且当前月份前面没有重复月份,处理月份下拉数组
272
- const isMonthFirstColum = selMonth == minMonth && newDateArr[1] < maxMonth && selMonthColum; // 当前选中的第一月
273
- if (isMonthFirstColum || (selMonth == minMonth && isInitDate)) {
274
- for (let i = maxMonth; i >= minMonth; i--) {
275
- months.unshift(i);
276
- }
277
- newDateArr = [
278
- newDateArr[0],
279
- newDateArr[1] + maxMonth,
280
- newDateArr[2]
281
- ];
282
- this.setData({
283
- months
284
- })
380
+ newDaysArr = newArray; // 重置当前月的天数组列表
381
+ const beforeMonth = LASTMONTH; // 获取上次选择月数
382
+ // 获取切换之前月选中信息
383
+ const prevSelDateParams = this.getMinAndMaxDate(
384
+ `${selYear}-${beforeMonth}-${selDay}`
385
+ );
386
+ // 如果选中的是当月第一天,处理当前选中的下标逻辑
387
+ if (selDay == 1) {
388
+ const valueDay = maxDay - prevSelDateParams.maxDay;
389
+ newDateArr = [newDateArr[0], newDateArr[1], newDateArr[2] + valueDay];
285
390
  }
286
- // console.log('newDateArr:', newDateArr);
287
- // console.log('newMonths:', months);
288
- /** 处理天数下拉列表 **/
289
- const firstIndex = findSecondIndexOf(newDaysArr, el => el == 1 );
290
- debugger;
291
- // 1.选择最后一天,再切换月,处理天数下拉数组,且处理2月闰月bug
292
- if (selMonthColum && (selDay >= maxDay - 1 || [28, 29].includes(selDay))) {
293
- console.log(111);
294
- // 如果当前有多余数据,则进行删除
295
- if (newDaysArr.length > 58) {
296
- newDaysArr = newDaysArr.slice(firstIndex + 1, newDaysArr.length)
297
- }
298
- const apendDays = [];
299
- for (let i = minDay; i <= maxDay; i++) {
300
- apendDays.push(i);
301
- }
302
- newDaysArr = apendDays.concat(newDaysArr);
391
+ // 如果选中的是当月最后一天,处理当前选中的下标逻辑
392
+ if (selDay == prevSelDateParams.maxDay) {
393
+ // 获取当前月天数
394
+ const curSelDateParams = this.getMinAndMaxDate(
395
+ `${selYear}-${selMonth}-${selDay}`
396
+ );
303
397
  newDateArr = [
304
398
  newDateArr[0],
305
399
  newDateArr[1],
306
- maxDay - 1
400
+ curSelDateParams.maxDay - 1,
307
401
  ];
308
402
  }
309
- // 2.如果当前选中的是天数,并且是接近最大天数,并且当前天数后面没有重复天数,处理天数下拉数组
310
- const isDayLastColum = selDayColum && selDay >= newDaysArr.length - 6;
311
- // 获取上一个月的天数
312
- debugger;
313
- const { maxDay: nextMonthMaxDay } = this.getMinAndMaxDate(`${selYear}-${selMonth + 1}-${selDay}`);
314
- if (isDayLastColum || (isInitDate && selDay >= newDaysArr.length - 6)) {
315
- console.log(222);
316
- if (newDaysArr.length > 58) {
317
- newDaysArr = newDaysArr.slice(firstIndex + 1, newDaysArr.length);
318
- }
319
- for (let i = minDay; i <= nextMonthMaxDay; i++) {
320
- newDaysArr.push(i);
321
- }
403
+ }
404
+ // 天数列表上拉循环选择--后面插入
405
+ // 前选中天数列表,选中的接近最大天数,并且当前天数后面没有重复天数,处理天数下拉数组
406
+ const isDayLastColum = selDayColum && selDay >= maxDay - 3;
407
+ // 获取上一个月的天数
408
+ if (isDayLastColum || (isInitDate && selDay >= maxDay - 3)) {
409
+ // 如果当前选中的不是天数组最后三条数据,重新组装
410
+ if (
411
+ newDaysArr.length > 2 * maxDay &&
412
+ value[2] <= newDaysArr.length - 3
413
+ ) {
414
+ newDaysArr = newDaysArr.slice(firstIndex + 1, newDaysArr.length);
322
415
  }
323
- // 天数列表上拉循环选择--前面插入
324
- // 1.当前选中天数列表,选中的是最小天数,并且设置的天数小于最大天数
325
- const isDayFirstColum = selDay == minDay && newDateArr[2] < maxDay && selDayColum; // 当前选中的第一日
326
- const { maxDay: prevMonthMaxDay } = this.getMinAndMaxDate(`${selYear}-${selMonth - 1}-${selDay}`);
327
- // 2. 当前初始日期前面设置添加循环选择
328
- if (isDayFirstColum || (isInitDate && selDay == minDay)) {
329
- for (let i = prevMonthMaxDay; i >= minDay; i--) {
330
- newDaysArr.unshift(i);
331
- }
332
- this.setData({
333
- days: newDaysArr
334
- });
335
- let valueDay = Number(newDateArr[2] + prevMonthMaxDay);
336
- newDateArr = [
337
- newDateArr[0],
338
- newDateArr[1],
339
- valueDay
340
- ];
416
+ for (let i = minDay; i <= maxDay; i++) {
417
+ newDaysArr.push(i);
341
418
  }
342
- // 天数选择下拉循环选择
343
- console.log('newDateArr:', newDateArr);
344
- console.log('newDaysArr:', newDaysArr);
345
- // 解决回弹动画延时问题
346
- if ((isMonthFirstColum || isDayFirstColum) && !this.data.isRset) {
347
- setTimeout(() => {
348
- this.setData({
349
- days: newDaysArr,
350
- dateArr: newDateArr
351
- });
352
- resolve();
353
- }, 1500);
354
- } else {
355
- this.setData({
356
- days: newDaysArr,
357
- dateArr: newDateArr,
358
- isRset: false
359
- })
360
- resolve();
419
+ }
420
+ // 天数列表上拉循环选择--前面插入
421
+ // 当前选中天数列表,选中的接近最小天数,并且设置的天数小于最大天数
422
+ const isDayFirstColum =
423
+ selDay <= minDay + 3 && newDateArr[2] < maxDay && selDayColum; // 当前选中的第一日
424
+ if (isDayFirstColum || (isInitDate && selDay <= minDay + 3)) {
425
+ for (let i = maxDay; i >= minDay; i--) {
426
+ newDaysArr.unshift(i);
361
427
  }
428
+ let valueDay = newDateArr[2] + maxDay;
429
+ newDateArr = [newDateArr[0], newDateArr[1], valueDay];
430
+ this.setData({
431
+ days: newDaysArr,
432
+ dateArr: newDateArr
433
+ }, () => {
434
+ this.setData({
435
+ dateArr: newDateArr
436
+ });
437
+ });
438
+ }
439
+ /****** 处理天数循环选择列表 end******/
440
+
441
+ LASTMONTH = selMonth; // 储存当前选中的月份,为上次选中的月份
442
+ // 处理快速拉动引发的bug
443
+ if (newDateArr[2] > newDaysArr.length) {
444
+ newDateArr = [newDateArr[0], newDateArr[1], newDaysArr.length - 1];
445
+ }
446
+ // 天数选择下拉循环选择
447
+ this.setData({
448
+ newDaysArr,
449
+ newDateArr,
362
450
  });
363
451
  },
452
+ // 监听滚动开始,禁用确认按钮
453
+ bindPickstart(e) {
454
+ this.setData({
455
+ btnDisabled: true
456
+ });
457
+ },
458
+ // 监听滚动结束:滚动结束,更新选中时间
459
+ bindPickend(e) {
460
+ const {
461
+ data: { newDaysArr, newDateArr },
462
+ } = this;
463
+ this.setData({
464
+ days: newDaysArr,
465
+ dateArr: newDateArr,
466
+ btnDisabled: false
467
+ });
468
+ this.updateChangeValue();
469
+ },
364
470
  // 滑动下拉列表
365
471
  async bindChange(e) {
366
- console.log('bindChange:', e);
367
472
  const value = e?.detail?.value;
368
- // const { data: { years: year, months: month, days: day } } = this;
369
- // // 渲染下拉列表
370
- // await this.initPickerArr(`${year[value[0]]}-${month[value[1]]}-${day[value[2]]}`, value);
371
473
  // 处理每月可选天数
372
- await this.handelDays(value);
373
- let { data: {
374
- years, months, days,
375
- dateValue, dateStr, dateArr,
376
- filtType, checkedType,
377
- startDateArr, endDateArr,
378
- startDateValue, endDateValue,
379
- startDateStr, endDateStr
380
- } } = this;
381
- dateStr = `${years[dateArr[0]]}年${months[dateArr[1]]}月${days[dateArr[2]]}日`;
382
- dateValue = `${years[dateArr[0]]}-${months[dateArr[1]]}-${days[dateArr[2]]}`;
383
- if (filtType === 'yearMonth') {
474
+ this.handelDays(value);
475
+ },
476
+ // 更新选中的值
477
+ updateChangeValue() {
478
+ let {
479
+ data: {
480
+ years,
481
+ months,
482
+ days,
483
+ dateValue,
484
+ dateStr,
485
+ dateArr,
486
+ filtType,
487
+ checkedType,
488
+ startDateArr,
489
+ endDateArr,
490
+ startDateValue,
491
+ endDateValue,
492
+ startDateStr,
493
+ endDateStr,
494
+ },
495
+ } = this;
496
+ dateStr = `${years[dateArr[0]]}年${months[dateArr[1]]}月${
497
+ days[dateArr[2]]
498
+ }日`;
499
+ dateValue = `${years[dateArr[0]]}-${months[dateArr[1]]}-${
500
+ days[dateArr[2]]
501
+ }`;
502
+ if (filtType === "yearMonth") {
384
503
  dateStr = `${years[dateArr[0]]}年${months[dateArr[1]]}月`;
385
504
  dateValue = `${years[dateArr[0]]}-${months[dateArr[1]]}`;
386
505
  // 如果是按年月筛选
387
506
  this.setData({
388
507
  dateStr,
389
- dateValue
508
+ dateValue,
390
509
  });
391
- } else if (filtType === 'date') {
510
+ } else if (filtType === "date") {
392
511
  // 如果是按年月日筛选
393
512
  this.setData({
394
513
  dateStr,
395
- dateValue
514
+ dateValue,
515
+ });
516
+ } else if (checkedType === "start") {
517
+ this.setData({
518
+ startDateArr: dateArr,
519
+ startDateStr: dateStr,
520
+ startDateValue: dateValue,
396
521
  });
397
- } else if (checkedType === 'start') {
398
- this.setData({
399
- startDateArr: dateArr,
400
- startDateStr: dateStr,
401
- startDateValue: dateValue,
402
- })
403
522
  } else {
404
523
  this.setData({
405
524
  endDateArr: dateArr,
406
525
  endDateStr: dateStr,
407
526
  endDateValue: dateValue,
408
- })
527
+ });
409
528
  }
410
529
  },
411
530
  // 更改筛选类型
412
531
  changeFiltType() {
413
- const { data: { filtType, dateValue, dateStr, dateArr } } = this;
532
+ const {
533
+ data: { filtType, dateValue, dateStr, dateArr },
534
+ } = this;
414
535
  this.setData({
415
- filtType: filtType === 'date' ? 'dateRange' : 'date',
416
- })
417
- if (filtType === 'date') {
418
- this.setData({
536
+ filtType: filtType === "date" ? "dateRange" : "date",
537
+ });
538
+ if (filtType === "date") {
539
+ this.setData({
419
540
  startDateValue: dateValue,
420
541
  startDateStr: dateStr,
421
- startDateArr: dateArr
422
- });
542
+ startDateArr: dateArr,
543
+ });
423
544
  return;
424
545
  }
425
546
  this.onReset();
@@ -427,76 +548,93 @@ Component({
427
548
  // 切换日期类型
428
549
  switchDateType(e) {
429
550
  const checkedType = e.currentTarget.dataset.type;
430
- const { data: { clickedEnd } } = this;
551
+ const {
552
+ data: { clickedEnd },
553
+ } = this;
431
554
  this.setData({
432
555
  checkedType,
433
- clickedEnd: checkedType === 'end' ? true : clickedEnd
556
+ clickedEnd: checkedType === "end" ? true : clickedEnd,
434
557
  });
435
558
  this.showCheckedPicker();
436
559
  },
437
560
  // 反显选中的日期下拉值
438
561
  showCheckedPicker() {
439
- let { data: {
440
- startDateValue, endDateValue, checkedType,
441
- startDateArr, endDateArr, dateArr,
442
- startDateStr, endDateStr
443
- } } = this;
444
- // 如果当前切换到结束时间选项
445
- if (checkedType === 'end') {
562
+ let {
563
+ data: {
564
+ startDateValue,
565
+ endDateValue,
566
+ checkedType,
567
+ startDateArr,
568
+ endDateArr,
569
+ dateArr,
570
+ startDateStr,
571
+ endDateStr,
572
+ },
573
+ } = this;
574
+ // 如果当前切换到结束时间选项
575
+ if (checkedType === "end") {
446
576
  if (!endDateValue) {
447
577
  // 如果当前没有选结束时间
448
578
  endDateValue = startDateValue;
449
579
  endDateArr = startDateArr;
450
580
  endDateStr = startDateStr;
451
581
  } else {
452
- dateArr = [endDateArr[0], endDateArr[1], endDateArr[2]]
582
+ dateArr = [endDateArr[0], endDateArr[1], endDateArr[2]];
453
583
  }
454
584
  }
455
- if (checkedType === 'start') {
456
- dateArr = [startDateArr[0], startDateArr[1], startDateArr[2]]
585
+ if (checkedType === "start") {
586
+ dateArr = [startDateArr[0], startDateArr[1], startDateArr[2]];
457
587
  }
458
588
  this.setData({
459
589
  endDateStr,
460
590
  endDateValue,
461
591
  endDateArr,
462
- dateArr
463
- })
592
+ dateArr,
593
+ });
464
594
  },
465
595
  // 重置时间
466
596
  async onReset() {
467
- this.setData({isRset: true});
468
597
  this.bindChange();
469
598
  },
599
+ // 关闭选择器
600
+ async onClose() {
601
+ this.onReset();
602
+ this.setData({ show: false });
603
+ },
470
604
  // 确认选择时间
471
605
  onConfirm() {
472
- const { data: { filtType, dateValue, startDateValue, endDateValue } } = this;
473
- let checkedDate;
474
- if (filtType === 'date') {
606
+ const {
607
+ data: { filtType, dateValue, dateStr, startDateValue, endDateValue },
608
+ } = this;
609
+ let pickerDate;
610
+ if (filtType === "date") {
475
611
  // 如果按年月日筛选
476
- checkedDate = `${dateValue} 00:00:00`;
477
- } else if (filtType === 'yearMonth') {
612
+ pickerDate = `${dateValue} 00:00:00`;
613
+ } else if (filtType === "yearMonth") {
478
614
  // 如果按年月筛选
479
- checkedDate = dateValue;
615
+ pickerDate = dateValue;
480
616
  } else {
481
617
  if (!endDateValue) {
482
618
  wx.showToast({
483
- title: '请选择结束时间',
484
- icon: 'none'
485
- })
619
+ title: "请选择结束时间",
620
+ icon: "none",
621
+ });
486
622
  return;
487
623
  }
488
624
  if (new Date(startDateValue) > new Date(endDateValue)) {
489
625
  wx.showToast({
490
- title: '开始时间不能大于结束时间',
491
- icon: 'none'
492
- })
626
+ title: "开始时间不能大于结束时间",
627
+ icon: "none",
628
+ });
493
629
  return;
494
630
  }
495
- checkedDate = [`${startDateValue} 00:00:00`, `${endDateValue} 23:59:59`];
631
+ pickerDate = [`${startDateValue} 00:00:00`, `${endDateValue} 23:59:59`];
496
632
  }
497
- console.log('checkedDate:', checkedDate);
498
- this.setData({show: false});
499
- this.triggerEvent('getDateValue', checkedDate)
633
+ this.setData({ show: false });
634
+ this.triggerEvent("getDateValue", {
635
+ pickerDate,
636
+ pickerDateText: dateStr,
637
+ });
500
638
  },
501
639
  },
502
640
  });
@@ -31,7 +31,9 @@
31
31
  indicator-style="{{indicatorSyle}}"
32
32
  immediate-change="{{true}}"
33
33
  mask-class="picker-mask"
34
- bindchange="bindChange">
34
+ bindchange="bindChange"
35
+ bindpickstart="bindPickstart"
36
+ bindpickend="bindPickend">
35
37
  <picker-view-column>
36
38
  <view wx:for="{{years}}" wx:key="index" class="picker-item {{dateArr[0] === index ? 'picker-select' : ''}}">
37
39
  {{item}}年
@@ -51,7 +53,7 @@
51
53
  <!-- 按钮组 -->
52
54
  <view class="btns-group">
53
55
  <xt-button catchtap="onReset" class="btn-reset">{{cancelButtonText}}</xt-button>
54
- <xt-button catchtap="onConfirm" type="main" class="btn-confirm">{{confirmButtonText}}</xt-button>
56
+ <xt-button catchtap="onConfirm" disabled="{{btnDisabled}}" type="main" class="btn-confirm">{{confirmButtonText}}</xt-button>
55
57
  </view>
56
58
  </view>
57
59
  </view>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xtdev/xt-miniprogram-ui",
3
- "version": "1.2.41",
3
+ "version": "1.2.43",
4
4
  "description": "",
5
5
  "miniprogram": "libs",
6
6
  "publishConfig": {