Реагировать на размещение размещения

Я просмотрел несколько источников для использования функций onSubmit в React, и они всегда помещают триггеры onSubmit в качестве атрибута формы, например

import React, { Component } from "react";

import { connect } from "react-redux";
import PropTypes from "prop-types";
import { register } from "../../../actions/auth/auth.action";

import { Container } from "react-bootstrap";
import {
    Button,
    Form,
    Label,
    Input,
  } from "reactstrap";

class Register extends Component {
    state = {
        fname: "",
        lname: "",
        email: "",
        password: ""
    };

    static propTypes = {
        register: PropTypes.func.isRequired
    };

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

    handleSubmit = e => {
        e.preventDefault();

        const { fname, lname, email, password } = this.state;

        const newUser = {
            name: {
                first: fname,
                last: lname
            },
            email: {
                address: email
            },
            password
        };

        // Attempt to register user
        this.props.register(newUser);
    };

    render() {
        return(
                        <Form onSubmit={this.handleSubmit}>
                                <Label for="fname">First Name</Label>
                                <Input
                                    type="text"
                                    name="fname"
                                    id="fname"
                                    placeholder="Enter first name"
                                    className="mb-3"
                                    onChange={this.handleChange}
                                />

                                <Label for="lname">Last Name</Label>
                                <Input
                                    type="text"
                                    name="lname"
                                    id="lname"
                                    placeholder="Enter last name"
                                    className="mb-3"
                                    onChange={this.handleChange}
                                />

                                <Label for="email">Email</Label>
                                <Input
                                    type="email"
                                    name="email"
                                    id="email"
                                    placeholder="Enter email"
                                    className="mb-3"
                                    onChange={this.handleChange}
                                />

                                <Label for="password">Password</Label>
                                <Input
                                    type="password"
                                    name="password"
                                    id="password"
                                    placeholder="Enter password"
                                    className= "mb-3"
                                    onChange={this.handleChange}
                                />
                                <Button color="primary" style={{ marginTop: "2rem" }} block>
                                    Register
                                </Button>
                        </Form>
        );
    };
};

const mapStateToProps = state => ({
    error: state.error   
});

export default connect(
    mapStateToProps,
    { register }
)
(Register);

Однако, когда я пытаюсь это сделать, нет возможности вызвать функцию. (Т.е. как кнопка «знает», когда вызывать функцию onSubmit, когда вызов является атрибутом формы). Я даже попытался добавить к кнопке атрибут type = "submit", но это тоже не сработало.


person rantao    schedule 30.10.2019    source источник
comment
Похоже на нестандартный Button компонент. Какую библиотеку вы используете?   -  person Nick    schedule 30.10.2019
comment
Извините за двусмысленность - я добавил импортированные библиотеки   -  person rantao    schedule 30.10.2019
comment
Хм, похоже, что компонент reactstrap Form не имеет свойства onSubmit. Вы пробовали использовать onClick для кнопки Register?   -  person Nick    schedule 30.10.2019
comment
Да, похоже, это тоже не работает.   -  person rantao    schedule 30.10.2019
comment
Полный код может помочь выяснить проблему   -  person zmag    schedule 30.10.2019
comment
Я его обновил.   -  person rantao    schedule 30.10.2019


Ответы (2)


Просто объявите type = "submit" в вашей кнопке <button type="submit">send stuff</button> Атрибут type - это то, что ожидает форма onSubmit :), удалите e.preventDefault из вашего handleSubmit метода и попробуйте снова

person Fábio BC Souza    schedule 30.10.2019
comment
Хотя это было интуитивно понятно, добавление типа отправки к кнопке, похоже, не сработало. - person rantao; 30.10.2019
comment
@ R.Antao, onSubmit должен быть внутри тега формы ... <form onSubmit={this.handleSubmit}> - person Fábio BC Souza; 30.10.2019
comment
... и кнопка с типом submit :) - person Fábio BC Souza; 30.10.2019
comment
Это то, что у меня было изначально ... Я думал, что это было бы решением, но это не сработало - person rantao; 30.10.2019
comment
Когда у меня есть onSubmit в теге Form, вообще ничего не происходит (даже при установке Button type = submit), а когда у меня есть onSubmit в теге Button, форма очищается, как если бы данные были отправлены, но я не получаю лог в консоли. - person rantao; 30.10.2019
comment
@ R.Antao, удали e.preventDefault из своего handleSubmit метода и повторите попытку - person Fábio BC Souza; 30.10.2019
comment
Добро пожаловать :), спасибо за мои комментарии, это очень помогает :) - person Fábio BC Souza; 30.10.2019

Функция будет вызываться при возникновении события отправки.

В коде ниже показаны действия, запускающие событие отправки.

class FormComponent extends React.Component {

  handleSubmit = e => {
    e.preventDefault();
    console.log('submitted');
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <input type="submit" /><br />
        <button>Button with no attribute</button><br />
        <button type="submit">submit typed Button</button><br />
        <button type="button">button typed Button (no submit)</button><br />
        <input type="text" value="Press enter to submit" />
      </form>
    );
  }
}

ReactDOM.render(
  <FormComponent />,
  document.getElementById("react")
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<div id="react"></div>

person zmag    schedule 30.10.2019
comment
Я вижу, что ваш код работал, как я и ожидал. Может быть, дело в том, что я использую компоненты формы библиотеки reactstrap, поэтому реквизиты не передаются должным образом? - person rantao; 30.10.2019