select.uvue 6.4 KB

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