如果表单上的所有字段均成功通过验证,则页面崩溃

时间:2019-06-24 00:58:52

标签: javascript reactjs react-bootstrap

我正在尝试从Modal组件中输入的数据中提取Form组件中输入的数据。我已经在react-bootstrap文档中看到了类似的内容,然后制作了handleSubmit,如果一切都成功验证了,这似乎会使页面崩溃。但是,如果我保留一个未通过验证的字段,那么一切都会按预期运行。

我尝试过更改要验证的数据类型,更改了handleSubmit等。

 export default class Header extends Component {
  constructor(props, context) {
    super(props, context);

    this.handleShow = this.handleShow.bind(this);
    this.handleClose = this.handleClose.bind(this);

    this.state = {
      validated: false,
      file: null,
      store: "Target",
      pdf: true,
      price: 1.00,
      category: "Supplies",
      date: "01/01/2019",
      description: ""
    };
    this.handleSubmit = this.handleSubmit.bind(this);
    this.handleChange = this.handleChange.bind(this);
  }
  add = id => {
    this.props.add(this.state.pdf,this.state.store, this.state.date, this.state.price, this.state.category, this.state.description);
  };
  handleSubmit(event) {
    const form = event.currentTarget;
      if (form.checkValidity() === false) {
        event.preventDefault();
        event.stopPropagation();
        console.log("Failed");
      }
        this.setState({validated: true})
        this.props.add(this.state.pdf,this.state.store, this.state.date, this.state.price, this.state.category,this.state.description );

  }

继续,我的表单的布局如下:

render() {
    const { validated } = this.state;
    const divStyle2 = {
      padding: "1em"
    };
    return (
      <div>
        <link
          rel="stylesheet"
          href="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
          integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T"
          crossOrigin="anonymous"
        />
        <h4>
          <FontAwesomeIcon icon={faFileInvoiceDollar} />
          ?????????????
        </h4>

        <div style={divStyle2}>
          <Nav variant="pills" activeKey="/home" expand="lg">
            <Nav.Item>
              <Modal show={this.state.show} onHide={this.handleClose}>
                <Modal.Header closeButton>
                  <Modal.Title>??? ???????</Modal.Title>
                </Modal.Header>
                <Form
                  noValidate
                  validated={validated}
                  onSubmit={e => this.handleSubmit(e)}
                >
                  <Container>
                    <Form.Row>
                      <Form.Group as={Col} md="4" controlId="file">
                        <Form.Label>Receipt File*</Form.Label>
                        <Button variant="outline-dark">
                          <div className="files">
                            <Files
                              className="files-dropzone"
                              onChange={this.onFilesChange}
                              onError={this.onFilesError}
                              accepts={["image/png", ".pdf"]}
                              multiple
                              maxFiles={3}
                              maxFileSize={10000000}
                              minFileSize={0}
                              clickable
                            >
                              Browse
                            </Files>
                          </div>
                        </Button>
                      </Form.Group>
                    </Form.Row>
                    <Form.Row>
                      <Form.Group as={Col} md="6" controlId="vendor">
                        <Form.Label>Vendor/Retailer*</Form.Label>
                        <Form.Control type="text" placeholder="" required value={this.state.store} onChange={this.handleChange}/>
                        <Form.Control.Feedback type="invalid">
                          Please provide a vendor/retailer.
                        </Form.Control.Feedback>
                      </Form.Group>
                    </Form.Row>
                    <Form.Row>
                      <Form.Group as={Col} md="6" controlId="date">
                        <Form.Label>Transaction date*</Form.Label>
                        <Form.Control type="date" placeholder="" required value={this.state.date} onChange={this.handleChange}/>
                        <Form.Control.Feedback type="invalid">
                          Please provide a date.
                        </Form.Control.Feedback>
                      </Form.Group>
                    </Form.Row>
                    <Form.Row>
                      <Form.Group as={Col} md="6" controlId="price">
                        <Form.Label>Receipt total ($USD)*</Form.Label>
                        <Form.Control
                          type="number"
                          placeholder="0.00"
                          required
                          value={this.state.price} 
                          onChange={this.handleChange}
                        />
                        <Form.Control.Feedback type="invalid">
                          Please provide a valid price.
                        </Form.Control.Feedback>
                      </Form.Group>
                    </Form.Row>
                    <Form.Row>
                      <Form.Group as={Col} md="6" controlId="category">
                        <Form.Label>Category</Form.Label>
                        <Form.Control type="text" placeholder="" required value={this.state.category} onChange={this.handleChange}/>
                        <Form.Control.Feedback type="invalid">
                          Please provide a valid category.
                        </Form.Control.Feedback>
                      </Form.Group>
                    </Form.Row>
                    <Form.Row>
                      <Form.Group as={Col} md="6" controlId="description">
                        <Form.Label>Description</Form.Label>
                        <Form.Control type="text" placeholder="" size="lg" value={this.state.description} onChange={this.handleChange}/>
                      </Form.Group>
                    </Form.Row>
                    <Form.Row>
                      <Form.Group as={Col} md="6" controlId="submit">
                        <Button
                          variant="outline-dark"
                          type="cancel"
                          onClick={this.handleClose}
                        >
                          Cancel
                        </Button>
                        <Button
                          variant="outline-dark"
                          type="submit"
                          onClick={this.handleSubmit}
                        >
                          ??? ???????
                        </Button>
                      </Form.Group>
                    </Form.Row>
                  </Container>
                </Form>

                <Modal.Footer />
              </Modal>

              <Button variant="outline-dark" onClick={this.handleShow}>
                {" "}
                <FontAwesomeIcon icon={faPlus} /> ??? ???????
              </Button>
            </Nav.Item>
            <Nav.Item className="justify-content-end">
              <Nav.Link eventKey="disabled" disabled>
                Report Total: ${this.props.total}
              </Nav.Link>
            </Nav.Item>
          </Nav>
          <hr />
        </div>
      </div>
    );
  }

预计,如果所有内容均已成功验证,则程序将继续正常运行。相反,它崩溃并重新加载了整个网页。我试图取出handleSubmit底部的this.props.add,但是得到了相同的结果-崩溃。注意以某种方式,add被运行两次并生成两个组件可能会很有用。但是,我正在考虑一个单独的错误。

1 个答案:

答案 0 :(得分:0)

尝试将event.preventDefault();event.stopPropagation();移动到if语句之外,例如:

 handleSubmit(event) {
    event.preventDefault();
    event.stopPropagation();
    const form = event.currentTarget;
      if (form.checkValidity() === false) {
        console.log("Failed");
      }
        this.setState({validated: true})
        this.props.add(this.state.pdf,this.state.store, this.state.date, this.state.price, this.state.category,this.state.description );

  }