DateSelect.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. <!-- 日期搜索框 -->
  2. <template>
  3. <div id="myDate">
  4. <!-- :popper-append-to-body="false" -->
  5. <!-- <el-button icon="el-icon-caret-left" @click="dateChange(4)"></el-button> -->
  6. <el-select :popper-append-to-body="true" v-model="yearsModel" @change="dateChange(1)" placeholder="请选择"
  7. style="width: 100px">
  8. <el-option v-for="item in years" :key="item.value" :label="item.label" :value="item.value">
  9. </el-option>
  10. </el-select>
  11. <el-select :popper-append-to-body="true" v-model="monthsModel" @change="dateChange(2)" placeholder="请选择"
  12. style="width: 100px">
  13. <el-option v-for="item in months" :key="item.value" :label="item.label" :value="item.value">
  14. </el-option>
  15. </el-select>
  16. <el-select :popper-append-to-body="true" v-model="daysModel" @change="dateChange(3)" placeholder="请选择"
  17. style="width: 100px">
  18. <el-option v-for="item in days" :key="item.value" :label="item.label" :value="item.value">
  19. </el-option>
  20. </el-select>
  21. <!-- <el-button icon="el-icon-caret-right" @click="dateChange(5)"></el-button> -->
  22. </div>
  23. </template>
  24. <script>
  25. import autofit from 'autofit.js'
  26. export default {
  27. name: "DateSelect",
  28. props: ["yearsModelPrants"],
  29. data() {
  30. return {
  31. yearsModel: null,
  32. years: [],
  33. monthsModel: null,
  34. months: [],
  35. daysModel: null,
  36. days: [],
  37. nowYear: null,
  38. nowMonth: null,
  39. nowDay: null,
  40. };
  41. },
  42. created() {
  43. this.init();
  44. // try {
  45. // // this.yearsModel = this.yearsModelPrants.substring(0, 4);
  46. // // this.monthsModel = this.yearsModelPrants.substring(5, 7);
  47. // // this.daysModel = this.yearsModelPrants.substring(8, 10);
  48. // this.yearsModel = null;
  49. // this.monthsModel = null;
  50. // this.daysModel = null;
  51. // } catch (error) {
  52. // this.yearsModelPrants = "";
  53. // }
  54. },
  55. mounted() {
  56. autofit.init({
  57. ignore: [
  58. {
  59. // dom: "#myDate", //必填
  60. // height: 300,//可选,写数字即可(px)
  61. // width: 300,//可选,写数字即可(px)
  62. // scale: 1.2, //可选:回放程度,基于主元素缩放后的大小
  63. // fontSize: 26 //可选,如果自定义缩放后文字大小不合适,可以在这里设置文字大小
  64. },]
  65. })
  66. if (this.yearsModelPrants && this.yearsModelPrants != '') {
  67. this.yearsModel = Number(this.yearsModelPrants.split("-")[0]);
  68. this.monthsModel = this.yearsModelPrants.split("-")[1];
  69. this.daysModel = this.yearsModelPrants.split("-")[2];
  70. }
  71. // else {
  72. // this.yearsModelPrants = "";
  73. // this.yearsModel = null;
  74. // this.monthsModel = null;
  75. // this.daysModel = null;
  76. // }
  77. },
  78. methods: {
  79. setDateNull() {
  80. this.yearsModel = null;
  81. this.monthsModel = null;
  82. this.daysModel = null;
  83. },
  84. init() {
  85. var myDate = new Date();
  86. var year = myDate.getFullYear(); //获取当前年
  87. var month = myDate.getMonth() + 1; //获取当前月
  88. var day = myDate.getDate(); //获取当前日
  89. this.nowYear = myDate.getFullYear(); //获取当前年
  90. this.nowMonth = myDate.getMonth() + 1; //获取当前月
  91. this.nowDay = myDate.getDate(); //获取当前日
  92. this.initSelectYear(year);
  93. this.initSelectMonth();
  94. this.initSelectDay(year, month);
  95. // this.yearsModel = this.yearsModelPrants || year;
  96. // this.monthsModel = month < 10 ? `0${month}` : month;
  97. // this.daysModel = day < 10 ? `0${day}` : day;
  98. // let obj = {
  99. // year: this.yearsModel,
  100. // month: this.monthsModel,
  101. // day: this.daysModel,
  102. // };
  103. //this.$emit("dateChange", obj);
  104. },
  105. initSelectYear(year) {
  106. this.years = [];
  107. for (let i = 0; i < 100; i++) {
  108. this.years.push({ value: year - i, label: year - i + "年" });
  109. }
  110. },
  111. initSelectMonth() {
  112. this.months = [];
  113. // this.months.push({ value: 0, label: "全部" });
  114. let m = "";
  115. // for (let i = 1; i <= 12; i++) {
  116. // m = i < 10 ? `0${i}` : i;
  117. // this.months.push({ value: m, label: m + "月" });
  118. // }
  119. if (this.yearsModel == this.nowYear) {
  120. for (let i = 1; i <= this.nowMonth; i++) {
  121. m = i < 10 ? `0${i}` : `${i}`;
  122. this.months.push({ value: m, label: m + "月" });
  123. }
  124. } else {
  125. for (let i = 1; i <= 12; i++) {
  126. m = i < 10 ? `0${i}` : `${i}`;
  127. this.months.push({ value: m, label: m + "月" });
  128. }
  129. }
  130. },
  131. initSelectDay(year, month) {
  132. var maxDay = this.getMaxDay(year, month);
  133. this.days = [];
  134. // this.days.push({ value: 0, label: "全部" });
  135. let d = "";
  136. // for (var i = 1; i <= maxDay; i++) {
  137. // d = i < 10 ? `0${i}` : i;
  138. // this.days.push({ value: d, label: d + "日" });
  139. // }
  140. if (this.yearsModel == this.nowYear && this.monthsModel == this.nowMonth) {
  141. for (var i = 1; i <= this.nowDay; i++) {
  142. d = i < 10 ? `0${i}` : `${i}`;
  143. this.days.push({ value: d, label: d + "日" });
  144. }
  145. } else {
  146. for (var i = 1; i <= maxDay; i++) {
  147. d = i < 10 ? `0${i}` : `${i}`;
  148. this.days.push({ value: d, label: d + "日" });
  149. }
  150. }
  151. },
  152. dateChange(type) {
  153. console.log(':popper-append-to-body="false"');
  154. //1年 2月 3日 4 左 5右
  155. // if (type == 1 || type == 2) {
  156. // if (this.monthsModel == 0) {
  157. // this.daysModel = 0;
  158. // this.initSelectDay(this.yearsModel, 1);
  159. // } else {
  160. // this.initSelectDay(this.yearsModel, this.monthsModel);
  161. // }
  162. // }
  163. if (type == 1) {
  164. if (this.monthsModel == 0) {
  165. this.daysModel = 0;
  166. this.initSelectMonth();
  167. this.initSelectDay(this.yearsModel, 1);
  168. } else {
  169. if (this.yearsModel == this.nowYear) {
  170. this.monthsModel = null;
  171. this.daysModel = null;
  172. this.initSelectMonth();
  173. this.initSelectDay(this.yearsModel, 1);
  174. } else {
  175. this.initSelectMonth();
  176. this.initSelectDay(this.yearsModel, this.monthsModel);
  177. }
  178. }
  179. }
  180. if (type == 2) {
  181. if (this.monthsModel == 0) {
  182. this.daysModel = 0;
  183. this.initSelectDay(this.yearsModel, 1);
  184. } else {
  185. if (this.yearsModel == this.nowYear && this.monthsModel == this.nowMonth) {
  186. this.daysModel = null;
  187. this.initSelectDay(this.yearsModel, 1);
  188. } else {
  189. this.initSelectDay(this.yearsModel, this.monthsModel);
  190. }
  191. }
  192. }
  193. if (type == 4) {
  194. this.dayleft();
  195. }
  196. if (type == 5) {
  197. this.dayright();
  198. }
  199. //操作父组件方法
  200. let obj = {
  201. year: this.yearsModel,
  202. month: this.monthsModel,
  203. day: this.daysModel,
  204. };
  205. this.$emit("dateChange", obj);
  206. },
  207. dayleft() {
  208. var tmpYear = this.yearsModel;
  209. var tmpMonth = this.monthsModel;
  210. var tmpDay = this.daysModel;
  211. if (tmpYear == null) {
  212. var myDate = new Date();
  213. var year = myDate.getFullYear(); //获取当前年
  214. var month = myDate.getMonth() + 1; //获取当前月
  215. var day = myDate.getDate(); //获取当前日
  216. this.yearsModel = year;
  217. this.monthsModel = month;
  218. this.daysModel = day;
  219. return;
  220. }
  221. if (tmpMonth == null) {
  222. tmpMonth = 0;
  223. }
  224. if (tmpDay == null) {
  225. tmpDay = 0;
  226. }
  227. var yearV = tmpYear;
  228. var monthV = tmpMonth;
  229. var dayV = tmpDay;
  230. if ((tmpMonth == 0 || tmpMonth == 1) && (tmpDay == 0 || tmpDay == 1)) {
  231. yearV = tmpYear - 1;
  232. monthV = 12;
  233. dayV = this.getMaxDay(tmpYear, tmpMonth);
  234. }
  235. if (!(tmpMonth == 0 || tmpMonth == 1) && (tmpDay == 0 || tmpDay == 1)) {
  236. monthV = tmpMonth - 1;
  237. dayV = this.getMaxDay(tmpYear, tmpMonth);
  238. }
  239. if ((tmpMonth == 0 || tmpMonth == 1) && !(tmpDay == 0 || tmpDay == 1)) {
  240. dayV = tmpDay - 1;
  241. }
  242. if (!(tmpMonth == 0 || tmpMonth == 1) && !(tmpDay == 0 || tmpDay == 1)) {
  243. dayV = tmpDay - 1;
  244. }
  245. this.yearsModel = yearV;
  246. this.monthsModel = monthV;
  247. this.daysModel = dayV;
  248. },
  249. dayright() {
  250. var myDate = new Date();
  251. var year = myDate.getFullYear(); //获取当前年
  252. var month = myDate.getMonth() + 1; //获取当前月
  253. var day = myDate.getDate(); //获取当前日
  254. var tmpYear = this.yearsModel;
  255. var tmpMonth = this.monthsModel;
  256. var tmpDay = this.daysModel;
  257. if (tmpYear == null) {
  258. var myDate = new Date();
  259. var year = myDate.getFullYear(); //获取当前年
  260. var month = myDate.getMonth() + 1; //获取当前月
  261. var day = myDate.getDate(); //获取当前日
  262. this.yearsModel = year;
  263. this.monthsModel = month;
  264. this.daysModel = day;
  265. return;
  266. }
  267. if (tmpMonth == null) {
  268. tmpMonth = 0;
  269. }
  270. if (tmpDay == null) {
  271. tmpDay = 0;
  272. }
  273. if (tmpYear > year) {
  274. this.yearsModel = year;
  275. this.monthsModel = month;
  276. this.daysModel = day;
  277. return;
  278. }
  279. if (tmpYear == year) {
  280. if (
  281. tmpMonth > month ||
  282. tmpMonth == 0 ||
  283. (tmpMonth == month && (tmpDay >= day || tmpDay == 0))
  284. ) {
  285. this.yearsModel = year;
  286. this.monthsModel = month;
  287. this.daysModel = day;
  288. return;
  289. }
  290. }
  291. var maxDay = this.getMaxDay(tmpYear, tmpMonth);
  292. var yearV = tmpYear;
  293. var monthV = tmpMonth;
  294. var dayV = tmpDay;
  295. if (
  296. (tmpMonth == 0 || tmpMonth == 12) &&
  297. (tmpDay == 0 || tmpDay == maxDay)
  298. ) {
  299. yearV = tmpYear + 1;
  300. monthV = 1;
  301. dayV = 1;
  302. }
  303. if (
  304. !(tmpMonth == 0 || tmpMonth == 12) &&
  305. (tmpDay == 0 || tmpDay == maxDay)
  306. ) {
  307. monthV = tmpMonth + 1;
  308. dayV = 1;
  309. }
  310. if (
  311. !(tmpMonth == 0 || tmpMonth == 12) &&
  312. !(tmpDay == 0 || tmpDay == maxDay)
  313. ) {
  314. dayV = tmpDay + 1;
  315. }
  316. this.yearsModel = yearV;
  317. this.monthsModel = monthV;
  318. this.daysModel = dayV;
  319. },
  320. getMaxDay(year, month) {
  321. var new_year = year; //取当前的年份
  322. var new_month = month++; //取下一个月的第一天,方便计算(最后一天不固定)
  323. if (month > 12) {
  324. //如果当前大于12月,则年份转到下一年
  325. new_month -= 12; //月份减
  326. new_year++; //年份增
  327. }
  328. var new_date = new Date(new_year, new_month, 1); //取当年当月中的第一天
  329. return new Date(new_date.getTime() - 1000 * 60 * 60 * 24).getDate(); //获取当月最后一天日期
  330. },
  331. },
  332. };
  333. </script>
  334. <style scoped="scoped">
  335. #myDate {
  336. display: flex;
  337. flex-direction: row;
  338. justify-content: start;
  339. }
  340. #myDate /deep/ .el-select {
  341. margin-left: 5px;
  342. }
  343. </style>