在表单提交的两个输入字段中反应更新状态
React updating state in two input fields from form submission
我正在尝试使用 React 制作一个简单的联系表单。最终我将从状态收集的数据发送到数据库,但现在我正在尝试将其发送到控制台记录正确的值。
现在,email 字段覆盖了 name 字段,当我控制台记录这两种状态时,name 显示出来,email 是未定义的。这是我的 React 组件
import React, { Component, PropTypes } from 'react';
import ContactData from '../data/ContactData.js';
class FormContact extends Component {
constructor(props) {
super(props)
this.state = {
name: '',
email: '',
textArea: ''
}
}
handleChange(event) {
event.preventDefault();
this.setState({
name: event.target.value,
email: event.target.email
})
}
handleSubmit(event) {
event.preventDefault();
console.log(this.state.name + ' ' + this.state.email);
}
render() {
return (
<form onSubmit={this.handleSubmit.bind(this)}>
<label> Name:
<input type="text" placeholder="Name" value={this.state.name} onChange={this.handleChange.bind(this)} />
</label><br />
<label> Email:
<input type="text" placeholder="Email" value={this.state.email} onChange={this.handleChange.bind(this)}/>
</label><br />
<input className="btn btn-primary" type="submit" value="Submit" />
</form>
)
}
}
FormContact.PropTypes = {
subName: PropTypes.string,
subEmail: PropTypes.string
}
FormContact.defaultProps = {
subName: 'Sam',
subEmail: ''
}
class Contact extends Component {
render() {
return (
<div>
<h1>CONTACT PAGE</h1>
<FormContact />
</div>
)
}
}
export default Contact;
事件元素上不存在对 event.target.email
的引用。对于电子邮件和姓名,来自内联事件处理程序的文本输入值将为 event.target.value
。快速解决方案是为每个输入创建一个单独的处理程序:
handleChange<b>Name</b>(event) {
event.preventDefault();
this.setState({ name: <b><i>event.target.value</i></b> }); //<-- both use the same reference
} // to get the contextual value
handleChange<b>Email</b>(event) { // from the inputs v
event.preventDefault(); // |
this.setState({ email: <b><i>event.target.value</i></b> }); //<--------------------
}
如果我明白你想要什么,你可以这样做:
在您所在的州为表单值添加一个空对象
formValues: {}
将名称属性添加到您的字段
<input name="name" .... />
<input name="email" .... />
然后根据该名称在 handleChange 函数中更新您的状态
let formValues = this.state.formValues;
let name = event.target.name; // Field name
let value = event.target.value; // Field value
formValues[name] = value;
this.setState({formValues})
如果值更深一层,您可以使用
value={this.state.formValues["name"]}
而不是 value={this.state.name}
- 其中名称是您输入字段的名称属性的值
因此,所有内容应该如下所示:
class Test extends React.Component {
constructor(props) {
super(props)
this.state = {
formValues: {}
}
}
handleChange(event) {
event.preventDefault();
let formValues = this.state.formValues;
let name = event.target.name;
let value = event.target.value;
formValues[name] = value;
this.setState({formValues})
}
handleSubmit(event) {
event.preventDefault();
console.log(this.state.formValues);
}
render(){
return (
<form onSubmit={this.handleSubmit.bind(this)}>
<label> Name:
<input type="text" name="name" placeholder="Name" value={this.state.formValues["name"]} onChange={this.handleChange.bind(this)} />
</label><br />
<label> Email:
<input type="text" name="email" placeholder="Email" value={this.state.formValues["email"]} onChange={this.handleChange.bind(this)}/>
</label><br />
<input className="btn btn-primary" type="submit" value="Submit" />
</form>
)
}
}
React.render(<Test />, document.getElementById('container'));
希望这对您有所帮助。
我正在尝试使用 React 制作一个简单的联系表单。最终我将从状态收集的数据发送到数据库,但现在我正在尝试将其发送到控制台记录正确的值。
现在,email 字段覆盖了 name 字段,当我控制台记录这两种状态时,name 显示出来,email 是未定义的。这是我的 React 组件
import React, { Component, PropTypes } from 'react';
import ContactData from '../data/ContactData.js';
class FormContact extends Component {
constructor(props) {
super(props)
this.state = {
name: '',
email: '',
textArea: ''
}
}
handleChange(event) {
event.preventDefault();
this.setState({
name: event.target.value,
email: event.target.email
})
}
handleSubmit(event) {
event.preventDefault();
console.log(this.state.name + ' ' + this.state.email);
}
render() {
return (
<form onSubmit={this.handleSubmit.bind(this)}>
<label> Name:
<input type="text" placeholder="Name" value={this.state.name} onChange={this.handleChange.bind(this)} />
</label><br />
<label> Email:
<input type="text" placeholder="Email" value={this.state.email} onChange={this.handleChange.bind(this)}/>
</label><br />
<input className="btn btn-primary" type="submit" value="Submit" />
</form>
)
}
}
FormContact.PropTypes = {
subName: PropTypes.string,
subEmail: PropTypes.string
}
FormContact.defaultProps = {
subName: 'Sam',
subEmail: ''
}
class Contact extends Component {
render() {
return (
<div>
<h1>CONTACT PAGE</h1>
<FormContact />
</div>
)
}
}
export default Contact;
事件元素上不存在对 event.target.email
的引用。对于电子邮件和姓名,来自内联事件处理程序的文本输入值将为 event.target.value
。快速解决方案是为每个输入创建一个单独的处理程序:
handleChange<b>Name</b>(event) {
event.preventDefault();
this.setState({ name: <b><i>event.target.value</i></b> }); //<-- both use the same reference
} // to get the contextual value
handleChange<b>Email</b>(event) { // from the inputs v
event.preventDefault(); // |
this.setState({ email: <b><i>event.target.value</i></b> }); //<--------------------
}
如果我明白你想要什么,你可以这样做:
在您所在的州为表单值添加一个空对象
formValues: {}
将名称属性添加到您的字段
<input name="name" .... />
<input name="email" .... />
然后根据该名称在 handleChange 函数中更新您的状态
let formValues = this.state.formValues; let name = event.target.name; // Field name let value = event.target.value; // Field value formValues[name] = value; this.setState({formValues})
如果值更深一层,您可以使用
value={this.state.formValues["name"]}
而不是value={this.state.name}
- 其中名称是您输入字段的名称属性的值
因此,所有内容应该如下所示:
class Test extends React.Component {
constructor(props) {
super(props)
this.state = {
formValues: {}
}
}
handleChange(event) {
event.preventDefault();
let formValues = this.state.formValues;
let name = event.target.name;
let value = event.target.value;
formValues[name] = value;
this.setState({formValues})
}
handleSubmit(event) {
event.preventDefault();
console.log(this.state.formValues);
}
render(){
return (
<form onSubmit={this.handleSubmit.bind(this)}>
<label> Name:
<input type="text" name="name" placeholder="Name" value={this.state.formValues["name"]} onChange={this.handleChange.bind(this)} />
</label><br />
<label> Email:
<input type="text" name="email" placeholder="Email" value={this.state.formValues["email"]} onChange={this.handleChange.bind(this)}/>
</label><br />
<input className="btn btn-primary" type="submit" value="Submit" />
</form>
)
}
}
React.render(<Test />, document.getElementById('container'));
希望这对您有所帮助。