使用状态数据反应更新道具
React updating props with state data
我有一个组件正在处理用户提交的联系论坛。我想获取用户提交的状态并将其添加到我的道具数据中。现在一切正常,但是 handleSubmit,我不确定如何获取状态并将其传递给我的 this.data.props 以更新数据以包含新对象。
我的数据是一个对象数组。状态接受用户输入并自行更新。接下来我想获取状态对象并将其添加到我的 props.data 中,然后将其显示在屏幕上。
编辑:更新了最新代码
import React, { Component, PropTypes } from 'react';
const testData = [
{
name: 'Joe',
email: 'joemail'
},
{
name: 'Bill',
email: 'billmail'
},
{
name: 'Dude',
email: 'dudemail'
}
]
class FormContact extends Component {
constructor(props) {
super(props)
this.state = {
formValues: {
name: '',
email: ''
}
}
}
handleChange(event) {
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("NEW FORM VALUES " + this.state.formValues.name + " " + this.state.formValues.email);
const {name, email} = this.state.formValues
this.props.addContact({name, email});
}
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>
)
}
}
FormContact.PropTypes = {
data: PropTypes.arrayOf(
PropTypes.object
)
}
FormContact.defaultProps = {
data: testData
}
class Contact extends Component {
constructor(props) {
super(props)
this.state = {
data: testData
}
}
addContact(contact) {
this.setState({data: this.state.data.concat(contact)});
}
render() {
const renObjData = this.props.data.map( (anObjectMapped, index) => {
return (<p key={index}>
Name: {anObjectMapped.name} < br/>
Email: {anObjectMapped.email} <br /></p>
)
});
return (
<div>
<h1>CONTACT PAGE</h1>
<FormContact data={this.state.data} addContact={this.addContact.bind(this)} />
{renObjData}
</div>
)
}
}
Contact.PropTypes = {
data: PropTypes.arrayOf(
PropTypes.object
)
}
Contact.defaultProps = {
data: testData
}
export default Contact;
您在这里看到的是有一个父容器,它作为 props 传递给表单组件 data
。您已经有了 Contact
组件,因此您可以让它保存数据状态。
它是如何工作的,你会在名为 addContact
的联系人组件上编写一个函数,它将一个联系人作为参数,然后使用新联系人设置自己的状态 IE 将其连接到自己的状态数据数组通过设置状态。
class Contact extends React.Component {
constructor() {
super();
this.state = {
data: testData
}
}
addContact = (contact) => {
this.setState({data: this.state.data.concat(contact)});
};
render() {
const contacts = _.map(this.state.data, (value, index) => {
return <li key={index + value}> {value.email} {value.name} </li>
})
return (
<div>
<h1>CONTACT PAGE</h1>
<FormContact data={this.state.data} addContact={this.addContact} />
<h3> Contacts</h3>
<ul>{contacts} </ul>
</div>
)
}
}
然后在你的 handleSubmit 函数中你所要做的就是添加
handleSubmit(event) {
event.preventDefault();
const {name, email} = this.state.formValues
this.props.addContact({name, email})
}
这会将其推送到父组件中的数据数组中,然后一旦父组件更新,它将把它作为 props 传递给表单组件。
这是一个代码笔,显示了所有这些操作。 http://codepen.io/finalfreq/pen/VKPXoN
更新:另外在联系人中添加了如何显示数据,您可以轻松地将 lodash _.map
替换为 this.state.data.map(function(value, index)
我有一个组件正在处理用户提交的联系论坛。我想获取用户提交的状态并将其添加到我的道具数据中。现在一切正常,但是 handleSubmit,我不确定如何获取状态并将其传递给我的 this.data.props 以更新数据以包含新对象。
我的数据是一个对象数组。状态接受用户输入并自行更新。接下来我想获取状态对象并将其添加到我的 props.data 中,然后将其显示在屏幕上。
编辑:更新了最新代码
import React, { Component, PropTypes } from 'react';
const testData = [
{
name: 'Joe',
email: 'joemail'
},
{
name: 'Bill',
email: 'billmail'
},
{
name: 'Dude',
email: 'dudemail'
}
]
class FormContact extends Component {
constructor(props) {
super(props)
this.state = {
formValues: {
name: '',
email: ''
}
}
}
handleChange(event) {
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("NEW FORM VALUES " + this.state.formValues.name + " " + this.state.formValues.email);
const {name, email} = this.state.formValues
this.props.addContact({name, email});
}
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>
)
}
}
FormContact.PropTypes = {
data: PropTypes.arrayOf(
PropTypes.object
)
}
FormContact.defaultProps = {
data: testData
}
class Contact extends Component {
constructor(props) {
super(props)
this.state = {
data: testData
}
}
addContact(contact) {
this.setState({data: this.state.data.concat(contact)});
}
render() {
const renObjData = this.props.data.map( (anObjectMapped, index) => {
return (<p key={index}>
Name: {anObjectMapped.name} < br/>
Email: {anObjectMapped.email} <br /></p>
)
});
return (
<div>
<h1>CONTACT PAGE</h1>
<FormContact data={this.state.data} addContact={this.addContact.bind(this)} />
{renObjData}
</div>
)
}
}
Contact.PropTypes = {
data: PropTypes.arrayOf(
PropTypes.object
)
}
Contact.defaultProps = {
data: testData
}
export default Contact;
您在这里看到的是有一个父容器,它作为 props 传递给表单组件 data
。您已经有了 Contact
组件,因此您可以让它保存数据状态。
它是如何工作的,你会在名为 addContact
的联系人组件上编写一个函数,它将一个联系人作为参数,然后使用新联系人设置自己的状态 IE 将其连接到自己的状态数据数组通过设置状态。
class Contact extends React.Component {
constructor() {
super();
this.state = {
data: testData
}
}
addContact = (contact) => {
this.setState({data: this.state.data.concat(contact)});
};
render() {
const contacts = _.map(this.state.data, (value, index) => {
return <li key={index + value}> {value.email} {value.name} </li>
})
return (
<div>
<h1>CONTACT PAGE</h1>
<FormContact data={this.state.data} addContact={this.addContact} />
<h3> Contacts</h3>
<ul>{contacts} </ul>
</div>
)
}
}
然后在你的 handleSubmit 函数中你所要做的就是添加
handleSubmit(event) {
event.preventDefault();
const {name, email} = this.state.formValues
this.props.addContact({name, email})
}
这会将其推送到父组件中的数据数组中,然后一旦父组件更新,它将把它作为 props 传递给表单组件。
这是一个代码笔,显示了所有这些操作。 http://codepen.io/finalfreq/pen/VKPXoN
更新:另外在联系人中添加了如何显示数据,您可以轻松地将 lodash _.map
替换为 this.state.data.map(function(value, index)