index.vue 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. <template>
  2. <div class="demo">
  3. <h2>基础用法</h2>
  4. <nut-cell
  5. title="请选择城市"
  6. :desc="index"
  7. @click="
  8. () => {
  9. show = true;
  10. }
  11. "
  12. ></nut-cell>
  13. <nut-picker
  14. v-model:visible="show"
  15. :columns="columns"
  16. title="城市选择"
  17. @change="change"
  18. @confirm="(options) => confirm('index', options)"
  19. ></nut-picker>
  20. <h2>默认选中项</h2>
  21. <nut-cell
  22. title="请选择城市"
  23. :desc="defult"
  24. @click="
  25. () => {
  26. showDefult = true;
  27. }
  28. "
  29. ></nut-cell>
  30. <nut-picker
  31. v-model="selectedValue"
  32. v-model:visible="showDefult"
  33. :columns="columns"
  34. title="城市选择"
  35. @confirm="(options) => confirm('defult', options)"
  36. >
  37. </nut-picker>
  38. <h2>多列样式</h2>
  39. <nut-cell
  40. title="请选择时间"
  41. :desc="multiple"
  42. @click="
  43. () => {
  44. showMultiple = true;
  45. }
  46. "
  47. ></nut-cell>
  48. <nut-picker
  49. v-model="selectedTime"
  50. v-model:visible="showMultiple"
  51. :columns="multipleColumns"
  52. title="城市选择"
  53. @confirm="(options) => confirm('multiple', options)"
  54. >
  55. </nut-picker>
  56. <h2>多级联动</h2>
  57. <nut-cell
  58. title="请选择地址"
  59. :desc="cascader"
  60. @click="
  61. () => {
  62. showCascader = true;
  63. }
  64. "
  65. ></nut-cell>
  66. <nut-picker
  67. v-model="selectedCascader"
  68. v-model:visible="showCascader"
  69. :columns="cascaderColumns"
  70. title="城市选择"
  71. @confirm="(options) => confirm('cascader', options)"
  72. ></nut-picker>
  73. <h2>异步获取</h2>
  74. <nut-cell
  75. title="请选择地址"
  76. :desc="async"
  77. @click="
  78. () => {
  79. showAsync = true;
  80. }
  81. "
  82. ></nut-cell>
  83. <nut-picker
  84. v-model="asyncValue"
  85. v-model:visible="showAsync"
  86. :columns="asyncColumns"
  87. title="城市选择"
  88. @confirm="(options) => confirm('async', options)"
  89. ></nut-picker>
  90. <h2>自定义按钮</h2>
  91. <nut-cell
  92. title="请选择有效日期"
  93. :desc="effect"
  94. @click="
  95. () => {
  96. showEffect = true;
  97. }
  98. "
  99. ></nut-cell>
  100. <nut-picker
  101. v-model:visible="showEffect"
  102. :columns="effectColumns"
  103. title="日期选择"
  104. @confirm="(options) => confirm('effect', options)"
  105. >
  106. <nut-button block type="primary" @click="alwaysFun">永远有效</nut-button></nut-picker
  107. >
  108. </div>
  109. </template>
  110. <script lang="ts">
  111. import { reactive, onMounted, ref, toRefs } from 'vue';
  112. import { PickerOption } from '../../../../../../../packages/__VUE/picker/types';
  113. export default {
  114. props: {},
  115. setup() {
  116. const selectedValue = ref(['ZheJiang']);
  117. const selectedTime = ref(['Wednesday', 'Afternoon']);
  118. const selectedCascader = ref(['FuJian', 'FuZhou', 'TaiJiang']);
  119. const asyncValue = ref<string[]>([]);
  120. const columsNum = ref([]);
  121. const columns = ref([
  122. { text: '南京市', value: 'NanJing' },
  123. { text: '无锡市', value: 'WuXi' },
  124. { text: '海北藏族自治区', value: 'ZangZu' },
  125. { text: '北京市', value: 'BeiJing' },
  126. { text: '连云港市', value: 'LianYunGang' },
  127. { text: '浙江市', value: 'ZheJiang' },
  128. { text: '江苏市', value: 'JiangSu' }
  129. ]);
  130. const multipleColumns = ref([
  131. [
  132. { text: '周一', value: 'Monday' },
  133. { text: '周二', value: 'Tuesday' },
  134. { text: '周三', value: 'Wednesday' },
  135. { text: '周四', value: 'Thursday' },
  136. { text: '周五', value: 'Friday' }
  137. ],
  138. [
  139. { text: '上午', value: 'Morning' },
  140. { text: '下午', value: 'Afternoon' },
  141. { text: '晚上', value: 'Evening' }
  142. ]
  143. ]);
  144. const cascaderColumns = ref([
  145. {
  146. text: '浙江',
  147. value: 'ZheJiang',
  148. children: [
  149. {
  150. text: '杭州',
  151. value: 'HangZhou',
  152. children: [
  153. { text: '西湖区', value: 'XiHu' },
  154. { text: '余杭区', value: 'YuHang' }
  155. ]
  156. },
  157. {
  158. text: '温州',
  159. value: 'WenZhou',
  160. children: [
  161. { text: '鹿城区', value: 'LuCheng' },
  162. { text: '瓯海区', value: 'OuHai' }
  163. ]
  164. }
  165. ]
  166. },
  167. {
  168. text: '福建',
  169. value: 'FuJian',
  170. children: [
  171. {
  172. text: '福州',
  173. value: 'FuZhou',
  174. children: [
  175. { text: '鼓楼区', value: 'GuLou' },
  176. { text: '台江区', value: 'TaiJiang' }
  177. ]
  178. },
  179. {
  180. text: '厦门',
  181. value: 'XiaMen',
  182. children: [
  183. { text: '思明区', value: 'SiMing' },
  184. { text: '海沧区', value: 'HaiCang' }
  185. ]
  186. }
  187. ]
  188. }
  189. ]);
  190. const effectColumns = ref([
  191. { text: '2022-01', value: 'January' },
  192. { text: '2022-02', value: 'February' },
  193. { text: '2022-03', value: 'March' },
  194. { text: '2022-04', value: 'April' },
  195. { text: '2022-05', value: 'May' },
  196. { text: '2022-06', value: 'June' },
  197. { text: '2022-07', value: 'July' },
  198. { text: '2022-08', value: 'August' },
  199. { text: '2022-09', value: 'September' },
  200. { text: '2022-10', value: 'October' },
  201. { text: '2022-11', value: 'November' },
  202. { text: '2022-12', value: 'December' }
  203. ]);
  204. const portColumns = ref([
  205. {
  206. text: '浙江',
  207. value: 'ZheJiang',
  208. children: []
  209. },
  210. {
  211. text: '福建',
  212. value: 'FuJian',
  213. children: []
  214. }
  215. ]);
  216. const asyncColumns = ref<PickerOption[]>([]);
  217. const show = ref(false);
  218. const showDefult = ref(false);
  219. const showMultiple = ref(false);
  220. const showCascader = ref(false);
  221. const showAsync = ref(false);
  222. const showEffect = ref(false);
  223. const showPort = ref(false);
  224. const showTitle = ref(false);
  225. const desc = reactive({
  226. index: '',
  227. defult: '',
  228. multiple: '',
  229. cascader: '',
  230. async: '',
  231. effect: '',
  232. title: ''
  233. });
  234. const open = (index: number) => {
  235. switch (index) {
  236. case 0:
  237. show.value = true;
  238. break;
  239. case 1:
  240. showDefult.value = true;
  241. break;
  242. case 2:
  243. showMultiple.value = true;
  244. break;
  245. case 3:
  246. showCascader.value = true;
  247. break;
  248. case 4:
  249. showAsync.value = true;
  250. break;
  251. default:
  252. showCascader.value = true;
  253. }
  254. };
  255. onMounted(() => {
  256. for (let i = 1; i < 60; i++) {
  257. columsNum.value.push({ text: i, value: i });
  258. }
  259. setTimeout(() => {
  260. asyncColumns.value = [
  261. { text: '南京市', value: 'NanJing' },
  262. { text: '无锡市', value: 'WuXi' },
  263. { text: '海北藏族自治区', value: 'ZangZu' },
  264. { text: '北京市', value: 'BeiJing' },
  265. { text: '连云港市', value: 'LianYunGang' },
  266. { text: '浙江市', value: 'ZheJiang' },
  267. { text: '江苏市', value: 'JiangSu' }
  268. ];
  269. asyncValue.value = ['ZangZu'];
  270. }, 500);
  271. });
  272. const confirm = (tag: string, { selectedValue }: { selectedValue: string[] }) => {
  273. (desc as any)[tag] = selectedValue.join(',');
  274. };
  275. const change = ({ selectedValue }: { selectedValue: string[] }) => {
  276. console.log(selectedValue);
  277. };
  278. const portChange = (chooseDate: any) => {
  279. const { columnIndex, selectedOptions, selectedValue } = chooseDate;
  280. console.log(chooseDate);
  281. if (columnIndex == 0) {
  282. // if(portColumns.value[0].children.length == 0){
  283. // }
  284. console.log('选择后更新');
  285. portColumns.value[0].children = ([] as any).concat([
  286. {
  287. text: '杭州',
  288. value: 'HangZhou',
  289. children: [
  290. { text: '西湖区', value: 'XiHu' },
  291. { text: '余杭区', value: 'YuHang' }
  292. ]
  293. },
  294. {
  295. text: '温州',
  296. value: 'WenZhou',
  297. children: [
  298. { text: '鹿城区', value: 'LuCheng' },
  299. { text: '瓯海区', value: 'OuHai' }
  300. ]
  301. }
  302. ]);
  303. }
  304. };
  305. const alwaysFun = () => {
  306. showEffect.value = false;
  307. desc.effect = '永远有效';
  308. };
  309. return {
  310. selectedValue,
  311. selectedTime,
  312. selectedCascader,
  313. asyncValue,
  314. columns,
  315. show,
  316. showDefult,
  317. showAsync,
  318. ...toRefs(desc),
  319. showMultiple,
  320. showCascader,
  321. open,
  322. multipleColumns,
  323. cascaderColumns,
  324. confirm,
  325. change,
  326. asyncColumns,
  327. effectColumns,
  328. showEffect,
  329. alwaysFun,
  330. columsNum,
  331. showPort,
  332. showTitle,
  333. portColumns,
  334. portChange
  335. };
  336. }
  337. };
  338. </script>