index.vue 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. <template>
  2. <PageWrapper title="表单基础示例">
  3. <CollapseContainer title="基础示例">
  4. <BasicForm
  5. autoFocusFirstItem
  6. :labelWidth="100"
  7. :schemas="schemas"
  8. :actionColOptions="{ span: 24 }"
  9. @submit="handleSubmit"
  10. />
  11. </CollapseContainer>
  12. </PageWrapper>
  13. </template>
  14. <script lang="ts">
  15. import { defineComponent, ref } from 'vue';
  16. import { BasicForm, FormSchema } from '/@/components/Form/index';
  17. import { CollapseContainer } from '/@/components/Container/index';
  18. import { useMessage } from '/@/hooks/web/useMessage';
  19. import { PageWrapper } from '/@/components/Page';
  20. import { optionsListApi } from '/@/api/demo/select';
  21. const provincesOptions = [
  22. {
  23. id: 'guangdong',
  24. label: '广东省',
  25. value: '1',
  26. key: '1',
  27. },
  28. {
  29. id: 'jiangsu',
  30. label: '江苏省',
  31. value: '2',
  32. key: '2',
  33. },
  34. ];
  35. const citiesOptionsData = {
  36. guangdong: [
  37. {
  38. label: '珠海市',
  39. value: '1',
  40. key: '1',
  41. },
  42. {
  43. label: '深圳市',
  44. value: '2',
  45. key: '2',
  46. },
  47. {
  48. label: '广州市',
  49. value: '3',
  50. key: '3',
  51. },
  52. ],
  53. jiangsu: [
  54. {
  55. label: '南京市',
  56. value: '1',
  57. key: '1',
  58. },
  59. {
  60. label: '无锡市',
  61. value: '2',
  62. key: '2',
  63. },
  64. {
  65. label: '苏州市',
  66. value: '3',
  67. key: '3',
  68. },
  69. ],
  70. };
  71. const schemas: FormSchema[] = [
  72. {
  73. field: 'field1',
  74. component: 'Input',
  75. label: '字段1',
  76. colProps: {
  77. span: 8,
  78. },
  79. // componentProps:{},
  80. // can func
  81. componentProps: ({ schema, formModel }) => {
  82. console.log('form:', schema);
  83. console.log('formModel:', formModel);
  84. return {
  85. placeholder: '自定义placeholder',
  86. onChange: (e: any) => {
  87. console.log(e);
  88. },
  89. };
  90. },
  91. renderComponentContent: () => {
  92. return {
  93. prefix: () => 'pSlot',
  94. suffix: () => 'sSlot',
  95. };
  96. },
  97. },
  98. {
  99. field: 'field2',
  100. component: 'Input',
  101. label: '带后缀',
  102. defaultValue: '111',
  103. colProps: {
  104. span: 8,
  105. },
  106. componentProps: {
  107. onChange: (e: any) => {
  108. console.log(e);
  109. },
  110. },
  111. suffix: '天',
  112. },
  113. {
  114. field: 'field3',
  115. component: 'DatePicker',
  116. label: '字段3',
  117. colProps: {
  118. span: 8,
  119. },
  120. },
  121. {
  122. field: 'field4',
  123. component: 'Select',
  124. label: '字段4',
  125. colProps: {
  126. span: 8,
  127. },
  128. componentProps: {
  129. options: [
  130. {
  131. label: '选项1',
  132. value: '1',
  133. key: '1',
  134. },
  135. {
  136. label: '选项2',
  137. value: '2',
  138. key: '2',
  139. },
  140. ],
  141. },
  142. },
  143. {
  144. field: 'field5',
  145. component: 'CheckboxGroup',
  146. label: '字段5',
  147. colProps: {
  148. span: 8,
  149. },
  150. componentProps: {
  151. options: [
  152. {
  153. label: '选项1',
  154. value: '1',
  155. },
  156. {
  157. label: '选项2',
  158. value: '2',
  159. },
  160. ],
  161. },
  162. },
  163. {
  164. field: 'field7',
  165. component: 'RadioGroup',
  166. label: '字段7',
  167. colProps: {
  168. span: 8,
  169. },
  170. componentProps: {
  171. options: [
  172. {
  173. label: '选项1',
  174. value: '1',
  175. },
  176. {
  177. label: '选项2',
  178. value: '2',
  179. },
  180. ],
  181. },
  182. },
  183. {
  184. field: 'field8',
  185. component: 'Checkbox',
  186. label: '字段8',
  187. colProps: {
  188. span: 8,
  189. },
  190. renderComponentContent: 'Check',
  191. },
  192. {
  193. field: 'field9',
  194. component: 'Switch',
  195. label: '字段9',
  196. colProps: {
  197. span: 8,
  198. },
  199. },
  200. {
  201. field: 'field10',
  202. component: 'RadioButtonGroup',
  203. label: '字段10',
  204. colProps: {
  205. span: 8,
  206. },
  207. componentProps: {
  208. options: [
  209. {
  210. label: '选项1',
  211. value: '1',
  212. },
  213. {
  214. label: '选项2',
  215. value: '2',
  216. },
  217. ],
  218. },
  219. },
  220. {
  221. field: 'field11',
  222. component: 'Cascader',
  223. label: '字段11',
  224. colProps: {
  225. span: 8,
  226. },
  227. componentProps: {
  228. options: [
  229. {
  230. value: 'zhejiang',
  231. label: 'Zhejiang',
  232. children: [
  233. {
  234. value: 'hangzhou',
  235. label: 'Hangzhou',
  236. children: [
  237. {
  238. value: 'xihu',
  239. label: 'West Lake',
  240. },
  241. ],
  242. },
  243. ],
  244. },
  245. {
  246. value: 'jiangsu',
  247. label: 'Jiangsu',
  248. children: [
  249. {
  250. value: 'nanjing',
  251. label: 'Nanjing',
  252. children: [
  253. {
  254. value: 'zhonghuamen',
  255. label: 'Zhong Hua Men',
  256. },
  257. ],
  258. },
  259. ],
  260. },
  261. ],
  262. },
  263. },
  264. {
  265. field: 'field30',
  266. component: 'ApiSelect',
  267. label: '远程下拉',
  268. required: true,
  269. componentProps: {
  270. api: optionsListApi,
  271. },
  272. colProps: {
  273. span: 8,
  274. },
  275. defaultValue: '0',
  276. },
  277. {
  278. field: 'field20',
  279. component: 'InputNumber',
  280. label: '字段20',
  281. required: true,
  282. colProps: {
  283. span: 8,
  284. },
  285. },
  286. {
  287. field: 'province',
  288. component: 'Select',
  289. label: '省份',
  290. colProps: {
  291. span: 8,
  292. },
  293. componentProps: ({ formModel, formActionType }) => {
  294. return {
  295. options: provincesOptions,
  296. placeholder: '省份与城市联动',
  297. onChange: (e: any) => {
  298. // console.log(e)
  299. let citiesOptions =
  300. e == 1
  301. ? citiesOptionsData[provincesOptions[0].id]
  302. : citiesOptionsData[provincesOptions[1].id];
  303. // console.log(citiesOptions)
  304. if (e === undefined) {
  305. citiesOptions = [];
  306. }
  307. formModel.city = undefined; // reset city value
  308. const { updateSchema } = formActionType;
  309. updateSchema({
  310. field: 'city',
  311. componentProps: {
  312. options: citiesOptions,
  313. },
  314. });
  315. },
  316. };
  317. },
  318. },
  319. {
  320. field: 'city',
  321. component: 'Select',
  322. label: '城市',
  323. colProps: {
  324. span: 8,
  325. },
  326. componentProps: {
  327. options: [], // defalut []
  328. placeholder: '省份与城市联动',
  329. },
  330. },
  331. {
  332. field: 'field21',
  333. component: 'Slider',
  334. label: '字段21',
  335. componentProps: {
  336. min: 0,
  337. max: 100,
  338. range: true,
  339. marks: {
  340. 20: '20°C',
  341. 60: '60°C',
  342. },
  343. },
  344. colProps: {
  345. span: 8,
  346. },
  347. },
  348. {
  349. field: 'field22',
  350. component: 'Rate',
  351. label: '字段22',
  352. defaultValue: 3,
  353. colProps: {
  354. span: 8,
  355. },
  356. componentProps: {
  357. disabled: false,
  358. allowHalf: true,
  359. },
  360. },
  361. ];
  362. export default defineComponent({
  363. components: { BasicForm, CollapseContainer, PageWrapper },
  364. setup() {
  365. const check = ref(null);
  366. const { createMessage } = useMessage();
  367. return {
  368. schemas,
  369. handleSubmit: (values: any) => {
  370. createMessage.success('click search,values:' + JSON.stringify(values));
  371. },
  372. check,
  373. };
  374. },
  375. });
  376. </script>