this.$refs[formName].validate is not a function

本文讲述了在Vue中遇到的多form循环渲染时,如何正确获取并验证表单的问题。作者揭示了由于渲染的表单数组特性,需要通过$refs动态取第0个元素来调用validate方法。关键在于理解每个form引用的是独立数据,且需注意表单组件的合理放置和引用方式。

引言

本文解决 for 循环中对表单进行渲染的问题, 在这种情况下获得表单的方法会得到一个数组而不是对象, 直接使用 validate 方法会报错; 另外通过断点调试了一下得到的结果, 发现确实是一个数组对象, 而且数组长度正式被渲染的表单数.

原文地址: http://blog.duhbb.com/2022/02/16/error-occurs-when-form-is-loop-generated/

欢迎访问我的博客: http://blog.duhbb.com/

循环渲染 form

记录 elementui 中 form 使用的一个坑: 当使用循环渲染来同时使用多个 form 的时候, 直接使用官方示例代码来使用 form 的方法会报错, 正确的写法是这样:

this.$refs[form][0].validate()

注意重点是后面加了数组取第 1 位的写法, 因为此时直接用 form 的 ref 名字去寻找它的时候会发现返回了一个数组, 用 this.$refs[form] 的写法就会出现找不到对象的情况.

以上内容来自: https://blog.youkuaiyun.com/github_37673306/article/details/108710979

原因探讨

难道是因为模板中渲染了多个 "相同的表单", 而这些表单指向的 data() 中的响应对象是一样的, 只要有一个表单修改了数据, 其他的表单关联的数据也会被修改, 所以我们只要取第一个就行了?

项目中的验证

主要是看下 this.$refs[form] 会得到什么东西.

通过断点可以看到 this.$refs[form] 得到了一个表单数组, 而且数组的个数恰好是表单渲染的个数.

表单放在循环中生成

Form 组件, 最好不要放到遍历里面, 不然 ref 里的 formdata 是谁的都不知道.

或者改成

<Form ref='"formdata"+i' :model="formdata" :label-width="120">

其实你这个没必要去生成两个表单。而且一个 submit 只能提交一个表单.

表单的其他的坑

另外表单的坑还可以参考下面几个, 感觉总结比较全面:

结束语

本文解决 for 循环中对表单进行渲染的问题, 在这种情况下获得表单的方法会得到一个数组而不是对象, 直接使用 validate 方法会报错; 另外通过断点调试了一下得到的结果, 发现确实是一个数组对象, 而且数组长度正式被渲染的表单数.

原文地址: http://blog.duhbb.com/2022/02/16/error-occurs-when-form-is-loop-generated/

欢迎访问我的博客: http://blog.duhbb.com/

### Vue.js 中 `this.$refs[formName]` 的用法及常见问题 #### 一、基本概念 在 Vue.js 中,`this.$refs` 是一个特殊属性,用于访问通过 `ref` 属性标记的 DOM 元素或子组件实例[^1]。当与 Element UI 结合使用时,可以通过 `this.$refs[formName]` 来调用表单的相关方法,比如验证功能。 #### 二、示例代码 以下是基于 Element UI 和 Vue.js 实现的一个简单表单提交并触发验证的例子: ```javascript <template> <el-form :model="ruleForm" ref="ruleForm" label-width="100px"> <el-form-item label="用户名" prop="username"> <el-input v-model="ruleForm.username"></el-input> </el-form-item> <el-button type="primary" @click="submitForm('ruleForm')">提交</el-button> </el-form> </template> <script> export default { data() { return { ruleForm: { username: '' } }; }, methods: { submitForm(formName) { this.$refs[formName].validate((valid) => { // 调用 validate 方法进行校验 if (valid) { console.log("表单数据有效"); } else { console.error("表单数据无效"); return false; } }); } } }; </script> ``` 上述代码展示了如何定义一个简单的表单并通过 `this.$refs[formName].validate()` 进行验证[^2]。 #### 三、常见问题及其解决方案 ##### 1. 验证函数未被执行 如果发现 `this.$refs[formName].validate()` 不生效,则可能是某些配置不当所致。例如,所有的 `prop` 必须绑定到 `<el-form-item>` 上而不是其内部的具体输入框上。 ##### 2. 报错 “this.$refs.validate is not a function” 此错误通常发生在动态生成表单的情况下。可能的原因包括: - **引用名称冲突**:确保 `ref` 值唯一且正确。 - **v-for 动态渲染问题**:当使用 `v-for` 渲染多个表单项时,需注意 `this.$refs` 返回的是数组而非单一对象。此时应调整为如下形式[^3]: ```javascript this.$refs[formName][index].validate(valid => {}); ``` ##### 3. 提交逻辑异常处理 在实际开发中,建议对表单状态做更细致的判断。例如,在 `else` 分支下可以显示具体的错误提示信息。参考以下改进版实现[^4]: ```javascript submitForm(formName) { this.$refs[formName][0]?.validate((valid) => { // 如果存在则执行 validate if (valid) { this.$message.success("保存成功!"); } else { this.$message.error("信息不完善,无法保存!!"); return false; } }); } ``` #### 四、总结 通过对 `this.$refs[formName]` 的合理运用,开发者能够轻松完成复杂的表单操作和验证流程。需要注意的是,不同场景下的具体实现可能存在差异,务必仔细阅读官方文档及相关资料以避免潜在陷阱。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值