select-date.uvue 5.4 KB

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