index.jsx 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. clearValidate() {
  36. this.$refs.dynamic.$refs.form.clearValidate()
  37. }
  38. },
  39. mounted() {
  40. const configured = this.value || []
  41. const configuredForm = configured.reduce((form, cur) => {
  42. form[cur.name] = cur.defaultValue
  43. return form
  44. }, {})
  45. extraParas.forEach(({ name, defaultValue, config = {} }) => {
  46. let val = (name in configuredForm) ? configuredForm[name] : defaultValue
  47. if (config.type === 'MultiSelect' || config.type === 'CheckBox') {
  48. let selected = []
  49. try {
  50. selected = JSON.parse(val)
  51. } catch(e) {}
  52. this.$set(this.form, name, selected)
  53. } else {
  54. this.$set(this.form, name, val)
  55. }
  56. })
  57. },
  58. render() {
  59. return (
  60. <a-config-provider locale={zhCN}>
  61. <div class={styles.customForm}>
  62. {/* 动态表单 */}
  63. <DynamicForm paras={extraParas} form={this.form} ref="dynamic" />
  64. {/* 静态表单,可手动定义表单样式 */}
  65. {/* <StaticForm form={this.form} ref="form" /> */}
  66. </div>
  67. </a-config-provider>
  68. )
  69. }
  70. }