hookehuyr

✨ feat: 新增日期时间选择控件

...@@ -47,8 +47,8 @@ const handleGetPatterns = (keyArr) => { ...@@ -47,8 +47,8 @@ const handleGetPatterns = (keyArr) => {
47 }; 47 };
48 48
49 const config = { 49 const config = {
50 - projectName: 'tswj-weapp', 50 + projectName: 'swx-weapp',
51 - date: '2022-5-27', 51 + date: '2022-10-01',
52 designWidth: 750, 52 designWidth: 750,
53 deviceRatio: { 53 deviceRatio: {
54 640: 2.34 / 2, 54 640: 2.34 / 2,
...@@ -58,6 +58,7 @@ const config = { ...@@ -58,6 +58,7 @@ const config = {
58 alias: { 58 alias: {
59 "@/utils": path.resolve(__dirname, "../src/utils"), 59 "@/utils": path.resolve(__dirname, "../src/utils"),
60 "@/vant": path.resolve(__dirname, "../src/components/vant-weapp"), 60 "@/vant": path.resolve(__dirname, "../src/components/vant-weapp"),
61 + "@/components": path.resolve(__dirname, "../src/components"),
61 }, 62 },
62 sourceRoot: 'src', 63 sourceRoot: 'src',
63 outputRoot: 'dist', 64 outputRoot: 'dist',
......
1 +/*
2 + * @Date: 2022-09-19 16:54:23
3 + * @LastEditors: hookehuyr hookehuyr@gmail.com
4 + * @LastEditTime: 2022-09-19 16:54:59
5 + * @FilePath: /swx/src/components/time-picker-data/dateTimePicker.js
6 + * @Description: 文件描述
7 + */
8 +var getDaysInOneMonth = function (year, month) {
9 + let _month = parseInt(month, 10);
10 + let d = new Date(year, _month, 0);
11 + return d.getDate();
12 +}
13 +var dateDate = function (date) {
14 + let year = date.getFullYear();
15 + let month = date.getMonth() + 1;
16 + let day = date.getDate();
17 + let hours = date.getHours();
18 + let minutes = date.getMinutes();
19 + return {
20 + year, month, day, hours, minutes
21 + }
22 +}
23 +var dateTimePicker = function (startyear, endyear) {
24 + // 获取date time 年份,月份,天数,小时,分钟推后30分
25 + const years = [];
26 + for (let i = startyear; i <= endyear; i++) {
27 + years.push({
28 + name: i + '年',
29 + id: i
30 + });
31 + }
32 + return function (_year, _month, _day, _hour, _minute) {
33 + const months = [];
34 + const days = [];
35 + const hours = [];
36 + const minutes = [];
37 + _year = parseInt(_year);
38 + _month = parseInt(_month);
39 + _day = parseInt(_day);
40 + _hour = parseInt(_hour);
41 + _minute = parseInt(_minute);
42 + //获取月份
43 + for (let i = _month; i <= 12; i++) {
44 + if (i < 10) {
45 + i = "0" + i;
46 + }
47 + months.push({
48 + name: i + '月',
49 + id: i
50 + });
51 + }
52 + //获取日期
53 + for (let i = _day; i <= getDaysInOneMonth(_year, _month); i++) {
54 + if (i < 10) {
55 + i = "0" + i;
56 + }
57 + days.push({
58 + name: i + '日',
59 + id: i
60 + });
61 + }
62 + //获取小时
63 + for (let i = _hour; i < 24; i++) {
64 + if (i < 10) {
65 + i = "0" + i;
66 + }
67 + hours.push({
68 + name: i + '时',
69 + id: i
70 + });
71 + }
72 + //获取分钟
73 + for (let i = _minute; i < 60; i++) {
74 + if (i < 10) {
75 + i = "0" + i;
76 + }
77 + minutes.push({
78 + name: i + '分',
79 + id: i
80 + });
81 + }
82 + return [years, months, days, hours, minutes];
83 + }
84 +}
85 +export {
86 + dateTimePicker,
87 + getDaysInOneMonth,
88 + dateDate
89 +}
1 +<template>
2 + <picker mode="multiSelector" :range-key="'name'" :value="timeIndex" :range="activityArray" :disabled="disabled"
3 + @change="bindMultiPickerChange" @columnChange="bindMultiPickerColumnChange">
4 + <slot />
5 + </picker>
6 +</template>
7 +<script>
8 +import { dateTimePicker, dateDate } from "./dateTimePicker.js";
9 +export default {
10 + props: {
11 + startTime: {
12 + type: [Object, Date],
13 + default: new Date(),
14 + },
15 + endTime: {
16 + type: [Object, Date],
17 + default: new Date(),
18 + },
19 + defaultTime: {
20 + type: [Object, Date],
21 + default: new Date(),
22 + },
23 + disabled: {
24 + type: Boolean,
25 + default: false,
26 + },
27 + },
28 + data() {
29 + return {
30 + timeIndex: [0, 0, 0, 0, 0],
31 + activityArray: [],
32 + year: 0,
33 + month: 1,
34 + day: 1,
35 + hour: 0,
36 + minute: 0,
37 + datePicker: "",
38 + };
39 + },
40 + computed: {
41 + timeDate() {
42 + const { startTime, endTime } = this;
43 + return { startTime, endTime };
44 + },
45 + },
46 + watch: {
47 + timeDate() {
48 + this.initData();
49 + },
50 + },
51 + created() {
52 + this.initData();
53 + },
54 + methods: {
55 + initData() {
56 + let startTime = this.startTime;
57 + let endTime = this.endTime;
58 + this.datePicker = dateTimePicker(
59 + startTime.getFullYear(),
60 + endTime.getFullYear()
61 + );
62 + this.setDateData(this.startTime);
63 + // 初始时间
64 + this.initTime();
65 + // 初始索引
66 + },
67 + initTime() {
68 + this.year = this.activityArray[0][0].id;
69 + this.month = this.activityArray[1][0].id;
70 + this.day = this.activityArray[2][0].id;
71 + this.hour = this.activityArray[3][0].id;
72 + this.minute = this.activityArray[4][0].id;
73 + },
74 + setDateData(_date) {
75 + let _data = dateDate(_date);
76 + this.activityArray = this.datePicker(
77 + _data.year,
78 + _data.month,
79 + _data.day,
80 + _data.hours,
81 + _data.minutes
82 + );
83 + // console.log(this.activityArray);
84 + },
85 + bindMultiPickerChange(e) {
86 + console.log("picker发送选择改变,携带值为", e.detail.value);
87 + let activityArray = JSON.parse(JSON.stringify(this.activityArray)),
88 + { value } = e.detail,
89 + _result = [];
90 + for (let i = 0; i < value.length; i++) {
91 + _result[i] = activityArray[i][value[i]].id;
92 + }
93 + this.$emit("result", _result);
94 + },
95 + bindMultiPickerColumnChange(e) {
96 + console.log("修改的列为", e.detail.column, ",值为", e.detail.value);
97 + let _data = JSON.parse(JSON.stringify(this.activityArray)),
98 + timeIndex = JSON.parse(JSON.stringify(this.timeIndex)),
99 + { column, value } = e.detail,
100 + _value = _data[column][value].id,
101 + _year = this.startTime.getFullYear(),
102 + _endYear = this.endTime.getFullYear(),
103 + _month = parseInt(this.startTime.getMonth() + 1),
104 + _day = parseInt(this.startTime.getDay()),
105 + _minute = parseInt(this.startTime.getMinutes());
106 + switch (e.detail.column) {
107 + case 0:
108 + this.year = _value;
109 + if (value === 0) {
110 + //选择第一年 注意初始时间
111 + this.setDateData(this.startTime);
112 + } else if (value === _data[0].length - 1) {
113 + // 选择最后一年设置截止时间
114 + this.setDateData(this.endTime);
115 + } else {
116 + this.activityArray = this.datePicker(_value, 1, 1, 0, 0);
117 + }
118 + timeIndex = [value, 0, 0, 0, 0];
119 + this.timeIndex = timeIndex;
120 + break;
121 + case 1:
122 + // 月份选择器 当年份为第一年和最后一年的时候需要注意
123 + this.month = _value;
124 + this.timeIndex = JSON.parse(
125 + JSON.stringify([timeIndex[0], value, 0, 0, 0])
126 + );
127 + if (this.year == _year && value === 0) {
128 + this.setDateData(this.startTime);
129 + } else if (this.year == _endYear && value === 0) {
130 + this.setDateData(this.endTime);
131 + } else {
132 + _data[2] = this.datePicker(this.year, this.month, 1, 0, 0)[2];
133 + _data[3] = this.datePicker(this.year, this.month, 1, 0, 0)[3];
134 + _data[4] = this.datePicker(this.year, this.month, 1, 0, 0)[4];
135 + this.activityArray = _data;
136 + }
137 + break;
138 + case 2:
139 + this.day = _value;
140 + this.timeIndex = JSON.parse(
141 + JSON.stringify([timeIndex[0], timeIndex[1], value, 0, 0])
142 + );
143 + if (this.year == _year && this.month == _month && value === 0) {
144 + this.setDateData(this.startTime);
145 + } else if (
146 + this.year == _endYear &&
147 + this.month == _month &&
148 + value === 0
149 + ) {
150 + this.setDateData(this.endTime);
151 + } else {
152 + _data[3] = this.datePicker(
153 + this.year,
154 + this.month,
155 + this.day,
156 + 0,
157 + 0
158 + )[3];
159 + _data[4] = this.datePicker(
160 + this.year,
161 + this.month,
162 + this.day,
163 + 0,
164 + 0
165 + )[4];
166 + this.activityArray = _data;
167 + }
168 + break;
169 + case 3:
170 + this.hour = _value;
171 + timeIndex[3] = value;
172 + timeIndex[4] = 0;
173 + this.timeIndex = timeIndex;
174 + if (
175 + this.year == _year &&
176 + this.month == _month &&
177 + this.day == _day &&
178 + value === 0
179 + ) {
180 + this.setDateData(this.startTime);
181 + } else if (
182 + this.year == _endYear &&
183 + this.month == _month &&
184 + this.day == _day &&
185 + value === 0
186 + ) {
187 + this.setDateData(this.endTime);
188 + } else {
189 + _data[4] = this.datePicker(
190 + this.year,
191 + this.month,
192 + this.day,
193 + this.hour,
194 + 0
195 + )[4];
196 + this.activityArray = _data;
197 + }
198 + break;
199 + case 4:
200 + timeIndex[4] = value;
201 + this.timeIndex = timeIndex;
202 + break;
203 + }
204 + },
205 + },
206 +};
207 +</script>