循环 表单

重点 表单循环校验

:prop="lodTitle === '????'? (prop =`tabsList[${indexfild}].arr.${scope.$index}.excelField`) : null"
       <el-form
            label-position="top"
            class="upload-file-form"
            ref="importForm"
            label-width="80px"
            :model="formData"
            :rules="rules"
          >
            <div class="upload-content">
              <!-- <div class="upload-content-information"></div> 暂时注释 -->
              <div class="upload-content-table">
                <!-- <el-form-item label=""> -->
                <el-tabs
                  v-model="activeName"
                  @tab-click="handleClick"
                  :stretch="true"
                >
                  <el-tab-pane
                    v-for="(item, indexfild) in formData.tabsList"
                    :key="item.type"
                    :label="item.name"
                    :name="item.name"
                    :lazy="true"
                  >
                    <el-table
                      ref="tableRef"
                      :data="item.arr"
                      :height="tableHeight"
                      border
                      style="width: 100%"
                      :row-class-name="tableRowClassName"
                      :row-style="{ height: '40px' }"
                      row-key="fieldId"
                      :default-expand-all="false"
                      :tree-props="{
                        children: 'children',
                        hasChildren: 'hasChildren',
                      }"
                    >
                      <template slot="empty">
                        <span style="color: #969799">{{
                          assoTableName || ""
                        }}</span>
                      </template>
                      <!-- <el-table-column type="selection" align="center" width="55">
                      </el-table-column> -->
                      <el-table-column
                        prop="listField"
                        align="center"
                        label="字段列"
                        width="175"
                        show-overflow-tooltip
                      >
                      </el-table-column>

                      <el-table-column
                        prop="valueField"
                        align="center"
                        label="内容列"
                        width="200px"
                        show-overflow-tooltip
                      ></el-table-column>

                      <el-table-column
                        prop="excelField"
                        align="center"
                        label="修改列"
                        width="330"
                        resizable
                      >
                        <template slot-scope="scope">
                          <el-form-item
                            :prop="
                              lodTitle === '字段配置'
                                ? (prop = `tabsList[${indexfild}].arr.${scope.$index}.excelField`)
                                : null
                            "
                            style="display: inline-block; height: 50px"
                            :rules="
                              lodTitle === '?' ? rules.excelField : []
                            "
                            label=""
                          >
                            <el-select
                              v-model="scope.row.excelField"
                              clearable
                              size="small"
                              filterable
                              style="margin: 3px 0"
                              :disabled="lodTitle === '?'"
                            >
                              <el-option
                                v-for="(item, index) in headersKey"
                                :label="item.label"
                                :value="item.value"
                                :key="`${item.label}${index}`"
                              ></el-option>
                            </el-select>
                          </el-form-item>

                          <template v-if="lodTitle !== '?'">
                            <el-button
                              v-if="scope.row.listField"
                              style="margin-left: 6px"
                              icon="el-icon-plus"
                              circle
                              @click.stop="
                                allList(scope.row, 'add', scope.$index)
                              "
                            ></el-button>
                            <el-button
                              v-if="!scope.row.listField"
                              style="margin-left: 6px"
                              icon="el-icon-minus"
                              type="danger"
                              circle
                              @click.stop="
                                allList(scope.row, 'remove', scope.$index)
                              "
                            ></el-button>
                          </template>
                        </template>
                      </el-table-column>
                      <!-- 特殊列 -->
                      <el-table-column
                        v-if="lodTitle === '?'"
                        prop="dvField"
                        align="center"
                        label="修改列"
                        width="260"
                        resizable
                      >
                        <template slot-scope="scope">
                          <el-date-picker
                            v-if="scope.row.dataType === 'dateTime'"
                            clearable
                            v-model="scope.row.dvField"
                            type="date"
                            value-format="yyyy-MM-dd"
                            format="yyyy-MM-dd"
                          ></el-date-picker>
                     
                      
                          <!-- selsct -->
                          <el-select
                            v-else-if="scope.row.dataType === 'select'"
                            v-model="scope.row.dvField"
                            placeholder="请选择"
                            clearable
                            filterable
                            allow-create
                            @click.native="
                              (event) => changeClick(event, scope.row, item)
                            "
                            size="small"
                          >
                            <el-option
                              v-for="item in dataSelect"
                              :key="item.value"
                              :label="item.label"
                              :value="item.value"
                            >
                            </el-option>
                          </el-select>
                          <!--  -->
                          <el-input
                            v-if="scope.row.dataType === 'input'"
                            placeholder="请输入内容"
                            v-model.trim="scope.row.dvField"
                            clearable
                          >
                          </el-input>
                          <el-input
                            v-if="scope.row.dataType === 'number'"
                            placeholder="请输入内容"
                            v-model.trim="scope.row.dvField"
                            type="number"
                            clearable
                          >
                          </el-input>
                        </template>
                      </el-table-column>
                    </el-table>
                  </el-tab-pane>
                </el-tabs>
                <!-- </el-form-item> -->
              </div>
            </div>
          </el-form>

