react+ant.design Form表单校验失败自动滚动到

2022-07-29  本文已影响0人  燕自浩
1. 一定要在Form标签上添加scrollToFirstError属性,触发要使用Button上面的htmlType="submit"方可。注意:Button要在Form标签内部包裹
<Form
  form={form}
  scrollToFirstError
  onFinish={onSubmit}
>
  <Row>
    <Col span={8}>
      <Item
        name="name"
        {...layout}
        label="承租方名称(中)"
        rules={[{ required: true, message: '请输入' }]}
        >
        <Input />
      </Item>
    </Col>
    <Col span={8}>
      <Item {...layout} name="english_name" label="承租方名称(英)">
        <Input />
      </Item>
    </Col>
  </Row>
  <Button loading={loading} type="primary" htmlType="submit">
</Form>

缺点:不一定能准确的滑动到第一个校验不通过的Form表单
优点:使用方便,代码简洁

2.使用Form提供的校验不通过的事件来处理
<Form
  form={form}
  onFinish={onSubmit}
  onFinishFailed={() => {
    // 核心代码
    const errorList = (document as any).querySelectorAll(".ant-form-item-has-error");
    // 由于校验失败ant会自动给失败表单项添加类名,直接获取即可
    errorList[0].scrollIntoView({
      block: "center",
      behavior: "smooth",
    });
  }}
>
  <Row>
    <Col span={8}>
      <Item
        name="name"
        {...layout}
        label="承租方名称(中)"
        rules={[{ required: true, message: '请输入' }]}
        >
        <Input />
      </Item>
    </Col>
    <Col span={8}>
      <Item {...layout} name="english_name" label="承租方名称(英)">
        <Input />
      </Item>
    </Col>
  </Row>
  // 这个时候不一定需要把Button放到Form标签内部也不一定需要使用htmlType属性
  <Button loading={loading} type="primary" htmlType="submit">
</Form>

缺点:需要获取DOM 代码量增多
优点:能够很完美的实现需求同时弥补方案一的短板

总结:如果方案一能满足您的需求建议使用方案一如果不行再使用方案二,首选方案一

上一篇下一篇

猜你喜欢

热点阅读