Приложение React работает не так, как предполагалось при отправке формы

#reactjs #axios #react-hooks

Вопрос:

Я создал страницу регистрации для своего веб-приложения с помощью React. Вот мой код для компонента регистрации —

 import React, { useState } from 'react';
import { Avatar,  Button, Paper, Grid, Typography, Container } from '@material-ui/core';
import axios from "axios";
import useStyles from './styles';
import Input from './Input';


const initialState = { name: '', email: '', password: '', mobile: '', confirmPassword: '' };

const Register = () => {
  const [form, setForm] = useState(initialState);
  const classes = useStyles();
  const handleSubmit = async () => {
      const { data } = await axios.post('http://localhost:4000/users/register', initialState);
      console.log(data); 
  };
  const handleChange = (e) => setForm({ ...form, [e.target.name]: e.target.value });
  return (
    <div>
      <Container component="main" maxWidth="xs">
        <Paper className={classes.paper} elevation={3}>
          <Typography component="h1" variant="h5">Sign up</Typography>
          <form className={classes.form} onSubmit={handleSubmit}>
            <Grid container spacing={2}>
                <Input name="name" label="Full Name" handleChange={handleChange} autoFocus/>
                <Input name="mobile" label="Mobile Number" handleChange={handleChange}/>
                <Input name="email" label="Email Address" handleChange={handleChange} type="email"/>
                <Input name="password" label="Password" handleChange={handleChange} type='password'/>
                <Input name="confirmPassword" label="Confirm Password" handleChange={handleChange} type="password"/>
            </Grid>
            <Button type="submit" fullWidth variant="contained" color="primary" className={classes.submit}>
              Sign Up
            </Button>
          </form>
        </Paper>
      </Container>
    </div>
  );
};
export default Register;
 

При отправке формы на стороне сервера запрос не выполняется. Вместо этого он снова перенаправляет на ту же страницу с параметрами запроса, равными входным телам формы. Что я здесь делаю не так?

Комментарии:

1. были ли отправлены какие-либо запросы на вкладке «Сеть»?

2. На каких портах работают ваши клиент и сервер?

3. Клиент @RichardHpa работает на порту 3000, сервер ans-на 4000.

4. запрос @djolf отправляется на стороне сервера, но страница повторно отображается при отправке формы

Ответ №1:

Вы не препятствуете действию формы по умолчанию. Поскольку вы используете стандартную html-форму, отправив ее, вы просто отправите запрос get по умолчанию, который будет включать значения в URL-адресе, как вы сказали.

Предотвращение использования по умолчанию позволит вам затем выполнить действие, отличное от действия по умолчанию, например, вызов axios, который вы хотите.

   const handleSubmit = async (e) => {
      e.preventDefault()
      const { data } = await axios.post('http://localhost:4000/users/register', initialState);
      console.log(data); 
  };

 

Ответ №2:

Используйте event.preventDefault() в handelSubmit, так как это остановит действие браузера по умолчанию, которое перезагружается при отправке формы.

 const handleSubmit = async (event) => {
      event.preventDefault();
      // other line of code
};
 

Комментарии:

1. Это то же самое, что и мой ответ, который я уже опубликовал. Дважды проверьте, чтобы убедиться, что тот же ответ еще не был дан. Другие люди могут проголосовать против вашего ответа.