javascript - 为什么我在使用基于我的代码的反应时收到此错误?
问题描述
错误:
超过最大更新深度。当组件在 componentWillUpdate 或 componentDidUpdate 中重复调用 setState 时,可能会发生这种情况。React 限制了嵌套更新的数量以防止无限循环。
我的代码在哪里获得无限循环?
我正在尝试使用 react、reactstrap 验证表单。
import React, { Component } from "react";
import { Breadcrumb, BreadcrumbItem, Button, Form, FormGroup, Label, Input, Col, Row, FormFeedback } from "reactstrap";
import { Link } from "react-router-dom";
class Contact extends Component {
constructor(props) {
super(props);
this.state = {
firstname: "",
lastname: "",
telnum: "",
email: "",
agree: false,
contactType: "Tel.",
message: "",
touched: {
firstname: false,
lastname: false,
telnum: false,
email: false,
},
};
this.handleSubmit = this.handleSubmit.bind(this);
this.handleInputChange = this.handleInputChange.bind(this);
this.handleBlur = this.handleBlur(this);
}
//hanldeBlur function is declared
handleBlur = (field) => (evt) => {
this.setState({
touched: { ...this.state.touched, [field]: true },
});
};
validate(firstname, lastname, telnum, email) {
const errors = {
firstname: "",
lastname: "",
telnum: "",
email: "",
};
if (this.state.touched.firstname && firstname.length < 3) errors.firstname = "First Name should be >= 3 characters";
else if (this.state.touched.firstname && firstname.length > 3) errors.firstname = "First Name should be <= 10 characters";
if (this.state.touched.lastname && lastname.length < 3) errors.lastname = "Last Name should be >= 3 characters";
else if (this.state.touched.lastname && lastname.length > 3) errors.lastname = "Last Name should be <= 10 characters";
const reg = /^\d+$/;
if (this.state.touched.telnum && !reg.test(telnum)) errors.telnum = "Tel. Number shoould contains only numbers";
if (this.state.touched.email && email.split("").filter((x) => x === "@").length !== 1) errors.email = "Email should contain @";
return errors;
}
handleInputChange(event) {
const target = event.target;
const value = target.type === "checkbox" ? target.checked : target.value;
const name = target.name;
this.setState({
[name]: value,
});
}
handleSubmit(event) {
console.log("Current state is: " + JSON.stringify(this.state));
alert("Current state is: " + JSON.stringify(this.state));
event.preventDefault();
}
render() {
const errors = this.validate(this.state.firstname, this.state.lastname, this.state.telnum, this.state.email);
return (
<div>
<div className="container">
<div className="row">
<Breadcrumb>
<BreadcrumbItem>
<Link to="/home">Home</Link>
</BreadcrumbItem>
<BreadcrumbItem active>Contact Us</BreadcrumbItem>
</Breadcrumb>
<div className="col-12">
<h3>Contact Us</h3>
<hr />
</div>
</div>
<div className="row row-content">
<div className="col-12">
<h3>Location Information</h3>
</div>
<div className="col-12 col-sm-4 offset-sm-1">
<h5>Our Address</h5>
<address>
121, Clear Water Bay Road
<br />
Clear Water Bay, Kowloon
<br />
HONG KONG
<br />
<i className="fa fa-phone"></i>: +852 1234 5678
<br />
<i className="fa fa-fax"></i>: +852 8765 4321
<br />
<i className="fa fa-envelope"></i>: <a href="mailto:confusion@food.net">confusion@food.net</a>
</address>
</div>
<div className="col-12 col-sm-6 offset-sm-1">
<h5>Map of our Location</h5>
</div>
<div className="col-12 col-sm-11 offset-sm-1">
<div className="btn-group" role="group">
<a role="button" className="btn btn-primary" href="tel:+85212345678">
<i className="fa fa-phone"></i> Call
</a>
<a role="button" className="btn btn-info">
<i className="fa fa-skype"></i> Skype
</a>
<a role="button" className="btn btn-success" href="mailto:confusion@food.net">
<i className="fa fa-envelope-o"></i> Email
</a>
</div>
</div>
</div>
<div className="row">
<div className="col-12">
<h3>Send us Your Feedback</h3>
</div>
<div className="col-12 col-md-9">
<Form onSubmit={this.handleSubmit}>
<FormGroup row>
<Label htmlFor="firstname" md={2}>
First Name
</Label>
<Col md={10}>
<Input
type="text"
id="firstname"
name="firstname"
placeholder="First Name"
value={this.state.firstname}
valid={errors.firstname === ""}
invalid={errors.firstname !== ""}
onBlur={this.handleBlur("firstname")} //hanldeBlur function is called
onChange={this.handleInputChange}
/>
<FormFeedback>{errors.firstname}</FormFeedback>
</Col>
</FormGroup>
<FormGroup row>
<Label htmlFor="lastname" md={2}>
Last Name
</Label>
<Col md={10}>
<Input
type="text"
id="lastname"
name="lastname"
placeholder="Last Name"
value={this.state.lastname}
valid={errors.lastname === ""}
invalid={errors.lastname !== ""}
onBlur={this.handleBlur("lastname")} //hanldeBlur function is called
onChange={this.handleInputChange}
/>
<FormFeedback>{errors.lastname}</FormFeedback>
</Col>
</FormGroup>
<FormGroup row>
<Label htmlFor="telnum" md={2}>
Contact Tel.
</Label>
<Col md={10}>
<Input
type="tel"
id="telnum"
name="telnum"
placeholder="Tel. Number"
value={this.state.telnum}
valid={errors.telnum === ""}
invalid={errors.telnum !== ""}
onBlur={this.handleBlur("telnum")} //hanldeBlur function is called
onChange={this.handleInputChange}
/>
<FormFeedback>{errors.telnum}</FormFeedback>
</Col>
</FormGroup>
<FormGroup row>
<Label htmlFor="email" md={2}>
Email
</Label>
<Col md={10}>
<Input
type="email"
id="email"
name="email"
placeholder="Email"
value={this.state.email}
valid={errors.email === ""}
invalid={errors.email !== ""}
onBlur={this.handleBlur("email")} //hanldeBlur function is called
onChange={this.handleInputChange}
/>
<FormFeedback>{errors.email}</FormFeedback>
</Col>
</FormGroup>
<FormGroup row>
<Col md={{ size: 6, offset: 2 }}>
<FormGroup check>
<Label check>
<Input type="checkbox" name="agree" checked={this.state.agree} onChange={this.handleInputChange}></Input>{" "}
<strong>May We Contact You?</strong>
</Label>
</FormGroup>
</Col>
<Col md={{ size: 3, offset: 1 }}>
<Input type="select" name="contactType" value={this.state.contactType} onChange={this.handleInputChange}>
<option>Tel.</option>
<option>Email</option>
</Input>
</Col>
</FormGroup>
<FormGroup row>
<Label htmlFor="message" md={2}>
Your Feedback
</Label>
<Col md={10}>
<Input type="textarea" id="message" name="message" rows="12" value={this.state.message} onChange={this.handleInputChange}></Input>
</Col>
</FormGroup>
<FormGroup row>
<Col md={{ size: 10, offset: 2 }}>
<Button type="submit" color="primary">
Send Feedback
</Button>
</Col>
</FormGroup>
</Form>
</div>
</div>
</div>
</div>
);
}
}
export default Contact;
解决方案
我已经修改了一些代码并创建了一个沙箱,其中不存在问题。
最显着的变化将是handleBlur
功能。您应该始终使用功能状态更新来访问旧状态。
handleBlur = (field) => (evt) => {
this.setState(({ touched }) => ({
touched: { ...touched, [field]: true },
}));
};
推荐阅读
- javascript - 一年的第一周属于十二月吗?
- c# - 如何通过正则表达式找到格式号?
- excel - 如何从命令提示符触发 Visual Studio 宏?
- javascript - React Native,如果单击主类别,则从 JSON 显示子类别列表
- php - 为什么 curl extension_loaded 显示 false 而 curl 存在
- cadence-workflow - Cadence:更改工作流 cron 计划的最佳实践是什么?
- android - 如何通过 Kotlin 在 Android 中使用套接字
- python - 调用 tf.FixedLenSequenceFeature 时无法分配 default_value
- php - 如何在 Laravel 中对深层关系进行搜索?
- python - 如何从 pandas df 中查找和删除相关列