动态表单(基于 Ant Design Vue 1.x)

  • 1.实现以下效果
    avatar
  • 2.示例代码如下:
    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
    126
    127
    128
    129
    130
    131
    132
      <a-button
    type="primary"
    class="page-work-create-btn"
    @click="addDomain"
    >
    创建
    </a-button>
    <a-form-model
    v-for="(f, index) in dynamicValidateForms"
    :key="f.key"
    :ref="`dynamicValidateForms${index}`"
    :model="f"
    v-bind="formItemLayout"
    >
    <!-- 删除按键 -->
    <a-icon
    class="dynamic-delete-button"
    type="minus-circle-o"
    @click="removeDomain(f)"
    />
    <!-- 任务名称 -->
    <a-form-model-item
    :label="'姓名'"
    :prop="'name'"
    :rules="[
    {
    required: true,
    message: '请输入姓名',
    trigger: 'blur'
    }
    ]"
    >
    <a-input v-model="f.name" placeholder="请输入姓名" />
    </a-form-model-item>
    <!-- 日期选择 -->
    <a-form-model-item
    :label="'睡觉时间'"
    :prop="'signTime'"
    :rules="[
    {
    required: true,
    message: '请选择' + TimeName
    },
    {
    // 自定义校验规则
    validator: (rule, value, callback) => {
    if (value.length === 2) {
    if (!value[0] || !value[1]) {
    callback('请选择' + TimeName)
    } else {
    // callback不传参数表示校验通过
    callback()
    }
    } else {
    callback('请选择' + TimeName)
    }
    }
    }
    ]"
    >
    <a-range-picker v-model="f.signTime" format="YYYY-MM-DD">
    <a-icon slot="suffixIcon" type="smile" />
    </a-range-picker>
    </a-form-model-item>
    <!-- 累计个数 -->
    <a-form-model-item
    v-if="tabsSelect_index === 3 || tabsSelect_index === 4"
    :label="'水果'"
    :prop="'threshold'"
    :rules="[
    {
    required: true,
    message: '请输入个数',
    trigger: 'blur'
    }
    ]"
    >
    <a-input
    v-model="f.threshold"
    placeholder="请输入个数"
    suffix="个"
    @input="
    e =>
    (name = validForbid(
    e,
    dynamicValidateForms[index],
    'threshold'
    ))
    "
    />
    </a-form-model-item>
    <!-- 维生素-->
    <a-form-model-item
    :label="'可获得'"
    :prop="'lucky_value'"
    :rules="[
    {
    required: true,
    message: '请输入维生素',
    trigger: 'blur'
    }
    ]"
    >
    <a-input
    v-model="f.lucky_value"
    placeholder="请输入维生素"
    suffix="维生素"
    @input="
    e =>
    (name = validForbid(
    e,
    dynamicValidateForms[index],
    'lucky_value'
    ))
    "
    />
    </a-form-model-item>
    <!-- 说明文案 -->
    <a-form-model-item
    :label="'说明文案'"
    :prop="'body'"
    :rules="{
    required: true,
    message: '请输入说明文案',
    trigger: 'blur'
    }"
    >
    <a-input v-model="f.body" placeholder="请输入说明文案" />
    </a-form-model-item>
    <a-divider />
    </a-form-model>
    </div>

注意:因为是直接创建一个动态表单,所以ref需要是唯一的,可用循环出来的index进行拼接达到,如果需要初始化有一个默认表单,则需要在初始化的时候初始一个对象push到dynamicValidateForms这个数组里面。