date-picker.vue 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. <script setup lang="ts">
  2. import { ref, watch } from "vue";
  3. import { useRenderIcon } from "@/components/ReIcon/src/hooks";
  4. defineOptions({
  5. name: "DatePicker"
  6. });
  7. const size = ref("default");
  8. const dynamicSize = ref();
  9. const value = ref("");
  10. const shortcuts = [
  11. {
  12. text: "今天",
  13. value: new Date()
  14. },
  15. {
  16. text: "昨天",
  17. value: () => {
  18. const date = new Date();
  19. date.setTime(date.getTime() - 3600 * 1000 * 24);
  20. return date;
  21. }
  22. },
  23. {
  24. text: "一周前",
  25. value: () => {
  26. const date = new Date();
  27. date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
  28. return date;
  29. }
  30. }
  31. ];
  32. const disabledDate = (time: Date) => {
  33. return time.getTime() > Date.now();
  34. };
  35. const value1 = ref("");
  36. const value2 = ref("");
  37. const value3 = ref("");
  38. const value4 = ref("");
  39. const value5 = ref("");
  40. const shortcuts1 = [
  41. {
  42. text: "上周",
  43. value: () => {
  44. const end = new Date();
  45. const start = new Date();
  46. start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
  47. return [start, end];
  48. }
  49. },
  50. {
  51. text: "上个月",
  52. value: () => {
  53. const end = new Date();
  54. const start = new Date();
  55. start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
  56. return [start, end];
  57. }
  58. },
  59. {
  60. text: "三个月前",
  61. value: () => {
  62. const end = new Date();
  63. const start = new Date();
  64. start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
  65. return [start, end];
  66. }
  67. }
  68. ];
  69. const value6 = ref("");
  70. const shortcuts2 = [
  71. {
  72. text: "本月",
  73. value: [new Date(), new Date()]
  74. },
  75. {
  76. text: "今年",
  77. value: () => {
  78. const end = new Date();
  79. const start = new Date(new Date().getFullYear(), 0);
  80. return [start, end];
  81. }
  82. },
  83. {
  84. text: "六个月前",
  85. value: () => {
  86. const end = new Date();
  87. const start = new Date();
  88. start.setMonth(start.getMonth() - 6);
  89. return [start, end];
  90. }
  91. }
  92. ];
  93. const value7 = ref("");
  94. const dateFormat = ref("");
  95. const value8 = ref("");
  96. const value9 = ref("2023-10-30");
  97. const holidays = [
  98. "2023-10-22",
  99. "2023-10-23",
  100. "2023-10-24",
  101. "2023-10-25",
  102. "2023-10-26",
  103. "2023-10-27",
  104. "2023-10-28",
  105. "2023-10-29",
  106. "2023-10-30",
  107. "2023-10-31"
  108. ];
  109. const isHoliday = ({ dayjs }) => {
  110. return holidays.includes(dayjs.format("YYYY-MM-DD"));
  111. };
  112. watch(size, val =>
  113. val === "disabled"
  114. ? (dynamicSize.value = "default")
  115. : (dynamicSize.value = size.value)
  116. );
  117. </script>
  118. <template>
  119. <el-card shadow="never">
  120. <template #header>
  121. <div class="card-header">
  122. <el-space wrap :size="40">
  123. <el-link
  124. v-tippy="{
  125. content: '点击查看详细文档'
  126. }"
  127. href="https://element-plus.org/zh-CN/component/date-picker.html"
  128. target="_blank"
  129. style="font-size: 16px; font-weight: 800"
  130. >
  131. 日期选择器
  132. </el-link>
  133. <el-radio-group v-model="size">
  134. <el-radio value="large">大尺寸</el-radio>
  135. <el-radio value="default">默认尺寸</el-radio>
  136. <el-radio value="small">小尺寸</el-radio>
  137. <el-radio value="disabled">禁用</el-radio>
  138. </el-radio-group>
  139. </el-space>
  140. </div>
  141. <el-link
  142. class="mt-2"
  143. href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/components/date-picker.vue"
  144. target="_blank"
  145. >
  146. 代码位置 src/views/components/date-picker.vue
  147. </el-link>
  148. </template>
  149. <div class="mb-2">选择某一天</div>
  150. <el-date-picker
  151. v-model="value"
  152. type="date"
  153. class="w-[160px]!"
  154. placeholder="请选择"
  155. :disabled-date="disabledDate"
  156. :shortcuts="shortcuts"
  157. :popper-options="{
  158. placement: 'bottom-start'
  159. }"
  160. :size="dynamicSize"
  161. :disabled="size === 'disabled'"
  162. />
  163. <div class="mb-2 mt-4">选择周、月、年或多个日期</div>
  164. <el-space wrap>
  165. <el-date-picker
  166. v-model="value1"
  167. type="week"
  168. class="w-[160px]!"
  169. format="YYYY年第ww周"
  170. placeholder="选择某年中的某周"
  171. :size="dynamicSize"
  172. :disabled="size === 'disabled'"
  173. />
  174. <el-date-picker
  175. v-model="value2"
  176. type="month"
  177. class="w-[160px]!"
  178. placeholder="选择某月"
  179. :size="dynamicSize"
  180. :disabled="size === 'disabled'"
  181. />
  182. <el-date-picker
  183. v-model="value3"
  184. type="year"
  185. class="w-[160px]!"
  186. placeholder="选择某年"
  187. :size="dynamicSize"
  188. :disabled="size === 'disabled'"
  189. />
  190. <el-date-picker
  191. v-model="value4"
  192. type="dates"
  193. class="w-[160px]!"
  194. placeholder="选择多个日期"
  195. :size="dynamicSize"
  196. :disabled="size === 'disabled'"
  197. />
  198. </el-space>
  199. <div class="mb-2 mt-4">选择一段时间</div>
  200. <el-date-picker
  201. v-model="value5"
  202. type="daterange"
  203. class="w-[240px]!"
  204. unlink-panels
  205. range-separator="至"
  206. start-placeholder="开始时间"
  207. end-placeholder="结束时间"
  208. :shortcuts="shortcuts1"
  209. :popper-options="{
  210. placement: 'bottom-start' // 下拉面板出现的位置,或 'top-start'、'bottom-end'、'top-end' 等,具体看 https://popper.js.org/docs/v2/constructors/#options
  211. }"
  212. :size="dynamicSize"
  213. :disabled="size === 'disabled'"
  214. />
  215. <div class="mb-2 mt-4">选择月份范围</div>
  216. <el-date-picker
  217. v-model="value6"
  218. type="monthrange"
  219. unlink-panels
  220. range-separator="至"
  221. start-placeholder="开始月份"
  222. end-placeholder="结束月份"
  223. :shortcuts="shortcuts2"
  224. :popper-options="{
  225. placement: 'bottom-start'
  226. }"
  227. :size="dynamicSize"
  228. :disabled="size === 'disabled'"
  229. />
  230. <div class="mb-2 mt-4">日期格式</div>
  231. <el-radio-group
  232. v-model="dateFormat"
  233. class="mb-2"
  234. :disabled="size === 'disabled'"
  235. @change="value7 = ''"
  236. >
  237. <el-radio value="">Date</el-radio>
  238. <el-radio value="YYYY-MM-DD">年月日</el-radio>
  239. <el-radio value="x">时间戳</el-radio>
  240. </el-radio-group>
  241. <br />
  242. <el-space wrap>
  243. <el-date-picker
  244. v-model="value7"
  245. type="date"
  246. class="w-[160px]!"
  247. placeholder="请选择日期"
  248. format="YYYY/MM/DD"
  249. :value-format="dateFormat"
  250. :size="dynamicSize"
  251. :disabled="size === 'disabled'"
  252. />
  253. <span class="ml-2">{{ value7 }}</span>
  254. </el-space>
  255. <div class="mb-2 mt-4">自定义前缀</div>
  256. <el-date-picker
  257. v-model="value8"
  258. type="date"
  259. class="w-[160px]!"
  260. placeholder="请选择日期"
  261. :prefix-icon="useRenderIcon('twemoji:spiral-calendar')"
  262. :size="dynamicSize"
  263. :disabled="size === 'disabled'"
  264. />
  265. <div class="mb-2 mt-4">自定义内容</div>
  266. <el-date-picker
  267. v-model="value9"
  268. type="date"
  269. placeholder="请选择日期"
  270. format="YYYY/MM/DD"
  271. value-format="YYYY-MM-DD"
  272. :size="dynamicSize"
  273. :disabled="size === 'disabled'"
  274. >
  275. <template #default="cell">
  276. <div class="cell" :class="{ current: cell.isCurrent }">
  277. <span class="text">{{ cell.text }}</span>
  278. <span v-if="isHoliday(cell)" class="holiday" />
  279. </div>
  280. </template>
  281. </el-date-picker>
  282. </el-card>
  283. </template>
  284. <style scoped>
  285. .cell {
  286. box-sizing: border-box;
  287. height: 30px;
  288. padding: 3px 0;
  289. }
  290. .cell .text {
  291. position: absolute;
  292. left: 50%;
  293. display: block;
  294. width: 24px;
  295. height: 24px;
  296. margin: 0 auto;
  297. line-height: 24px;
  298. border-radius: 50%;
  299. transform: translateX(-50%);
  300. }
  301. .cell.current .text {
  302. color: #fff;
  303. background: #626aef;
  304. }
  305. .cell .holiday {
  306. position: absolute;
  307. bottom: 0;
  308. left: 50%;
  309. width: 6px;
  310. height: 6px;
  311. background: var(--el-color-danger);
  312. border-radius: 50%;
  313. transform: translateX(-50%);
  314. }
  315. </style>