schangxiang@126.com
2025-09-10 3d43ffa3152110b7823f9fa6320c08a6ae02358a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
<template>
  <div>
    <el-form ref="generateForm" :model="models" :rules="rules" :label-position="data.editorOptions.config.labelPosition" :label-width="data.editorOptions.config.labelWidth">
      <template v-for="item in data.editorOptions.fields">
        <template v-if="item.type == 'grid'">
          <el-row :key="item.key" :gutter="item.options.gutter ? item.options.gutter : 0" :justify="item.options.justify" :align="item.options.align" type="flex">
            <el-col v-for="(col, colIndex) in item.columns" :key="colIndex" :span="col.span">
              <template v-for="citem in col.fields">
                <el-form-item v-if="citem.type=='blank'" :label="citem.label" :prop="citem.model" :key="citem.key">
                  <slot :name="citem.model" :model="models"></slot>
                </el-form-item>
                <genetate-form-item v-else :key="citem.key" :models.sync="models" :remote="remote" :rules="rules" :widget="citem"></genetate-form-item>
              </template>
            </el-col>
          </el-row>
        </template>
 
        <template v-else-if="item.type == 'blank'">
          <el-form-item :label="item.name" :prop="item.model" :key="item.key">
            <slot :name="item.model" :model="models"></slot>
          </el-form-item>
        </template>
 
        <template v-else>
          <genetate-form-item :key="item.key" :models.sync="models" :rules="rules" :widget="item" :remote="remote"></genetate-form-item>
        </template>
 
      </template>
    </el-form>
  </div>
</template>
 
<script>
import GenetateFormItem from "./GenerateFormItem";
 
export default {
  name: "fm-generate-form",
  components: {
    GenetateFormItem
  },
  props: {
    data: {
      type: Object,
      default: () => {
        return {};
      }
    },
    remote: {
      type: Boolean,
      default: false
    },
    value: {
      type: Object,
      default: () => {
        return {};
      }
    }
  },
  data() {
    return {
      models: {},
      rules: {}
    };
  },
  watch: {
    value: {
      deep: true,
      handler(val) {
        // console.log(JSON.stringify(val))
        this.models = { ...this.models, ...val };
      }
    }
  },
  created() {
    this.generateModle(this.data.editorOptions.fields);
  },
  methods: {
    generateModle(genList) {
      for (let i = 0; i < genList.length; i++) {
        if (genList[i].type === "grid") {
          genList[i].columns.forEach(item => {
            this.generateModle(item.fields);
          });
        } else {
          if (Object.keys(this.value).indexOf(genList[i].model) >= 0) {
            this.models[genList[i].model] = this.value[genList[i].model];
          } else {
            if (genList[i].type === "blank") {
              if (genList[i].options.defaultType === "String") {
                this.models[genList[i].model] = "";
              } else {
                this.models[genList[i].model] =
                  genList[i].options.defaultType === "Object" ? {} : [];
              }
            } else {
              this.models[genList[i].model] = genList[i].options.defaultValue;
            }
          }
 
          if (this.rules[genList[i].model]) {
            this.rules[genList[i].model] = [
              ...this.rules[genList[i].model],
              ...genList[i].rules
            ];
          } else {
            this.rules[genList[i].model] = [...genList[i].rules];
          }
        }
      }
    },
    getData() {
      return new Promise((resolve, reject) => {
        this.$refs.generateForm.validate(valid => {
          if (valid) {
            resolve(this.models);
          } else {
            reject(new Error("表单数据校验失败").message);
          }
        });
      });
    },
    refresh() {}
  }
};
</script>