当前位置:   article > 正文

Vue+antd实现动作列表(动态添加/删除表单)。_ant design vue动态添加表单

ant design vue动态添加表单

场景

在日常开发中会遇到大量的表单提交,如果都使用单个数据的添加会很麻烦,所以大多数会选择使用动态添加的做法。

实现方式

点击 “添加” 按钮时,添加一个新的表单;
点击 “删除” 按钮时,通过拿到的当前下标再配合splice方法实现删除当前表单。

上代码

<template>
<template>
    <div>
        <a-row>
            <a-col :span="8" :offset="8">
                <div class="col"> <a-col-24>测试动作列表</a-col-24></div>
                <!-- 循环data中定义的数组 -->
                <div v-for="(item, index) in dataList" :key="index">
                    <!-- 表单内容 -->
                    <a-form label-width="80px" ref="form" :model="item">
                        <a-row>
                            <a-col :span="9">
                                <a-form-item :rules="usernameRule" label="姓名" name="username" :label-col="{ span: 8 }"
                                    :wrapper-col="{ span: 16 }">
                                    <a-select show-search allow-clear :options="selectData"
                                        v-model:value="item.username"></a-select>
                                </a-form-item>
                            </a-col>
                            <a-col :span="11">
                                <a-form-item :rules="[{ required: true, message: '请输入年龄', trigger: 'blur' }]" label="年龄"
                                    name="age" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
                                    <a-input-number :min="0" :max='100' style="width:128px"
                                        v-model:value="item.age"></a-input-number>
                                </a-form-item>
                            </a-col>
                            <a-col :span="3" :offset=1>
                                <a-button class='btn' @click="removeIdx(item, index)" type="text">删除</a-button>
                            </a-col>
                        </a-row>
                    </a-form>
                </div>
                <!-- 操作按钮 -->

                <a-button class="btn" @click="addForm" type="success">添加</a-button>
                <a-button @click="submit">提交</a-button>
            </a-col>
            <a-col :span="8"></a-col>
        </a-row>

    </div>
</template>
  
<script>
import { get, post } from '@/utils/http/Axios'
export default {
    data() {
        const usernameRule = [
            { required: true, message: '请选择姓名!', trigger: 'blur' },
            {
                validator: (rule, value, callback) => {
                    const arr = this.dataList.filter(item => item.username === value)
                    if (arr.length > 1) {
                        return Promise.reject()
                    }
                    return Promise.resolve()
                },
                message: '姓名重复!',
                trigger: 'blur'
            }
        ]
        return {
            usernameRule,
            // 表单绑定数据
            dataList: [
                {
                    username: '',
                    age: ''
                }
            ],
            selectData: [
                { "value": "基尼太美" }, { "value": "练习两年半" }, { "value": "小黑子" }, { "value": "开庭" }, { "value": "鸡爪" }, { "value": "鸡脚" }, { "value": "吃鸡" }, { "value": "哈哈哈" }, { "value": "邓琪凡" }, { "value": "意大利" }, { "value": "坤柳" }, { "value": "坤蛋" }, { "value": "陈胜" }, { "value": "武广" }, { "value": "秦始皇" }, { "value": "刘备" }, { "value": "蔡文姬" }, { "value": "孙尚香" }, { "value": "无敌" }, { "value": "赵子龙" }
            ]
        }
    },
    methods: {
        //   添加操作
        addForm() {
            this.dataList.push({
                username: '',
                age: ''
            })
        },
        // 删除操作
        removeIdx(item, index) {
            this.dataList.splice(index, 1)
        },
        // 提交
        submit() {
            console.log(this.dataList)

        }
    }
}
</script>
  
<style scoped>
.col {
    position: relative;
    font-size: 16px;
    font-weight: 800;
    margin-top: 10px;
    margin-bottom: 10px;
}

.col:before {
    position: absolute;
    content: '';
    background-color: #70b936;
    width: 4px;
    height: 16px;
    position: absolute;
    left: -10px;
    top: 60%;
    margin-top: -10px;
}

.btn {
    color: #70b936;
}
</style>
  
  
  • 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

效果

在这里插入图片描述

查看数据

在这里插入图片描述
可以看到提交了三个表单数据。

补充

提交时需要校验重复或者必填的话如果按正常方式写

this.$refs['form'].validate()
  • 1

会报错
在这里插入图片描述
因为此时的表单是通过for循环生成的表单,在这种情况下获得表单的方法会得到一个数组而不是对象, 直接使用 validate 方法会报错。
我这里解决也是使用for循环进行校验。

  for (let i = 0; i < this.dataList.length; i++) {
                this.$refs['form'][i].validate().then(() => {
                    console.log(this.dataList);
                })
            }
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/91563
推荐阅读