I'm trying to show alert when validating form. The problem is when error occures during validation I want to show alert defined in parent component - this causes submiting/reloading form and e.preventDefault() is not enough to stop from submiting. I've figured out that setState passed by props causes submission but I don't know how to setState and prevent from submission. What can I do with this case? I suppose that React Router Dom has something in common because this mechanism works without using routes. Here's some code:
App.js (parent component)
import React, { Fragment, Component } from "react";
import { BrowserRouter as Router, Switch, Route } from "react-router-dom";
import { Alert } from "react-bootstrap";
import Login from "./components/pages/Login";
import Home from "./components/pages/Home";
class App extends Component {
state = {
alert: "",
};
render() {
const { alert } = this.state;
return (
<Fragment>
<Router>
{alert && <Alert variant="danger">{alert}</Alert>}
<Switch>
<Route exact path="/" component={() => <Home />} />
<Route exact path="/login" component={() => <Login onShowAlert={(alert) => this.setState({ alert: alert })} />} />
</Switch>
</Router>
</Fragment>
);
}
}
export default App;
Login.js (child component)
import React, { Component, Fragment } from "react";
import { Form, Button } from "react-bootstrap";
class Login extends Component {
state = {
login: "",
password: "",
};
handleCheckValidation = (e) => {
e.preventDefault();
const { onShowAlert } = this.props;
onShowAlert("Show some error message"); //this causes submitting form
};
render() {
const { login, password } = this.state;
return (
<Fragment>
<Form onSubmit={this.handleCheckValidation} autoComplete="off">
<Form.Control type="email" name="login" value={login} onChange={(e) => this.setState({ [e.target.name]: e.target.value })}></Form.Control>
<Form.Control type="password" name="password" value={password} onChange={(e) => this.setState({ [e.target.name]: e.target.value })}></Form.Control>
<Button type="submit" variant="primary">Sign in</Button>
</Form>
</Fragment>
);
}
}
export default Login;