Vue表单动态新增(数组里面嵌套数组)

Vue表单动态新增(数组里面嵌套数组)

昨天做项目,后台给的接口数据,对象中含有数组,数组里面再嵌套数组,好家伙做两个数组的动态新增,瞬间懵了,好在查了资料后终于搞定了!

此处给出一部分代码段参考:
要注意 :model="“的数据绑定与 :prop=”"间的关系,可通过item传值给事件函数来动态新增、编辑or删除item。

<template>
  <div class="page-content">
    <el-dialog
      :title="title"
      :visible.sync="dialogVisible"
      width="900px"
      :before-close="tableClose"
    >
      <el-form
        :model="addInfo"
        status-icon
        :rules="rules"
        ref="addFormRef"
        label-width="80px"
        class="demo-addInfo"
      >
        <el-row>
          <el-col :span="12">
            <el-form-item label="基地id" prop="baseId">
              <el-input v-model="addInfo.baseId" disabled></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="基地名称" prop="baseName">
              <el-input v-model="addInfo.baseName"></el-input> </el-form-item
          ></el-col>
        </el-row>
        <el-divider content-position="left">订单详情</el-divider>
        <el-row>
          <el-col
            :span="8"
            v-for="(item, index) in addInfo.dovecoteOutBillDtoList"
            :key="item.key"
          >
            <el-card :body-style="{ padding: '0px' }" class="card">
              <div>
                <el-row style="margin-top: 10px">
                  <el-form-item
                    :label="'鸽棚id'"
                    :rules="{
                      required: true,
                      message: '不能为空',
                      trigger: 'blur',
                    }"
                    :prop="
                      'dovecoteOutBillDtoList.' + index + '.dovecoteNumber'
                    "
                  >
                    <el-input
                      placeholder="请输入鸽棚id"
                      v-model.number="item.dovecoteNumber"
                    ></el-input>
                  </el-form-item>
                </el-row>
                <el-row style="margin-bottom: 10px">
                  <el-col :span="12">
                    <el-button
                      style="margin-left: 60%"
                      @click="openDetail(item)"
                      type="success"
                      plain
                      icon="el-icon-edit"
                    ></el-button>
                  </el-col>
                  <el-col :span="12">
                    <el-button
                      style="margin-left: 10%"
                      @click.prevent="removeDomain(item)"
                      type="danger"
                      icon="el-icon-delete"
                      plain
                    ></el-button>
                  </el-col>
                </el-row>
              </div>
            </el-card>
            <!-- 鸽棚详情表单区域开始 -->
            <el-dialog
              append-to-body
              :title="titleName"
              :visible.sync="dialogFrom"
              width="720px"
              :before-close="detailClose"
            >
              <el-form :model="item" label-width="80px">
                <el-row>
                  <el-col
                    :span="8"
                    v-for="(person, index) in item.dovecoteOutBaseDtoList"
                    :key="person.key"
                    style="border-bottom: 1px solid #f0f0f0; padding: 10px"
                  >
                    <el-card :body-style="{ padding: '0px' }" class="card">
                      <el-row>
                        <el-form-item
                          :label="'类型' + (index + 1)"
                          :prop="
                            '.dovecoteOutBaseDtoList.' + index + '.typeName'
                          "
                          :rules="{
                            required: true,
                            message: '类型不能为空',
                            trigger: 'blur',
                          }"
                        >
                          <el-select
                            v-model="person.typeName"
                            placeholder="请选择"
                            style="width: 100%"
                          >
                            <el-option
                              v-for="(item, index) in typeList"
                              :key="item.id"
                              :label="item.typeName"
                              :value="item.typeName"
                            >
                            </el-option>
                          </el-select>
                        </el-form-item>
                      </el-row>
                      <el-row>
                        <el-form-item fixed="right">
                          <el-button
                            @click.prevent="removeDetail(item, person)"
                            type="danger"
                            icon="el-icon-delete"
                            plain
                          ></el-button>
                        </el-form-item>
                      </el-row>
                    </el-card>
                  </el-col>
                </el-row>
              </el-form>
              <el-row>
                <el-col :span="8">
                  <el-button type="primary" @click="closeDetail">保存</el-button>
                </el-col>
                <el-col :span="8">
                  <el-button @click="addDetail(item)">新增类型</el-button>
                </el-col>
                <el-col :span="8">
                  <el-button @click="closeDetail">关闭</el-button>
                </el-col>
              </el-row>
            </el-dialog>
            <!-- 鸽棚详情表单区域结束 -->
          </el-col>
        </el-row>
        <el-form-item>
          <el-row>
            <el-col :span="8">
              <el-button type="primary" @click="addOrderInfo('addInfo')">提交</el-button>
            </el-col>
            <el-col :span="8">
              <el-button @click="addDomain()">新增鸽棚</el-button>
            </el-col>
            <el-col :span="8">
              <el-button @click="closeform">取消</el-button>
            </el-col>
          </el-row>
        </el-form-item>
      </el-form>
    </el-dialog>
  </div>
