React async await пропускает первый ответ - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть компонент с двумя вспомогательными методами, которые вызывают создателей действий. Я ожидаю, что вспомогательные методы будут взаимодействовать с базой данных, а затем обработать все данные из базы данных

это вспомогательные методы:

 handleDeleteCourse = async course => {
    await this.props.deleteCourse(course && course.id);
    this.props.fetchCourses();
  };

  handleCreateCourse = async (state) => {
    await this.props.addCourse(state);
    this.props.fetchCourses();
  };

handleDeleteCourse прекрасно работает, У кнопки удаления с onClick, вызывающей вспомогательный метод delete, строка удаляется из БД, и вызывается действие this.props.fetchCourses();, которое останавливает все строки в базе данных (fetchCourses код ниже).

Проблема с handleCreateCourse Когда я нажимаю кнопку отмены, данные поступают в базу данных, но я не вижу новую строку на экране. Когда я отправляю новую строку, я вижу на экране данные, которые я отправил в прошлый раз.

Что может вызвать это? Я добавил addCourse создатель действий

    import React, { Component } from "react";
import { connect } from "react-redux";
import {
  Container,
  Form,
  Button,
  Col,
  Row,
  Table,
  striped,
  bordered,
  hover
} from "react-bootstrap";

import { fetchCourses, deleteCourse, addCourse } from "../../actions";

class Courses extends Component {
  state = {
    id: Math.random(),
    courseName: "",
    courseWeeklyHours: "",
    courseType: false
  };

  componentDidMount() {
    this.props.fetchCourses();
  }

  handleDeleteCourse = async course => {
    await this.props.deleteCourse(course && course.id);
    this.props.fetchCourses();
  };

  handleCreateCourse = async (state, e) => {
    await this.props.addCourse(state);
    this.props.fetchCourses();
  };

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

  render() {
    const prevProps = prevProps => {
      console.log("this.props", this.props.courses.length);
      console.log("prevProps ", prevProps.courses.length);
    };

    const courses = this.props.courses.map(course => {
      return (
        <tr key={course && course.id}>
          <td>
            {course.coursename}- {course && course.id}
          </td>

          <td>{course.coursetype ? "yes" : "no"}</td>

          <td>{course.courseweeklyhours}</td>

          <td>
            <button onClick={() => this.handleDeleteCourse(course)}>הסר</button>
          </td>
        </tr>
      );
    });

    return (
      <Container>
        <Table striped bordered hover className="text-right">
          <thead>
            <tr>
              <th>שם הקורס</th>
              <th>סוג הקורס</th>
              <th>שעות שבועיות</th>
              <th />
            </tr>
          </thead>
          <tbody>{courses}</tbody>
        </Table>

        {/* <Form onSubmit={this.onSubmit}> */}
        <Form>
          <Row>
            <Col>
              <Form.Group controlId="courseForm.ControlSelect1">
                <Form.Control
                  type="text"
                  name="courseName"
                  defaultValue={this.state.courseName}
                  onChange={this.onChange.bind(this)}
                />
              </Form.Group>
            </Col>
            <Col>
              <Form.Group controlId="formGridState">
                <Form.Control
                  as="select"
                  name="courseType"
                  defaultValue={this.state.courseType}
                  onChange={this.onChange.bind(this)}
                >
                  <option id="typeselect" value="">
                    Select...
                  </option>
                  <option value="1">אקדמי</option>
                  <option value="0">מכינה</option>
                </Form.Control>
                {this.state.courseTypeError}
              </Form.Group>
            </Col>
            <Col>
              <Form.Group>
                <Form.Control
                  type="number"
                  placeholder="Course grade"
                  name="courseWeeklyHours"
                  id="courseWeeklyHours"
                  defaultValue={this.state.courseWeeklyHours}
                  onChange={this.onChange.bind(this)}
                />
                {this.state.courseGradeError}
              </Form.Group>
            </Col>

            <Col>
              <Form.Group controlId="submit">
                {/* <Button variant="primary" type="submit" onClick={() => this.handleCreateCourse(this.state)}>
            submit
          </Button> */}
                <Button
                  variant="primary"
                  onClick={() => this.handleCreateCourse(this.state)}
                >
                  שלח
                </Button>
              </Form.Group>
            </Col>
          </Row>
        </Form>
      </Container>
    );
  }
}

const mapStateToProps = state => {
  console.log("state ", state);

  return {
    courses: state.courses
  };
};

export default connect(
  mapStateToProps,
  { fetchCourses, deleteCourse, addCourse }
)(Courses);

Действие fetchCourses:

export const fetchCourses = () => {
    return async (dispatch) => {
        const response = await mysql.get('courses/Courses.php');

        dispatch({
            type: FETCH_COURSES,
            payload: response
        })

    }

}

mysql var:

import axios from 'axios';

export default axios.create({
    baseURL: 'http://127.0.0.1/react/calc/api/'
});

создатель действия addCourse:

export const addCourse = (data) => {

    return (dispatch) => {
        fetch("http://127.0.0.1/react/calc/api/courses/Courses.php", {
                method: "POST",
                headers: {
                    'Accept': 'application/json',
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify(data)
            })
            .then(response => response.json())
            .then(json => {
                dispatch({
                    type: ADD_COURSE,
                    value: json
                });
                console.log('json ', json);
            })
            .catch(error =>
                console.log('parsing faild', error)
            )
    };
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...