select-date.uvue 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. <template>
  2. <cl-page>
  3. <view class="p-3">
  4. <demo-item :label="t('基础用法')">
  5. <cl-select-date v-model="form.date1" type="date"></cl-select-date>
  6. </demo-item>
  7. <demo-item :label="t('固定开始、结束日期')">
  8. <cl-select-date
  9. v-model="form.date3"
  10. start="2025-06-01"
  11. end="2026-06-01"
  12. type="date"
  13. ></cl-select-date>
  14. </demo-item>
  15. <demo-item :label="t('自定义触发器')">
  16. <view class="flex flex-row">
  17. <cl-button @tap="openSelect4">{{ t("打开选择器") }}</cl-button>
  18. </view>
  19. <cl-select-date
  20. ref="selectRef4"
  21. v-model="form.date4"
  22. type="date"
  23. :show-trigger="false"
  24. ></cl-select-date>
  25. </demo-item>
  26. <demo-item :label="t('范围选择')">
  27. <cl-text :pt="{ className: 'mb-3' }">{{ form.date5 }}</cl-text>
  28. <cl-select-date v-model:values="form.date5" type="date" rangeable></cl-select-date>
  29. </demo-item>
  30. <demo-item :label="t('自定义快捷选项')">
  31. <cl-select-date
  32. v-model:values="form.date5"
  33. type="date"
  34. rangeable
  35. :shortcuts="shortcuts"
  36. ></cl-select-date>
  37. </demo-item>
  38. <demo-item :label="t('自定义')">
  39. <cl-select-date
  40. v-model="form.date6"
  41. :type="type"
  42. :label-format="labelFormat"
  43. :disabled="isDisabled"
  44. ></cl-select-date>
  45. <cl-list
  46. border
  47. :pt="{
  48. className: 'mt-3'
  49. }"
  50. >
  51. <cl-list-item label="YYYY">
  52. <cl-switch v-model="isYear"></cl-switch>
  53. </cl-list-item>
  54. <cl-list-item label="YYYY-MM">
  55. <cl-switch v-model="isMonth"></cl-switch>
  56. </cl-list-item>
  57. <cl-list-item
  58. label="YYYY-MM-DD"
  59. :pt="{
  60. label: {
  61. className: 'flex-[2]'
  62. }
  63. }"
  64. >
  65. <cl-switch v-model="isDate"></cl-switch>
  66. </cl-list-item>
  67. <cl-list-item
  68. label="YYYY-MM-DD HH"
  69. :pt="{
  70. label: {
  71. className: 'flex-[2]'
  72. }
  73. }"
  74. >
  75. <cl-switch v-model="isHour"></cl-switch>
  76. </cl-list-item>
  77. <cl-list-item
  78. label="YYYY-MM-DD HH:mm"
  79. :pt="{
  80. label: {
  81. className: 'flex-[2]'
  82. }
  83. }"
  84. >
  85. <cl-switch v-model="isMinute"></cl-switch>
  86. </cl-list-item>
  87. <cl-list-item
  88. label="YYYY-MM-DD HH:mm:ss"
  89. :pt="{
  90. label: {
  91. className: 'flex-[2]'
  92. }
  93. }"
  94. >
  95. <cl-switch v-model="isSecond"></cl-switch>
  96. </cl-list-item>
  97. <cl-list-item :label="t('标签格式化')">
  98. <cl-switch v-model="isFormat"></cl-switch>
  99. </cl-list-item>
  100. <cl-list-item :label="t('禁用')">
  101. <cl-switch v-model="isDisabled"></cl-switch>
  102. </cl-list-item>
  103. </cl-list>
  104. </demo-item>
  105. </view>
  106. </cl-page>
  107. </template>
  108. <script lang="ts" setup>
  109. import { computed, reactive, ref } from "vue";
  110. import DemoItem from "../components/item.uvue";
  111. import { t } from "@/locale";
  112. import { useUi, type ClSelectDateShortcut } from "@/uni_modules/cool-ui";
  113. import { dayUts } from "@/cool";
  114. const ui = useUi();
  115. type Form = {
  116. date1: string;
  117. date2: string;
  118. date3: string;
  119. date4: string;
  120. date5: string[];
  121. date6: string;
  122. };
  123. const form = reactive<Form>({
  124. date1: "",
  125. date2: "",
  126. date3: "",
  127. date4: "",
  128. date5: [],
  129. date6: ""
  130. });
  131. const isDisabled = ref(false);
  132. const isYear = ref(false);
  133. const isMonth = ref(false);
  134. const isDate = ref(true);
  135. const isHour = ref(false);
  136. const isMinute = ref(false);
  137. const isSecond = ref(false);
  138. const isFormat = ref(false);
  139. const type = computed(() => {
  140. if (isSecond.value) {
  141. return "second";
  142. }
  143. if (isMinute.value) {
  144. return "minute";
  145. }
  146. if (isHour.value) {
  147. return "hour";
  148. }
  149. if (isDate.value) {
  150. return "date";
  151. }
  152. if (isMonth.value) {
  153. return "month";
  154. }
  155. if (isYear.value) {
  156. return "year";
  157. }
  158. return "second";
  159. });
  160. const labelFormat = computed(() => {
  161. if (isFormat.value) {
  162. if (isSecond.value) {
  163. return "YYYY年MM月DD日 HH时mm分ss秒";
  164. }
  165. if (isMinute.value) {
  166. return "YYYY年MM月DD日 HH时mm分";
  167. }
  168. if (isHour.value) {
  169. return "YYYY年MM月DD日 HH时";
  170. }
  171. if (isDate.value) {
  172. return "YYYY年MM月DD日";
  173. }
  174. if (isMonth.value) {
  175. return "YYYY年MM月";
  176. }
  177. if (isYear.value) {
  178. return "YYYY年";
  179. }
  180. } else {
  181. if (isSecond.value) {
  182. return "YYYY-MM-DD HH:mm:ss";
  183. }
  184. if (isMinute.value) {
  185. return "YYYY-MM-DD HH:mm";
  186. }
  187. if (isHour.value) {
  188. return "YYYY-MM-DD HH";
  189. }
  190. if (isDate.value) {
  191. return "YYYY-MM-DD";
  192. }
  193. if (isMonth.value) {
  194. return "YYYY-MM";
  195. }
  196. if (isYear.value) {
  197. return "YYYY";
  198. }
  199. }
  200. return "YYYY-MM-DD HH:mm:ss";
  201. });
  202. const selectRef4 = ref<ClSelectDateComponentPublicInstance | null>(null);
  203. function openSelect4() {
  204. selectRef4.value!.open((value) => {
  205. ui.showToast({
  206. message: `你选择了:${value}`
  207. });
  208. });
  209. }
  210. const shortcuts = ref<ClSelectDateShortcut[]>([
  211. {
  212. label: "昨日",
  213. value: [dayUts().subtract(1, "day").format("YYYY-MM-DD"), dayUts().format("YYYY-MM-DD")]
  214. },
  215. {
  216. label: "本周",
  217. value: [
  218. dayUts().startOf("week").format("YYYY-MM-DD"),
  219. dayUts().endOf("week").format("YYYY-MM-DD")
  220. ]
  221. },
  222. {
  223. label: "本月",
  224. value: [
  225. dayUts().startOf("month").format("YYYY-MM-DD"),
  226. dayUts().endOf("month").format("YYYY-MM-DD")
  227. ]
  228. }
  229. ]);
  230. </script>