【问题标题】:Reactjs Scroll to first error on form submission of a large formReactjs滚动到大型表单提交的第一个错误
【发布时间】:2020-07-28 15:53:36
【问题描述】:

我正在使用 Material UI 和 typescript 并有一个表单。在提交表单时,如果输入有验证错误,我想滚动到第一个出现验证错误的输入。我在下面粘贴了简单的表单代码,它在提交时在城镇输入中注入验证错误。实际上,错误可能出现在任何或多个输入中。

import React, { useState, FormEvent } from 'react';
import { Grid, TextField, Button } from '@material-ui/core';

const ScrollTest = () => {
  const [state, setState] = useState<{ town: string; county: string }>({
    town: '',
    county: '',
  });

  const [error, setError] = useState({ town: '', county: '' });

  const handleChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
    const { name, value } = e.target;
    const errorVal = !value ? `${name} is requied` : '';
    setState({ ...state, [name]: value });
    setError({ ...error, [name]: errorVal });
  };

  const handleSubmit = (e: FormEvent) => {
    e.preventDefault();
    if (!state.town) {
      setError({ ...error, town: 'Town input is required' });
    }
  };

  return (
    <>
      <form onSubmit={(e) => handleSubmit(e)} noValidate>
        <Grid container justify='center' alignItems='center' spacing={2}>
          <Grid item xs={12} md={6}>
            <TextField
              error={!!error.town}
              variant='outlined'
              fullWidth
              id='town'
              label='Town'
              name='town'
              autoComplete='town'
              placeholder='Town *'
              value={state.town || ''}
              onChange={handleChange}
              helperText={error.town}
            />
          </Grid>
        </Grid>
        <Grid container justify='center' alignItems='center' spacing={2}>
          <Grid item xs={12} md={6}>
            <TextField
              error={!!error.county}
              variant='outlined'
              fullWidth
              id='county'
              label='County'
              name='county'
              autoComplete='county'
              placeholder='County'
              value={state.county || ''}
              onChange={handleChange}
              helperText={error.county}
            />
          </Grid>
        </Grid>
        <Grid container justify='center' alignItems='center' spacing={2}>
          <Grid item xs={12} md={6}>
            <TextField
              variant='outlined'
              fullWidth
              id='county2'
              label='County2'
              name='county2'
              autoComplete='county2'
              placeholder='County2'
              value={state.county || ''}
              onChange={handleChange}
            />
          </Grid>
        </Grid>
        <br></br> <br></br> <br></br> <br></br> <br></br> <br></br> <br></br> <br></br>{' '}
        <br></br> <br></br> <br></br> <br></br> <br></br> <br></br> <br></br> <br></br>{' '}
        <br></br> <br></br> <br></br> <br></br> <br></br> <br></br> <br></br> <br></br>{' '}
        <br></br> <br></br> <br></br> <br></br> <br></br> <br></br> <br></br> <br></br>{' '}
        <br></br> <br></br> <br></br> <br></br> <br></br> <br></br> <br></br> <br></br>{' '}
        <br></br> <br></br> <br></br>
        <Grid container justify='center' alignItems='center'>
          <Grid item xs={12} md={6}>
            <Button type='submit' fullWidth variant='contained' color='primary'>
              Update profile
            </Button>
          </Grid>
        </Grid>
      </form>
    </>
  );
};

export default ScrollTest;

知道如何滚动到出现验证错误的第一个输入。

【问题讨论】:

    标签: reactjs typescript material-ui js-scrollintoview


    【解决方案1】:
                                 <Button
                                    disabled={isSubmitting}
                                    variant="contained"
                                    color="primary"
                                    onClick={() => {
                                        const err = Object.keys(errors);
                                        if (err.length) {
                                            const input = document.querySelector(
                                                `input[name=${err[0]}]`
                                            );
    
                                            input.scrollIntoView({
                                                behavior: 'smooth',
                                                block: 'center',
                                                inline: 'start',
                                            });
                                        }
                                        submitForm();
                                    }}
                                >
                                    {isSubmitting ? (
                                        <CircularProgress size={22} />
                                    ) : (
                                        'Submit'
                                    )}
                                </Button>
    

    这是使用 Formik 滚动到大表单中的第一个错误最简单的方法,我在 Formik 提交按钮中执行此操作,其中 errors 对象和 submitForm() 函数来自 Formik

    【讨论】:

    • 谢谢你的回答对我帮助很大:)
    【解决方案2】:

    我认为您可以保存出现错误的输入的引用,您可以滚动到该引用,您可以参考 this 我认为

    【讨论】:

    • 我遇到的问题是我的表单很大并且包含具有输入的子组件。知道我是否可以使用类或 id 滚动查看?或者如何在父母和孩子之间传递参考?
    • 好的,你可以使用element = document.getElementById("the_id")element.scrollIntoView({behavior: 'smooth'});,我想你正在寻找这个
    猜你喜欢
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 2015-07-29
    • 2014-10-12
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    相关资源
    最近更新 更多