iview form表单resetFields方法不起作用

本文详细介绍如何在Vue中使用resetFields方法对表单进行清空重置,包括Form组件的ref属性设置、FormItem包裹表单元素及正确使用prop属性等关键步骤。

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

<template>
   <Form ref="form1" :model="formItem" :label-width="60">
       <FormItem label="名称" prop="title">
           <Input v-model="formItem.title"/>
       </FormItem>
  </Form>
  <Button @click="reset">重置</Button>
</template>
<script>
    export default {
    	data () {
            return {
                formItem: {
                    title: ''
                }
            }
         },
         methods: {
		 	reset(){
				this.$refs.form1.resetFields();
			}
		 }
    }
</script>

使用resetFields对form进行清空重置有以下三点需要注意:

  1. Form 使用ref="form1"以便方法中进行引用
  2. 需要重置的表单元素使用FormItem包裹
  3. FormItem标签中的prop属性需要填写对应表单域 model 里的字段
    由于Form标签的:model="formItem",所以prop直接写title即可,对应data中的
    formItem.title
<think>我们之前讨论的是在Select组件中通过插槽嵌入表格并实现动态添加行的功能。现在用户的问题是如何在iView表单组件中实现添加一行的功能。注意,用户引用了两个示例:一个是嵌套表格(使用expand展开),另一个是表单中横向排列输入框。但用户的核心需求是在表单中实现添加一行(可能是动态增加表单项)。 根据用户需求,我们可以这样理解: 用户想要在iViewForm表单中,实现动态添加表单项(一行)的功能。这通常用于动态表单,比如用户点击“添加”按钮,就新增一行输入框等。 实现思路: 1. 使用v-for循环渲染多个表单项(FormItem),每个表单项对应一行。 2. 数据驱动:在data中维护一个数组,数组中的每个元素代表一行的数据。 3. 添加行:向数组中添加一个新的元素,从而渲染出新的一行。 4. 删除行:从数组中移除对应的元素,该行消失。 下面是一个具体的示例,展示如何在iViewForm表单中动态添加一行(包含两个输入框和一个删除按钮):</think># 在 iView 表单组件中实现动态添加行功能 根据您的需求,我将在 iView 表单组件中实现动态添加行的功能,这与之前讨论的 Select 组件中嵌套表格的实现有所不同,但核心思路类似。 ## 实现思路 1. **数据驱动**:使用 Vue 的响应式数据管理表单行数据 2. **动态渲染**:通过 `v-for` 指令动态生成表单行 3. **表单验证**:集成 iView表单验证功能 4. **数据管理**:使用数组存储多行数据,支持添加/删除行 下面是完整的实现代码: ```html <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>iView 表单动态添加行</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/iview@3.5.4/dist/styles/iview.css"> <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script> <script src="https://cdn.jsdelivr.net/npm/iview@3.5.4/dist/iview.min.js"></script> <style> body { font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; background-color: #f5f7fa; padding: 20px; color: #333; } .container { max-width: 1000px; margin: 0 auto; background: white; border-radius: 8px; box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); padding: 25px; } h1 { color: #2d8cf0; text-align: center; margin-bottom: 30px; padding-bottom: 15px; border-bottom: 1px solid #e8eaec; } .form-section { margin-bottom: 30px; } .form-row { display: flex; align-items: center; padding: 15px; border: 1px solid #dcdee2; border-radius: 4px; margin-bottom: 15px; background: #f8f9fb; transition: all 0.3s; } .form-row:hover { background: #f0f7ff; border-color: #2d8cf0; } .form-row > div { flex: 1; margin-right: 15px; } .form-row > div:last-child { margin-right: 0; flex: 0 0 120px; text-align: right; } .actions { display: flex; justify-content: space-between; margin-top: 25px; padding-top: 20px; border-top: 1px solid #e8eaec; } .add-row-btn { margin-bottom: 20px; background: #19be6b; border-color: #19be6b; } .delete-btn { background: #ed4014; border-color: #ed4014; } .summary-card { margin-top: 30px; padding: 20px; background: #f8f9fb; border-radius: 4px; border-left: 4px solid #2d8cf0; } .summary-card h3 { margin-top: 0; color: #2d8cf0; } .highlight { background: #fffbe6; padding: 5px 10px; border-radius: 3px; border: 1px solid #ffe58f; } .instructions { background: #f0faff; padding: 15px; border-radius: 4px; border-left: 4px solid #2d8cf0; margin-bottom: 25px; } .instructions h3 { margin-top: 0; color: #2d8cf0; } .instructions ul { padding-left: 20px; } .instructions li { margin-bottom: 8px; } </style> </head> <body> <div id="app"> <div class="container"> <h1>iView 表单动态添加行功能</h1> <div class="instructions"> <h3>使用说明:</h3> <ul> <li>点击 <span class="highlight">+ 添加新行</span> 按钮添加新表单行</li> <li>每行包含产品名称、数量、单价和操作按钮</li> <li>点击 <i-button type="error" size="small">删除</i-button> 按钮删除当前行</li> <li>表单数据会自动计算小计和总计</li> <li>点击 <i-button type="primary">提交表单</i-button> 验证并提交数据</li> </ul> </div> <i-form ref="form" :model="formData" :rules="formRules" label-width="100"> <div class="form-section"> <h2>订单基本信息</h2> <i-form-item label="订单编号" prop="orderNo"> <i-input v-model="formData.orderNo" placeholder="请输入订单编号"></i-input> </i-form-item> <i-form-item label="客户名称" prop="customer"> <i-input v-model="formData.customer" placeholder="请输入客户名称"></i-input> </i-form-item> </div> <div class="form-section"> <div style="display: flex; justify-content: space-between; align-items: center;"> <h2>订单明细</h2> <i-button type="primary" icon="md-add" class="add-row-btn" @click="addNewRow">+ 添加新行</i-button> </div> <!-- 动态表单行 --> <div v-for="(row, index) in formData.items" :key="row.id" class="form-row"> <div> <i-form-item :prop="'items.' + index + '.product'" :rules="formRules.product"> <i-input v-model="row.product" placeholder="产品名称" clearable></i-input> </i-form-item> </div> <div> <i-form-item :prop="'items.' + index + '.quantity'" :rules="formRules.quantity"> <i-input-number v-model="row.quantity" :min="1" :max="100" placeholder="数量"></i-input-number> </i-form-item> </div> <div> <i-form-item :prop="'items.' + index + '.price'" :rules="formRules.price"> <i-input-number v-model="row.price" :min="0" :step="0.1" placeholder="单价"></i-input-number> </i-form-item> </div> <div> <i-form-item> <span style="margin-right: 10px; color: #2d8cf0; font-weight: bold;">小计: ¥{{ calculateSubtotal(row) }}</span> <i-button type="error" size="small" icon="md-close" @click="removeRow(index)">删除</i-button> </i-form-item> </div> </div> </div> <div class="summary-card"> <h3>订单总计</h3> <p>产品数量: <span class="highlight">{{ formData.items.length }} 种</span></p> <p>总金额: <span class="highlight">¥{{ calculateTotal() }}</span></p> </div> <div class="actions"> <i-button type="warning" @click="resetForm">重置表单</i-button> <i-button type="primary" @click="handleSubmit">提交表单</i-button> </div> </i-form> </div> </div> <script> new Vue({ el: '#app', data() { return { formData: { orderNo: '', customer: '', items: [ { id: Date.now(), product: '', quantity: 1, price: 0 } ] }, formRules: { orderNo: [ { required: true, message: '订单编号不能为空', trigger: 'blur' } ], customer: [ { required: true, message: '客户名称不能为空', trigger: 'blur' } ], product: [ { required: true, message: '产品名称不能为空', trigger: 'blur' } ], quantity: [ { required: true, type: 'number', message: '数量不能为空', trigger: 'blur' }, { type: 'number', min: 1, message: '数量至少为1', trigger: 'blur' } ], price: [ { required: true, type: 'number', message: '单价不能为空', trigger: 'blur' }, { type: 'number', min: 0, message: '单价不能为负数', trigger: 'blur' } ] } } }, methods: { // 添加新行 addNewRow() { this.formData.items.push({ id: Date.now() + this.formData.items.length, product: '', quantity: 1, price: 0 }); }, // 删除行 removeRow(index) { if (this.formData.items.length > 1) { this.formData.items.splice(index, 1); } else { this.$Message.warning('至少需要保留一项'); } }, // 计算小计 calculateSubtotal(row) { return (row.quantity * row.price).toFixed(2); }, // 计算总计 calculateTotal() { return this.formData.items.reduce((total, row) => { return total + (row.quantity * row.price); }, 0).toFixed(2); }, // 提交表单 handleSubmit() { this.$refs.form.validate(valid => { if (valid) { this.$Message.success('表单验证成功!'); console.log('提交的数据:', JSON.stringify(this.formData, null, 2)); // 这里可以添加API调用 // this.submitData(); } else { this.$Message.error('表单验证失败,请检查输入'); } }); }, // 重置表单 resetForm() { this.$refs.form.resetFields(); this.formData.items = [ { id: Date.now(), product: '', quantity: 1, price: 0 } ]; this.$Message.info('表单已重置'); }, // 模拟API提交 submitData() { this.$Message.loading({ content: '提交中...', duration: 0 }); // 模拟API请求 setTimeout(() => { this.$Message.destroy(); this.$Message.success('数据提交成功!'); }, 1500); } } }); </script> </body> </html> ``` ## 关键实现说明 1. **动态表单行管理**: ```javascript addNewRow() { this.formData.items.push({ id: Date.now() + this.formData.items.length, product: '', quantity: 1, price: 0 }); } ``` 2. **表单验证集成**: ```javascript formRules: { product: [ { required: true, message: '产品名称不能为空', trigger: 'blur' } ], // 其他验证规则... } ``` 3. **动态绑定验证规则**: ```html <i-form-item :prop="'items.' + index + '.product'" :rules="formRules.product"> ``` 4. **行内计算功能**: ```javascript calculateSubtotal(row) { return (row.quantity * row.price).toFixed(2); } ``` 5. **表单提交处理**: ```javascript handleSubmit() { this.$refs.form.validate(valid => { if (valid) { // 提交数据 } }); } ``` ## 与之前Select组件实现的区别 1. **数据结构不同**: - 表单组件使用平面数组存储多行数据 - Select组件使用嵌套对象存储每个选项的独立数据 2. **渲染方式不同**: - 表单组件使用`v-for`直接渲染多行 - Select组件使用作用域插槽在特定位置渲染表格 3. **验证机制**: - 表单组件内置了强大的验证功能 - Select组件中的表格需要自定义验证逻辑 ## 相关问题 1. 如何在动态添加的表单行中实现更复杂的验证逻辑? 2. 如何优化大量动态表单行的渲染性能? 3. 怎样在动态表单中实现数据的实时保存功能? 4. 如何将动态表单数据与后端API集成?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值