select.uvue 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. <template>
  2. <cl-page>
  3. <view class="p-3">
  4. <demo-item :label="t('基础用法')">
  5. <cl-select v-model="form.selected" :options="options"></cl-select>
  6. </demo-item>
  7. <demo-item :label="t('自定义触发器')">
  8. <view class="flex flex-row">
  9. <cl-button @tap="openSelect2">{{ t("打开选择器") }}</cl-button>
  10. </view>
  11. <cl-select
  12. ref="selectRef2"
  13. v-model="form.selected2"
  14. :options="options2"
  15. :show-trigger="false"
  16. ></cl-select>
  17. </demo-item>
  18. <demo-item :label="t('多列')">
  19. <demo-tips>
  20. {{ t("通过 children 配置多级数据,并使用 column-count 参数指定显示的列数") }}
  21. </demo-tips>
  22. <cl-select
  23. v-model="form.selected3"
  24. :options="options3"
  25. :column-count="3"
  26. ></cl-select>
  27. </demo-item>
  28. <demo-item :label="t('弹窗中使用')">
  29. <cl-button @tap="visible3 = true">{{ t("打开") }}</cl-button>
  30. <cl-popup v-model="visible3" direction="center" size="80%" :title="t('选择地区')">
  31. <view class="p-3 pt-0">
  32. <demo-tips>
  33. H5 和 APP 端通过 teleport 实现弹窗内的选择器使用,小程序端则通过
  34. root-portal 实现。
  35. </demo-tips>
  36. <cl-select
  37. v-model="form.selected3"
  38. :options="options3"
  39. :column-count="3"
  40. ></cl-select>
  41. </view>
  42. </cl-popup>
  43. </demo-item>
  44. <demo-item :label="t('自定义')">
  45. <cl-text
  46. :pt="{
  47. className: 'mb-3 text-sm p-3 bg-surface-100 dark:!bg-surface-700 rounded-lg'
  48. }"
  49. v-if="form.selected4 != null && isShowValue"
  50. >
  51. {{ t("绑定值") }}:{{ form.selected4 }}
  52. </cl-text>
  53. <cl-select
  54. v-model="form.selected4"
  55. :options="options"
  56. :disabled="isDisabled"
  57. :show-cancel="isShowCancel"
  58. :confirm-text="isButtonText ? t('下一步') : t('确定')"
  59. :cancel-text="isButtonText ? t('关闭') : t('取消')"
  60. ></cl-select>
  61. <cl-list
  62. border
  63. :pt="{
  64. className: 'mt-3'
  65. }"
  66. >
  67. <cl-list-item :label="t('显示取消按钮')">
  68. <cl-switch v-model="isShowCancel"></cl-switch>
  69. </cl-list-item>
  70. <cl-list-item :label="t('修改按钮文案')">
  71. <cl-switch v-model="isButtonText"></cl-switch>
  72. </cl-list-item>
  73. <cl-list-item :label="t('禁用')">
  74. <cl-switch v-model="isDisabled"></cl-switch>
  75. </cl-list-item>
  76. <cl-list-item :label="t('显示绑定值')">
  77. <cl-switch v-model="isShowValue"></cl-switch>
  78. </cl-list-item>
  79. </cl-list>
  80. </demo-item>
  81. <demo-item :label="t('空数据')">
  82. <cl-select v-model="form.selected" :options="options4"></cl-select>
  83. </demo-item>
  84. </view>
  85. </cl-page>
  86. </template>
  87. <script lang="ts" setup>
  88. import { reactive, ref } from "vue";
  89. import DemoItem from "../components/item.uvue";
  90. import DemoTips from "../components/tips.uvue";
  91. import { useUi, type ClSelectOption } from "@/uni_modules/cool-ui";
  92. import { t } from "@/locale";
  93. const ui = useUi();
  94. const selectRef2 = ref<ClSelectComponentPublicInstance | null>(null);
  95. const isShowCancel = ref(true);
  96. const isButtonText = ref(false);
  97. const isDisabled = ref(false);
  98. const isShowValue = ref(false);
  99. type Form = {
  100. selected: number | null; // 参数 clear 需要指定类型带有 null
  101. selected2: string;
  102. selected3: number[];
  103. selected4: number | null;
  104. };
  105. const form = reactive<Form>({
  106. selected: null,
  107. selected2: "2",
  108. selected3: [],
  109. selected4: 3
  110. });
  111. const options = ref<ClSelectOption[]>([
  112. {
  113. label: "HTML",
  114. value: 1
  115. },
  116. {
  117. label: "CSS",
  118. value: 2
  119. },
  120. {
  121. label: "JavaScript",
  122. value: 3
  123. },
  124. {
  125. label: "Node",
  126. value: 4
  127. },
  128. {
  129. label: "Vite",
  130. value: 5
  131. },
  132. {
  133. label: "Webpack",
  134. value: 6
  135. }
  136. ]);
  137. const options2 = ref<ClSelectOption[]>([
  138. {
  139. label: "Vue",
  140. value: "1"
  141. },
  142. {
  143. label: "React",
  144. value: "2"
  145. },
  146. {
  147. label: "Angular",
  148. value: "3"
  149. },
  150. {
  151. label: "Svelte",
  152. value: "4"
  153. }
  154. ]);
  155. const options3 = ref<ClSelectOption[]>([
  156. {
  157. label: "福建省",
  158. value: 1,
  159. children: [
  160. {
  161. label: "福州市",
  162. value: 1,
  163. children: [
  164. {
  165. label: "鼓楼区",
  166. value: 1
  167. },
  168. {
  169. label: "台江区",
  170. value: 2
  171. },
  172. {
  173. label: "仓山区",
  174. value: 3
  175. },
  176. {
  177. label: "马尾区",
  178. value: 4
  179. }
  180. ]
  181. },
  182. {
  183. label: "厦门市",
  184. value: 2,
  185. children: [
  186. {
  187. label: "思明区",
  188. value: 1
  189. },
  190. {
  191. label: "湖里区",
  192. value: 2
  193. },
  194. {
  195. label: "集美区",
  196. value: 3
  197. },
  198. {
  199. label: "海沧区",
  200. value: 4
  201. }
  202. ]
  203. },
  204. {
  205. label: "泉州市",
  206. value: 3,
  207. children: [
  208. {
  209. label: "鲤城区",
  210. value: 1
  211. },
  212. {
  213. label: "丰泽区",
  214. value: 2
  215. },
  216. {
  217. label: "洛江区",
  218. value: 3
  219. },
  220. {
  221. label: "泉港区",
  222. value: 4
  223. }
  224. ]
  225. }
  226. ]
  227. },
  228. {
  229. label: "浙江省",
  230. value: 2,
  231. children: [
  232. {
  233. label: "杭州市",
  234. value: 1,
  235. children: [
  236. {
  237. label: "上城区",
  238. value: 1
  239. },
  240. {
  241. label: "下城区",
  242. value: 2
  243. },
  244. {
  245. label: "江干区",
  246. value: 3
  247. },
  248. {
  249. label: "拱墅区",
  250. value: 4
  251. }
  252. ]
  253. },
  254. {
  255. label: "宁波市",
  256. value: 2,
  257. children: [
  258. {
  259. label: "海曙区",
  260. value: 1
  261. },
  262. {
  263. label: "江北区",
  264. value: 2
  265. },
  266. {
  267. label: "北仑区",
  268. value: 3
  269. }
  270. ]
  271. }
  272. ]
  273. },
  274. {
  275. label: "湖南省",
  276. value: 3,
  277. children: [
  278. {
  279. label: "长沙市",
  280. value: 1,
  281. children: [
  282. {
  283. label: "芙蓉区",
  284. value: 1
  285. },
  286. {
  287. label: "天心区",
  288. value: 2
  289. },
  290. {
  291. label: "岳麓区",
  292. value: 3
  293. }
  294. ]
  295. },
  296. {
  297. label: "株洲市",
  298. value: 2,
  299. children: [
  300. {
  301. label: "荷塘区",
  302. value: 1
  303. },
  304. {
  305. label: "芦淞区",
  306. value: 2
  307. }
  308. ]
  309. }
  310. ]
  311. },
  312. {
  313. label: "江西省",
  314. value: 4,
  315. children: [
  316. {
  317. label: "南昌市",
  318. value: 1,
  319. children: [
  320. {
  321. label: "东湖区",
  322. value: 1
  323. },
  324. {
  325. label: "西湖区",
  326. value: 2
  327. },
  328. {
  329. label: "青云谱区",
  330. value: 3
  331. }
  332. ]
  333. },
  334. {
  335. label: "九江市",
  336. value: 2,
  337. children: [
  338. {
  339. label: "浔阳区",
  340. value: 1
  341. },
  342. {
  343. label: "濂溪区",
  344. value: 2
  345. }
  346. ]
  347. }
  348. ]
  349. }
  350. ]);
  351. const options4 = ref<ClSelectOption[]>([]);
  352. function openSelect2() {
  353. selectRef2.value!.open((value) => {
  354. const d = options2.value.find((item) => item.value == value);
  355. ui.showToast({
  356. message: `你选择了 ${value} : ${d?.label}`
  357. });
  358. });
  359. }
  360. const visible3 = ref(false);
  361. </script>