index.jsx 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import extraParas from '../../config'
  2. import zhCN from 'ant-design-vue/es/locale/zh_CN'
  3. import styles from './index.module.scss'
  4. import DynamicForm from '../DynamicForm'
  5. import StaticForm from '../StaticForm'
  6. export default {
  7. extraParas,
  8. name: 'CustomForm',
  9. components: {
  10. DynamicForm,
  11. StaticForm
  12. },
  13. props: {
  14. value: Array
  15. },
  16. data() {
  17. return {
  18. form: {},
  19. labelCol: { span: 4 },
  20. wrapperCol: { span: 14 },
  21. }
  22. },
  23. methods: {
  24. async submit() {
  25. return new Promise((reslove, reject) => {
  26. this.$refs.dynamic.$refs.form.validate(valid => {
  27. if (valid) {
  28. reslove({...this.form})
  29. } else {
  30. reject('表单校验失败')
  31. }
  32. })
  33. })
  34. }
  35. },
  36. mounted() {
  37. const configured = this.value || []
  38. const configuredForm = configured.reduce((form, cur) => {
  39. form[cur.name] = cur.defaultValue
  40. return form
  41. }, {})
  42. extraParas.forEach(({ name, defaultValue, config = {} }) => {
  43. let val = (name in configuredForm) ? configuredForm[name] : defaultValue
  44. if (config.type === 'MultiSelect' || config.type === 'CheckBox') {
  45. let selected = []
  46. try {
  47. selected = JSON.parse(val)
  48. } catch(e) {}
  49. this.$set(this.form, name, selected)
  50. } else {
  51. this.$set(this.form, name, val)
  52. }
  53. })
  54. },
  55. render() {
  56. return (
  57. <a-config-provider locale={zhCN}>
  58. <div class={styles.customForm}>
  59. {/* 动态表单 */}
  60. <DynamicForm paras={extraParas} form={this.form} ref="dynamic" />
  61. {/* 静态表单,可手动定义表单样式 */}
  62. {/* <StaticForm form={this.form} ref="form" /> */}
  63. </div>
  64. </a-config-provider>
  65. )
  66. }
  67. }