【发布时间】:2021-07-28 13:40:53
【问题描述】:
我试图在验证表单时显示警报。问题是当验证期间发生错误时,我想显示在父组件中定义的警报 - 这会导致提交/重新加载表单,并且 e.preventDefault() 不足以停止提交。我发现 props 传递的 setState 会导致提交,但我不知道如何设置状态并阻止提交。这个案子我能做什么?我想 React Router Dom 有一些共同点,因为这种机制在不使用路由的情况下工作。这是一些代码:
App.js(父组件)
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(子组件)
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;
【问题讨论】:
-
this causes submitting form但它 (onShowAlert) 已经在提交处理程序中。所以提交处理程序按预期工作。我认为这里的问题是您的表单与路由器一起被重新渲染,因为App中的状态发生了变化。