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

场景

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

实现方式

点击 “添加” 按钮时,添加一个新的表单;
点击 “删除” 按钮时,通过拿到的当前下标再配合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>
  
  

效果

在这里插入图片描述

查看数据

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

补充

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

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

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

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

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue-cli是一个官方推出的Vue项目脚手架工具,用于快速搭建Vue项目。ts是TypeScript的简称,是一种由微软开发的开源编程语言,它是JavaScript的超集,可以为JavaScript代码添加静态类型检查和封装类、模块等面向对象编程的特性。antd是蚂蚁金服开源的一套基于React封装的UI组件库,提供了丰富的高质量的React组件。 将这三者结合在一起,意味着我们可以利用Vue-cli搭建一个基于Vue和TypeScript的项目,并使用antd组件库来构建界面。这样的项目结合了Vue的简洁、易用和高效性能,TypeScript的类型检查和面向对象编程特性,以及antd的高质量UI组件,可以提升开发效率和代码质量。 在使用Vue-cli创建项目时,可以选择使用TypeScript作为项目的开发语言,这样项目就会自动集成TypeScript的相关配置和支持。通过使用Vue-cli提供的命令和配置,我们可以快速搭建一个工程化的项目结构,并集成Webpack等构建工具。 在项目中使用antd组件库时,可以通过npm或者yarn安装antd包,然后在Vue的组件中引入所需的组件,并进行相关配置和使用。antd提供了丰富的UI组件,包括按钮、表单、弹窗、表格等常见的界面元素,可以根据项目需求进行选择和使用。 在使用TypeScript编写Vue项目时,可以利用TypeScript的静态类型检查、类型提示功能,提升代码的可读性和可维护性。同时,可以使用面向对象的编程方式来组织代码,更好地管理和封装组件、模块等。 综上所述,使用Vue-cli搭建一个基于Vue、TypeScript和antd的项目,可以充分发挥各自的优势,提升开发效率和代码质量,同时能够满足丰富的UI界面需求。这样的项目具备良好的可扩展性和可维护性,适合于中大型前端项目的开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

屎山制造者2022

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值