demo.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. <template>
  2. <div class="demo">
  3. <h2>{{ translate('basic') }}</h2>
  4. <nut-cell
  5. :title="translate('chooseCity')"
  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="translate('chooseCity')"
  17. @change="change"
  18. @confirm="(options) => confirm('index', options)"
  19. ></nut-picker>
  20. <h2>{{ translate('defaultSelected') }}</h2>
  21. <nut-cell
  22. :title="translate('chooseCity')"
  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="translate('chooseCity')"
  35. @confirm="(options) => confirm('defult', options)"
  36. >
  37. </nut-picker>
  38. <h2>{{ translate('tileDesc') }}</h2>
  39. <nut-cell
  40. :title="translate('chooseCity')"
  41. :desc="defult"
  42. @click="
  43. () => {
  44. showTile = true;
  45. }
  46. "
  47. ></nut-cell>
  48. <nut-picker
  49. v-model="selectedValue"
  50. v-model:visible="showTile"
  51. :columns="columns"
  52. :title="translate('chooseCity')"
  53. :threeDimensional="false"
  54. @confirm="(options) => confirm('defult', options)"
  55. >
  56. </nut-picker>
  57. <h2>{{ translate('multipleColumns') }}</h2>
  58. <nut-cell
  59. :title="translate('chooseTime')"
  60. :desc="multiple"
  61. @click="
  62. () => {
  63. showMultiple = true;
  64. }
  65. "
  66. ></nut-cell>
  67. <nut-picker
  68. v-model="selectedTime"
  69. v-model:visible="showMultiple"
  70. :columns="multipleColumns"
  71. :title="translate('chooseTime')"
  72. @confirm="(options) => confirm('multiple', options)"
  73. >
  74. </nut-picker>
  75. <h2>{{ translate('cascade') }}</h2>
  76. <nut-cell
  77. :title="translate('chooseCity')"
  78. :desc="cascader"
  79. @click="
  80. () => {
  81. showCascader = true;
  82. }
  83. "
  84. ></nut-cell>
  85. <nut-picker
  86. v-model:visible="showCascader"
  87. v-model="selectedCascader"
  88. :columns="cascaderColumns"
  89. :title="translate('chooseCity')"
  90. @confirm="(options) => confirm('cascader', options)"
  91. ></nut-picker>
  92. <h2>{{ translate('async') }}</h2>
  93. <nut-cell
  94. :title="translate('chooseCity')"
  95. :desc="async"
  96. @click="
  97. () => {
  98. showAsync = true;
  99. }
  100. "
  101. ></nut-cell>
  102. <nut-picker
  103. v-model="asyncValue"
  104. v-model:visible="showAsync"
  105. :columns="asyncColumns"
  106. :title="translate('chooseCity')"
  107. @confirm="(options) => confirm('async', options)"
  108. ></nut-picker>
  109. <h2>{{ translate('custom') }}</h2>
  110. <nut-cell
  111. :title="translate('validTime')"
  112. :desc="effect"
  113. @click="
  114. () => {
  115. showEffect = true;
  116. }
  117. "
  118. ></nut-cell>
  119. <nut-picker
  120. v-model:visible="showEffect"
  121. :columns="effectColumns"
  122. :title="translate('chooseDate')"
  123. @confirm="(options) => confirm('effect', options)"
  124. >
  125. <nut-button block type="primary" @click="alwaysFun">{{ translate('always') }}</nut-button></nut-picker
  126. >
  127. </div>
  128. </template>
  129. <script lang="ts">
  130. import { toRefs, ref, onMounted, reactive, computed } from 'vue';
  131. import { createComponent } from '@/packages/utils/create';
  132. import { PickerOption } from './types';
  133. const { createDemo, translate } = createComponent('picker');
  134. import { useTranslate } from '@/sites/assets/util/useTranslate';
  135. import { Internation } from './doc.en';
  136. useTranslate(Internation);
  137. export default createDemo({
  138. props: {},
  139. setup() {
  140. const selectedValue = ref(['ZheJiang']);
  141. const selectedTime = ref(['Wednesday', 'Afternoon']);
  142. const selectedCascader = ref(['FuJian', 'FuZhou', 'TaiJiang']);
  143. const asyncValue = ref<string[]>([]);
  144. const columsNum = ref([]);
  145. const columns = computed(() => [
  146. { text: translate('nanJing'), value: 'NanJing' },
  147. { text: translate('wuXi'), value: 'WuXi' },
  148. { text: translate('zangZu'), value: 'ZangZu' },
  149. { text: translate('beiJing'), value: 'BeiJing' },
  150. { text: translate('lianYunGang'), value: 'LianYunGang' },
  151. { text: translate('zheJiang'), value: 'ZheJiang' },
  152. { text: translate('jiangSu'), value: 'JiangSu' }
  153. ]);
  154. const multipleColumns = computed(() => [
  155. [
  156. { text: translate('monday'), value: 'Monday' },
  157. { text: translate('tuesday'), value: 'Tuesday' },
  158. { text: translate('wednesday'), value: 'Wednesday' },
  159. { text: translate('thursday'), value: 'Thursday' },
  160. { text: translate('friday'), value: 'Friday' }
  161. ],
  162. [
  163. { text: translate('morning'), value: 'Morning' },
  164. { text: translate('afternoon'), value: 'Afternoon' },
  165. { text: translate('evening'), value: 'Evening' }
  166. ]
  167. ]);
  168. const cascaderColumns = computed(() => [
  169. {
  170. text: translate('zheJiang'),
  171. value: 'ZheJiang',
  172. children: [
  173. {
  174. text: translate('hangZhou'),
  175. value: 'HangZhou',
  176. children: [
  177. { text: translate('xiHu'), value: 'XiHu' },
  178. { text: translate('yuHang'), value: 'YuHang' }
  179. ]
  180. },
  181. {
  182. text: translate('wenZhou'),
  183. value: 'WenZhou',
  184. children: [
  185. { text: translate('luCheng'), value: 'LuCheng' },
  186. { text: translate('ouHai'), value: 'OuHai' }
  187. ]
  188. }
  189. ]
  190. },
  191. {
  192. text: translate('fuJian'),
  193. value: 'FuJian',
  194. children: [
  195. {
  196. text: translate('fuZhou'),
  197. value: 'FuZhou',
  198. children: [
  199. { text: translate('guLou'), value: 'GuLou' },
  200. { text: translate('taiJiang'), value: 'TaiJiang' }
  201. ]
  202. },
  203. {
  204. text: translate('xiaMen'),
  205. value: 'XiaMen',
  206. children: [
  207. { text: translate('siMing'), value: 'SiMing' },
  208. { text: translate('haiCang'), value: 'HaiCang' }
  209. ]
  210. }
  211. ]
  212. }
  213. ]);
  214. const bf = {
  215. ZheJiang: [
  216. {
  217. text: translate('hangZhou'),
  218. value: 'HangZhou',
  219. children: [
  220. { text: translate('xiHu'), value: 'XiHu' },
  221. { text: translate('yuHang'), value: 'YuHang' }
  222. ]
  223. },
  224. {
  225. text: translate('wenZhou'),
  226. value: 'WenZhou',
  227. children: [
  228. { text: translate('luCheng'), value: 'LuCheng' },
  229. { text: translate('ouHai'), value: 'OuHai' }
  230. ]
  231. }
  232. ],
  233. FuJian: [
  234. {
  235. text: translate('fuZhou'),
  236. value: 'FuZhou',
  237. children: [
  238. { text: translate('guLou'), value: 'GuLou' },
  239. { text: translate('taiJiang'), value: 'TaiJiang' }
  240. ]
  241. },
  242. {
  243. text: translate('xiaMen'),
  244. value: 'XiaMen',
  245. children: [
  246. { text: translate('siMing'), value: 'SiMing' },
  247. { text: translate('haiCang'), value: 'HaiCang' }
  248. ]
  249. }
  250. ]
  251. };
  252. const jkColumns = ref([
  253. {
  254. text: translate('zheJiang'),
  255. value: 'ZheJiang',
  256. children: []
  257. },
  258. {
  259. text: translate('fuJian'),
  260. value: 'FuJian',
  261. children: []
  262. }
  263. ]);
  264. const effectColumns = ref([
  265. { text: '2022-01', value: 'January' },
  266. { text: '2022-02', value: 'February' },
  267. { text: '2022-03', value: 'March' },
  268. { text: '2022-04', value: 'April' },
  269. { text: '2022-05', value: 'May' },
  270. { text: '2022-06', value: 'June' },
  271. { text: '2022-07', value: 'July' },
  272. { text: '2022-08', value: 'August' },
  273. { text: '2022-09', value: 'September' },
  274. { text: '2022-10', value: 'October' },
  275. { text: '2022-11', value: 'November' },
  276. { text: '2022-12', value: 'December' }
  277. ]);
  278. const asyncColumns = ref<PickerOption[]>([]);
  279. const show = ref(false);
  280. const showDefult = ref(false);
  281. const showMultiple = ref(false);
  282. const showCascader = ref(false);
  283. const showAsync = ref(false);
  284. const showEffect = ref(false);
  285. const showTile = ref(false);
  286. const showJK = ref(false);
  287. const desc = reactive({
  288. index: '',
  289. defult: '',
  290. multiple: '',
  291. cascader: '',
  292. async: '',
  293. effect: ''
  294. });
  295. const open = (index: number) => {
  296. switch (index) {
  297. case 0:
  298. show.value = true;
  299. break;
  300. case 1:
  301. showDefult.value = true;
  302. break;
  303. case 2:
  304. showMultiple.value = true;
  305. break;
  306. case 3:
  307. showCascader.value = true;
  308. break;
  309. case 4:
  310. showAsync.value = true;
  311. break;
  312. default:
  313. showCascader.value = true;
  314. }
  315. };
  316. onMounted(() => {
  317. for (let i = 1; i < 60; i++) {
  318. columsNum.value.push({ text: i, value: i });
  319. }
  320. setTimeout(() => {
  321. asyncColumns.value = [
  322. { text: translate('nanJing'), value: 'NanJing' },
  323. { text: translate('wuXi'), value: 'WuXi' },
  324. { text: translate('zangZu'), value: 'ZangZu' },
  325. { text: translate('beiJing'), value: 'BeiJing' },
  326. { text: translate('lianYunGang'), value: 'LianYunGang' },
  327. { text: translate('zheJiang'), value: 'ZheJiang' },
  328. { text: translate('jiangSu'), value: 'JiangSu' }
  329. ];
  330. asyncValue.value = ['ZangZu'];
  331. }, 500);
  332. });
  333. const confirm = (tag: string, { selectedValue }: { selectedValue: string[] }) => {
  334. (desc as any)[tag] = selectedValue.join(',');
  335. };
  336. const change = ({ selectedValue }: { selectedValue: string[] }) => {
  337. console.log(selectedValue);
  338. };
  339. // change
  340. const changeJK = (data) => {
  341. const { columnIndex, selectedOptions, selectedValue } = data;
  342. if (columnIndex == 0) {
  343. jkColumns.value.forEach((colum) => {
  344. if (colum.value == selectedValue[columnIndex] && colum.children.length == 0) {
  345. colum.children = bf[selectedValue[columnIndex]];
  346. }
  347. });
  348. }
  349. };
  350. const alwaysFun = () => {
  351. showEffect.value = false;
  352. desc.effect = translate('always');
  353. };
  354. return {
  355. selectedValue,
  356. asyncValue,
  357. columns,
  358. show,
  359. showDefult,
  360. showAsync,
  361. ...toRefs(desc),
  362. showMultiple,
  363. showCascader,
  364. open,
  365. multipleColumns,
  366. cascaderColumns,
  367. confirm,
  368. change,
  369. asyncColumns,
  370. effectColumns,
  371. showEffect,
  372. alwaysFun,
  373. translate,
  374. selectedTime,
  375. selectedCascader,
  376. columsNum,
  377. showTile,
  378. showJK,
  379. jkColumns,
  380. changeJK
  381. };
  382. }
  383. });
  384. </script>
  385. <style lang="scss" scoped></style>