element-plus自定义组件如何自动触发表单校验

自定义组件触发rules方法

项目使用:vue3+element-plus
在我们使用element-plus的时候,经常会用到el-form和它的表单校验。
在使用model、rules、prop之后,就可以完美的触发表单校验。

但是!问题来了,当el满足不了我,我自定义组件表单组件 的 v-model的数据类型是数组或者对象的时候,它竟然无法自动触发校验,每次都需要我主动去在外围触发!(😟,条件都一样,我想问题应该是在我的组件上面!)

于是我去翻了一下element的源码,找到一个v-model可能是数组的组件(el-checkbox-group)

然后我在里面发现了这个,看起来像是监听值变化,触发了校验规则!

// packages\components\checkbox\src\checkbox-group.vue
import { useFormItem } from "element-plus";
import { debugWarn } from "element-plus/es/utils/error";
...
const { formItem } = useFormItem();
...
watch(
  () => props.modelValue,
  () => {
    if (props.validateEvent) {
      formItem?.validate('change').catch((err) => debugWarn(err))
    }
  }
)

于是我把它拷贝到我的组件里,竟然可以了(比想象的顺利很多)。
出于好奇,我来看看这个formItem方法是干啥的
于是我点了进去

const useFormItem = () => {
  const form = inject(formContextKey, void 0);
  const formItem = inject(formItemContextKey, void 0);
  return {
    form,
    formItem
  };
};

这里我们可能已经隐约猜到了什么!!它触发了爸爸们或者爷爷们的校验方法啦!
有兴趣的同学可以去el-form-item或者el-form中找一下如何验证的。

让我们继续向下看👇
其实我不想看了,目的已经达到了,当然能触发校验的方法有很多,但是我只知道这一个😒。

==============
一个人学习太辛苦了,欢迎共享前端资源,相互进步(Q群362909884)
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现父组件校验多个子组件的表单,可以使用 Vue 的自定义事件和 ref 来实现。 首先,在父组件中,需要在每个子组件上使用 ref 来获取子组件的实例,例如: ```html <template> <div> <child-form ref="form1"></child-form> <child-form ref="form2"></child-form> <button @click="validateForms">校验表单</button> </div> </template> <script> import ChildForm from './ChildForm.vue' export default { components: { ChildForm }, methods: { validateForms() { // 获取子组件实例进行校验 this.$refs.form1.validateForm() this.$refs.form2.validateForm() } } } </script> ``` 然后,在每个子组件中,需要定义一个 validateForm 方法,用于校验表单,并通过自定义事件将校验结果传递给父组件,例如: ```html <template> <el-form :model="form" :rules="rules" ref="form"> <!-- 表单项省略 --> </el-form> </template> <script> export default { data() { return { form: { // 表单数据 }, rules: { // 表单校验规则 } } }, methods: { validateForm() { this.$refs.form.validate(valid => { // 触发自定义事件,将校验结果传递给父组件 this.$emit('validate', valid) }) } } } </script> ``` 最后,在父组件中,需要监听每个子组件的 validate 事件,并将结果存储起来,最终根据所有子组件的校验结果来决定是否通过整个表单校验,例如: ```html <template> <div> <child-form ref="form1" @validate="validations[0] = $event"></child-form> <child-form ref="form2" @validate="validations[1] = $event"></child-form> <button @click="validateForms">校验表单</button> </div> </template> <script> import ChildForm from './ChildForm.vue' export default { components: { ChildForm }, data() { return { validations: [] } }, methods: { validateForms() { // 重置校验结果 this.validations = [] // 获取子组件实例进行校验 this.$refs.form1.validateForm() this.$refs.form2.validateForm() // 判断所有子组件的校验结果是否都为 true const isValid = this.validations.every(valid => valid) if (isValid) { // 表单校验通过 } else { // 表单校验不通过 } } } } </script> ``` 以上就是实现父组件校验多个子组件的表单的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值