</template>

//删除item
removeDomain(item) {
      var index = this.addInfo.dovecoteOutBillDtoList.indexOf(item);
      if (index !== -1) {
        this.addInfo.dovecoteOutBillDtoList.splice(index, 1);
      }
    },
 removeDetail(item, person) {
      var index = this.addInfo.dovecoteOutBillDtoList.indexOf(item);
      var k =
        this.addInfo.dovecoteOutBillDtoList[
          index
        ].dovecoteOutBaseDtoList.indexOf(person);
      if (k !== -1) {
        this.addInfo.dovecoteOutBillDtoList[
          index
        ].dovecoteOutBaseDtoList.splice(k, 1);
      }
    },

新增通过向数组里面push对象即可。

遇到的问题:

在动态新增后遇到一个问题,就是新增多个item后点击编辑会出现同时触发打开表单事件,如何给予表单一个判断条件来绑定事件呢?
在这里插入图片描述
希望能够得到解答^^

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue 中对动态数组进行验证,需要在每个数组元素中添加一个 `valid` 属性,示该元素是否有效。同时,我们需要为每个数组元素绑定一个 `v-model` 指令,将输入框中的值绑定到该元素的属性中。在提交时,遍历数组,检查每个数组元素的 `valid` 属性,如果有元素的 `valid` 属性为 `false`,则验证不通过,不能提交。 以下是一个示例,展示了一个动态数组,其中 `items` 是一个数组,每个元素包含 `name` 和 `value` 两个属性,在输入框中输入的值将保存在 `value` 中。我们为每个数组元素添加了一个 `valid` 属性,并为每个输入框绑定了一个 `v-model` 指令,将输入框中的值绑定到该元素的 `value` 属性中。在输入框失去焦点时,调用 `validateInput` 方法验证该输入框的值是否有效,如果有效,则将该数组元素的 `valid` 属性设为 `true`,否则设为 `false`。在提交时,遍历数组,检查每个数组元素的 `valid` 属性,如果有元素的 `valid` 属性为 `false`,则验证不通过,不能提交。 ```html <template> <form @submit.prevent="submitForm"> <div v-for="(item, index) in items" :key="index"> <label>{{ item.name }}</label> <input type="text" v-model="item.value" @blur="validateInput(item)"> <div v-if="!item.valid" class="invalid-feedback"> 请输入有效的 {{ item.name }} </div> </div> <button type="button" @click="addItem">添加</button> <button type="submit">提交</button> </form> </template> <script> export default { data() { return { items: [{ name: "姓名", value: "", valid: false }], }; }, methods: { addItem() { // 添加一个新的数组元素 this.items.push({ name: "邮箱", value: "", valid: false }); }, submitForm() { if (this.validateForm()) { // 验证通过,提交 // ... } }, validateForm() { // 验证整个 return this.items.every((item) => item.valid); }, validateInput(item) { // 验证输入框内容是否有效 item.valid = Boolean(item.value.trim()); }, }, }; </script> ``` 在上述示例中,我们为每个输入框绑定了一个 `blur` 事件,该事件在输入框失去焦点时触发,调用 `validateInput` 方法验证该输入框的值是否有效。在 `validateInput` 方法中,如果输入框的值有效,则将该数组元素的 `valid` 属性设为 `true`,否则设为 `false`。在提交时,我们调用 `validateForm` 方法验证整个,该方法使用 `every` 方法遍历每个数组元素的 `valid` 属性,如果所有数组元素的 `valid` 属性都为 `true`,则返回 `true`,否则返回 `false`。在提交时,如果 `validateForm` 方法返回 `true`,则验证通过,可以提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值