重点数据结构  表单校验循环到每一个属上 实时校验

   formData: {
        // 标签页
        tabsList: [
          { type: 1, name: "?", arr: [] },
          { type: 2, name: "?", arr: [] },
          { type: 3, name: "?", arr: [] },
          { type: 4, name: "?", arr: [] },
          { type: 5, name: "?", arr: [] },
          { type: 6, name: "?", arr: [] },
          { type: 7, name: "?", arr: [] },
          { type: 8, name: "?", arr: [] },
          { type: 9, name: "?", arr: [] },
          { type: 10, name: "?", arr: [] },
          { type: 11, name: "?", arr: [] },
        ],
      },

### Vue3 中实现循环表单Vue3 中实现循环表单可以通过定义响应式的表单数组来完成。每当需要新增或删除表单项时,更新该数组即可自动反映到视图中[^1]。 对于简单的单层循环表单而言,在组件的数据选项内声明一个初始为空或是含有若干预设项的数组作为表单源: ```javascript data() { return { formItems: [ { name: '', age: '' } ] }; } ``` 为了支持动态增删表单项的操作,可以编写相应的方法用于修改 `formItems` 数组的内容。比如增加新条目的函数如下所示: ```javascript methods: { addFormItem() { this.formItems.push({ name: '', age: '' }); }, removeFormItem(index) { if (this.formItems.length > 1) { this.formItems.splice(index, 1); } } } ``` 模板部分则利用 v-for 指令遍历上述数据结构并构建对应的 HTML 结构,同时绑定必要的事件处理器以便交互操作: ```html <div v-for="(item, index) in formItems" :key="index"> <input type="text" v-model="item.name"/> <input type="number" v-model="item.age"/> <!-- 删除按钮 --> <button @click.prevent="removeFormItem(index)">-</button> </div> <!-- 添加按钮 --> <button @click.prevent="addFormItem">Add Item</button> ``` 当涉及到更复杂的业务逻辑如多级嵌套或者条件显示不同类型的字段时,则需进一步扩展此模式,考虑采用更加灵活的设计方式,例如使用对象而非单纯数组存储表单配置信息,并配合计算属性处理展示规则等[^2]。 针对表单验证的需求,可借助第三方库(如 VeeValidate 或者 FormKit),也可以直接调用框架自带 API 完成基本校验功能。如果存在多个独立表单实例共存于同一页面的情况,记得分别获取它们各自的引用并通过编程方式进行联合检验以确保整体有效性[^3]。 #### 注意事项 - 动态改变 DOM 的时候要注意 key 值的独特性和稳定性,这有助于提高性能和防止潜在 bug。 - 对于复杂应用场景下的表单管理建议引入状态管理模式简化维护成本。 - 当面对大量重复性的 UI 构建工作时,思考能否抽象公共组件减少冗余代码量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值