vue中el-form通过v-for实现多层嵌套动态表单

本文介绍了如何在ElementUI的el-form组件中,通过v-for实现表单的动态增减功能,包括基本信息和可动态添加删除的环节,以及每个环节内的事件。关键代码展示了如何使用v-model和prop进行数据绑定以及添加和移除表单项的逻辑。
摘要由CSDN通过智能技术生成

需求

表单分为基本信息和事件信息,事件信息中的环节可以动态进行增减;环节中又包括事件,也可以动态进行增减

分析

elementUI中el-form存在动态增减表单项示例,可以以此为参考进行改造

按照需求,表单需要嵌套两层v-for进行实现

关键代码

<div class="link-box" v-for="(node, i) in eventForm.linkList" :key="i">
    <span class="link-item">
        环节{{Number(i+ 1)}}
    </span>
    <div class="node-box">
        <el-form-item
            label="节点名称"
            :prop="'linkList.' + i + '.linkName'"
            :rules="[{ required: true, message: '请输入节点名称', trigger: 'blur' }]"
        >
            <el-input v-model="node.linkName" placeholder="请输入" clearable @input="onInput"></el-input>
        </el-form-item>
        <el-form-item
            label="描述"
            :prop="'linkList.' + i + '.linkDescription'"
        >
            <el-input type="textarea" v-model="node.linkDescription" placeholder="请输入" @input="onInput"></el-input>
        </el-form-item>
        <div class="add-btn-box">
            <el-form-item
                v-for="(item, j) in node.linkEventList"
                :label="'事件' + Number(j+1)"
                :key="j"
                :prop="'linkList.' + i + '.linkEventList.' + j + '.linkEventName'"
            >
                <el-input v-model="item.linkEventName" placeholder="请输入" clearable @input="onInput"></el-input>
                <el-button type="primary" class="add-btn" @click="btnAddClick(item, i)">+</el-button>
                <el-button type="primary" class="remove-btn" @click="btnRemoveClick(item, i)">-</el-button>
            </el-form-item>
        </div>
    </div>
    <div class="add-link-box">
        <el-button type="primary" class="add-link" @click="linkAddClick()">+</el-button>
        <el-button type="primary" class="remove-link" @click="linkRemoveClick(node, i)">-</el-button>
    </div>
</div>
data() {
    return {
        eventForm: {
            eventName: '',
            eventType: '',
            eventDescription: '',
            linkList: [{
              linkName: '',
              linkDescription: '',
              linkEventList: [{linkEventName: ''}],
            }],
        },
    }
}
// 点击环节+按钮
linkAddClick() {
    let obj = { linkName:"", linkDescription: '',linkEventList: [{linkEventName: ''}] };
    this.eventForm.linkList.push(obj);
},
// 点击环节-按钮
linkRemoveClick(node, i) {
    if (this.eventForm.linkList.length == 1) { // 确保页面始终保留1个环节
        return
    } else {
        let index = this.eventForm.linkList.indexOf(node)
        if (index !== -1) {
            this.eventForm.linkList.splice(index, 1)
        }
    }
};


// 点击事件+按钮
btnAddClick(item, i) {
    this.eventForm.linkList[i].linkEventList.push({
        linkEventName: '',
    });
},
//点击事件-按钮
btnRemoveClick(item, i) {
    if (this.eventForm.linkList[i].linkEventList.length == 1) {
        return
    } else {
        let index = this.eventForm.linkList[i].linkEventList.indexOf(item)
        if (index !== -1) {
            this.eventForm.linkList[i].linkEventList.splice(index, 1)
        }
    }
},

注意

1.prop的绑定

2.rules校验规则绑定

TS 多层级数组嵌套并且表单验证是一个常见的需求,在 TypeScript 可以通过使用类型注解和条件语句来实现。 在多层级数组嵌套的情况下,我们可以定义一个嵌套的接口类型来表示数据结构。例如,假设我们有一个表单,其包含多个用户的信息,而每个用户又包含多个地址。可以定义一个嵌套的接口类型来表示这个数据结构: ```ts interface User { name: string; addresses: Address[]; } interface Address { street: string; city: string; country: string; } ``` 接下来,在表单验证方面,我们可以通过定义一个验证函数来验证表单的输入。例如,我们可以编写一个验证函数,该函数接收一个用户对象作为参数,并检查用户的名称和地址是否符合特定的规则: ```ts function validateUser(user: User): boolean { if (user.name.trim() === "") { console.error("用户名不能为空"); return false; } for (let address of user.addresses) { if (address.street.trim() === "" || address.city.trim() === "" || address.country.trim() === "") { console.error("地址信息不能为空"); return false; } } // 验证通过 return true; } ``` 这样,我们就可以使用这个验证函数来验证用户输入的数据了。例如,假设我们有一个用户表单如下: ```ts const userForm: User = { name: "John", addresses: [ { street: "123 Main St", city: "City", country: "Country" }, { street: "456 Second St", city: "", country: "Country" } ] }; // 验证用户表单 validateUser(userForm); ``` 以上就是使用 TypeScript 实现多层级数组嵌套并进行表单验证的一个示例。通过定义嵌套的接口类型和验证函数,可以更好地控制表单输入的规范性和准确性,从而提高代码的可靠性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值