select.uvue 6.6 KB

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