vue为遍历生成的表单设置ref属性

本文讲述了作者在使用Vue开发时遇到的问题,如何在v-for循环的表单中正确地通过`ref`和`index`进行重置,以及注意事项,确保非遍历表单和遍历表单的`resetFields()`方法应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在写表单重置的时候出现了问题,在this.$refs[formName].resetFields();的时候卡了很久。
经过网上的搜索终于解决的问题!

对于不需要遍历的表单

这是vue代码:

        <el-dialog title="段落描述" :visible.sync="dialogFormVisible">
          <el-form ref="test" :model="test" label-width="150px">
            <el-form-item prop="subtitle">
              <span slot="label">
                <span style="color:#333;font-size: 16px;"><strong>段落关键词</strong></span>
              </span>
              <el-input v-model="test.subtitle" clearable placeholder="请填写段落关键词"></el-input>
            </el-form-item>
            <el-form-item prop="maxLength">
              <span slot="label">
                <span style="color:#333;font-size: 16px;"><strong>段落最大字数</strong></span>
              </span>
              <el-input v-model="test.maxLength" clearable placeholder="请输入段落最大字数"></el-input>
            </el-form-item>
          </el-form>
          <div slot="footer" class="dialog-footer">
            <el-button @click="resetForm('test')">取 消</el-button>
            <el-button type="primary" @click="paragraphDefine">保 存</el-button>
          </div>
        </el-dialog>

这里是js代码:

resetForm(formName) {
    this.$refs[formName].resetFields();
}

要注意的地方:
要设置prop属性,与复制的对象一致。
保证ref的值唯一即可。
在这里插入图片描述

对于需要遍历的表单:

		<el-dialog title="段落描述" :visible.sync="dialogFormVisible">
          <div v-for="(item, index) in numberFormsList" :key="index">
            <el-form :ref="`paragraph${index}`" :model="paragraph[index]" label-width="150px">
              <el-form-item prop="subtitle">
                <span slot="label">
                  <span style="color:#333;font-size: 16px;"><strong>段落{{ index + 1 }}关键词</strong></span>
                </span>
                <el-input v-model="paragraph[index].subtitle" clearable placeholder="请填写段落关键词"></el-input>
              </el-form-item>
              <el-form-item prop="maxLength">
                <span slot="label">
                  <span style="color:#333;font-size: 16px;"><strong>段落{{index+1}}最大字数</strong></span>
                </span>
                <el-input v-model="paragraph[index].maxLength" clearable placeholder="请输入段落最大字数"></el-input>
              </el-form-item>
            </el-form>
          </div>
          <div slot="footer" class="dialog-footer">
            <el-button @click="resetForm('paragraph')">取 消</el-button>
            <el-button type="primary" @click="paragraphDefine">保 存</el-button>
          </div>
        </el-dialog>

vue代码中唯一改变的地方是:

:ref="`paragraph${index}`"

我这里为了保持ref的唯一性,将index作为了后缀
如何重置这个由v-for循环生成的表单呢?

lresetForm(formName) {
   let i = 0;
   while (i < parseInt(this.form.number)) {
     this.$refs['paragraph' + i][0].resetFields();
     i++;
   }
},

注意:这里要加一个[0]
不然就会报错this.$refs.paragraph0.resetFields is not a function

这是因为我们打印一下:

console.log("0ref:", this.$refs['paragraph0']);

这里下面还有一个[0],然后才看得到resetFields()
在这里插入图片描述
对于不是v-for循环生成的表单,打印出来是这样的:

console.log("formref:", this.$refs['form']);

在这里插入图片描述
好了!这样就可以对v-for循环生成的表单进行重置了!

### Vue 中动态生成表单的方法 在现代 Web 开发中,表单是用户与应用程序交互的重要组成部分。为了提高灵活性和代码复用性,可以采用基于 JSON 配置的方式,在运行时动态创建表单视图[^1]。 #### 使用 Vue 3 实现动态表单生成功能 通过定义一组配置项来描述各个字段的属性,可以在不修改模板的情况下轻松调整表单结构。下面是一个简单的例子: ```javascript // 表单配置数据 const formConfig = [ { type: 'input', label: '用户名', prop: 'username' }, { type: 'select', label: '性别', prop: 'gender', options: ['男', '女'] } ]; export default { data() { return { formData: {}, fields: formConfig, }; }, }; ``` 对于上述 `fields` 数组中的每一项,可以根据其 `type` 属性渲染不同的组件实例。例如,当遇到 `'input'` 类型时,则呈现 `<el-input>`;如果是 `'select'` 则对应于 `<el-select>` 等等[^2]。 #### 处理响应式更新 如果需要向已存在的对象内部添加新的键值对并保持该对象具有响应能力,可利用 `Vue.set()` 函数完成操作[^3]。这有助于确保即使是在深层嵌套的数据结构里新增加的内容也能够被框架自动追踪变化情况。 #### 设置表单项样式布局参数 为了让页面看起来更加美观整齐,还可以设置一些额外的样式选项,比如指定标签位置以及宽度等特性。这些都可以作为父级容器 (`<el-form>`) 的 props 来传递给子元素(`<el-form-item>`)[^4]。 ```html <template> <div id="app"> <!-- 定义一个 el-form --> <el-form :model="formData" ref="ruleFormRef" status-icon inline-message> <!-- 循环遍历 fields 渲染不同类型的输入控件 --> <el-form-item v-for="(field, index) in fields" :key="index" :prop="field.prop" :rules="{ required: true }" :label-width="'80px'" :label-position="'right'" > <component :is="getComponent(field.type)" /> </el-form-item> <!-- 提交按钮 --> <el-button @click.prevent="submit">提交</el-button> </el-form> </div> </template> <script setup lang="ts"> import { reactive, computed } from 'vue'; import ElInput from './components/ElInput.vue'; // 自定义 input 组件 import ElSelect from './components/ElSelect.vue'; // 自定义 select 组件 function getComponent(type:string){ switch (type.toLowerCase()){ case 'input': return ElInput; case 'select': return ElSelect; default: throw new Error('未知类型'); } } let formData = reactive({}); </script> ``` 此段代码展示了如何根据传入的不同字段类型选择合适的自定义组件进行展示,并且设置了统一的标签宽度及对其方式。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值