setState не работает после отправки, но данные обновляются в базе данных

#reactjs #laravel #api

Вопрос:

Я новичок в react и работаю над reactjs с помощью laravel api.

Я разработал форму с использованием reactjs и планирую отправить данные формы в базу данных phpmyadmin, используя laravel в качестве api.

Проблема в том, что если я отправляю данные, я использую setState для очистки данных формы, но это не так; но данные вводятся в базу данных phpmyadmin. Я даже пытаюсь записать ответ от api в консоль, но на консоли браузера нет сообщения.

Вот мой код на конце реакции:

 import React, { Component } from 'react';
import { Link } from 'react-router-dom';
import axios from 'axios';

class Addstudent extends Component {
  state = {
    name: '',
    course: '',
    email: '',
    phone: '',
  };

  handleInput = (e) => {
    this.setState({
      [e.target.name]: e.target.value,
    });
  };

  saveStudent = async (e) => {
    e.preventDefault();

    const res = await axios.post(
      'http://localhost:8000/api/add-student',
      this.state
    );

    if (res.data.status === 200) {
      console.log(res.data.message);
      this.setState({
        name: '',
        course: '',
        email: '',
        phone: '',
      });
    }
  };

  render() {
    return (
      <div className="container">
        <div className="row">
          <div className="col-md-12">
            <div className="card">
              <div className="card">
                <div className="card-header">
                  <h4>Add Students</h4>
                  <Link to={'/'} className="btn btn-primary btn-sm float-end">
                    Back
                  </Link>
                </div>

                <div className="card-body">
                  <form onSubmit={this.saveStudent}>
                    <div className="form-group mb-3">
                      <label>Student Name</label>
                      <input
                        type="text"
                        name="name"
                        onChange={this.handleInput}
                        className="form-control"
                        placeholder="Enter Name"
                        value={this.state.name}
                      ></input>
                    </div>

                    <div className="form-group mb-3">
                      <label>Student Course</label>
                      <input
                        type="text"
                        name="course"
                        onChange={this.handleInput}
                        className="form-control"
                        placeholder="Enter Course"
                        value={this.state.course}
                      ></input>
                    </div>
                    <div className="form-group mb-3">
                      <label>Student Email</label>
                      <input
                        type="text"
                        name="email"
                        onChange={this.handleInput}
                        className="form-control"
                        placeholder="Enter Email"
                        value={this.state.email}
                      ></input>
                    </div>
                    <div className="form-group mb-3">
                      <label>Student Phone</label>
                      <input
                        type="text"
                        name="phone"
                        onChange={this.handleInput}
                        className="form-control"
                        placeholder="Enter Phone"
                        value={this.state.phone}
                      ></input>
                    </div>
                    <div className="form-group mb-3">
                      <button type="submit" className="btn btn-primary">
                        Save Student
                      </button>
                    </div>
                  </form>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    );
  }
}

export default Addstudent;
 

На конце Laravel Вот код контроллера, обрабатывающего запрос post:

 <?php
namespace AppHttpControllersAPI;
use AppHttpControllersController;
use IlluminateHttpRequest;
use AppModelsStudent;

class StudentController extends Controller
{
    public function store(Request $request){
        $student = new Student;
        $student->name =$request->input('name');
        $student->course =$request->input('course');
        $student->email =$request->input('email');
        $student->phone =$request->input('phone');

        $student->save();

        return response()->json([
            'status'=> '200',
            'message'=>'Student Added Successfully',
        ]);
    }
}
 

Ответ №1:

Ваша функция handleInput перезаписывает ваше состояние только одним свойством, вы должны сохранить старые данные:

 this.setState(s => ({
  ...s,
  [e.target.name]: e.target.value,
}));
 

В противном случае вы никогда не отправите все значения в API, предполагая, что он там работает правильно

 if (res.data.status === 200) {
  console.log(res.data.message);
 

Это ведение журнала отлично подходит, если все работает хорошо, но вы также можете захотеть вести журнал, если что-то пойдет не так, чтобы вы могли заметить, что отправляете в базу данных не все значения:

 try {
   const res = await axios.post(
     'http://localhost:8000/api/add-student',
     this.state
   );
   // ... code using res
} catch(e) {
  console.error(e);
}