el-form多个表单共用一个ref,引发的校验问题及解决方案

问题

代码当中有多个tab,会循环渲染多个Form(底层是用elment-plus的Form二次封装的),多个Form共用一个ref,这样导致的问题是tab切换时,上一个tab的表单项还会校验,需求是只校验当前tab的表单项。

function renderForm(tab: string) {
      if (!widgetRef.value![tab]) return null;

      const { props, template } = widgetRef.value![tab];
      const { itemWidth, size, labelWidth, disabled, effects } = props;
      const formProps = {};
      itemWidth && (formProps['item-width'] = itemWidth);
      labelWidth && (formProps['label-width'] = labelWidth);
      size && (formProps['size'] = size);
      disabled !== false && (formProps['disabled'] = disabled);
      return (
        <Form ref={formRef} model={dataRef.value} {...formProps}>
          {template.map((node) => renderComponent(node, effects, tab))}
        </Form>
      );
 }

问题分析

查看element-plus源码后发现,el-form的validate方法会循环校验每个field,返回一个Promise
结合上述问题分析,formRef还绑定的是上一个tab的表单实例,没有更新过来,导致校验的是上一个tab的表单项
在这里插入图片描述

解决方案

function renderForm(tab: string) {
      if (!widgetRef.value![tab]) return null;

      const { props, template } = widgetRef.value![tab];
      const { itemWidth, size, labelWidth, disabled, effects } = props;
      const formProps = {};
      itemWidth && (formProps['item-width'] = itemWidth);
      labelWidth && (formProps['label-width'] = labelWidth);
      size && (formProps['size'] = size);
      disabled !== false && (formProps['disabled'] = disabled);
      // 此处多个Form用不同的ref,ref实例存储存储在一个对象中,解决了tab切换时,上一个tab的表单项还会校验问题
      const ref = [PageTypeEnum.Setting, PageTypeEnum.TenantSetting].includes(pageTypeRef.value)
        ? formRef[tab]
        : formRef;
      return (
        <Form ref={ref} model={dataRef.value} {...formProps}>
          {template.map((node) => renderComponent(node, effects, tab))}
        </Form>
      );
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值