所以我刚刚开始使用React,并且无法在子组件中收集输入的输入值。基本上,我正在为我正在制作的大型表单创建不同的组件,然后在包含组件中,我想收集我正在调用数据的对象中的子项的所有输入值,然后将收集的输入发送到POST AJAX请求(您可以在我制作的最后一个组件中看到一个示例)。当我在组件内部时,我可以很容易地提取值,但是从父组件中拉出它我还没有想到。
提前致谢。现在就通过React解决这些问题所以关于如何更好地构建这个问题的任何建议,我都是耳朵!
以下是我的组件:
第一部分
var StepOne = React.createClass({
getInitialState: function() {
return {title: '', address: '', location: ''};
},
titleChange: function(e) {
this.setState({title: e.target.value});
},
addressChange: function(e) {
this.setState({address: e.target.value});
},
locationChange: function(e) {
this.setState({location: e.target.value});
},
render: function() {
return (
<div className="stepOne">
<ul>
<li>
<label>Title</label>
<input type="text" value={this.state.title} onChange={this.titleChange} />
</li>
<li>
<label>Address</label>
<input type="text" value={this.state.address} onChange={this.addressChange} />
</li>
<li>
<label>Location</label>
<input id="location" type="text" value={this.state.location} onChange={this.locationChange} />
</li>
</ul>
</div>
);
}, // render
}); // end of component
第二部分
var StepTwo = React.createClass({
getInitialState: function() {
return {name: '', quantity: '', price: ''}
},
nameChange: function(e) {
this.setState({name: e.target.value});
},
quantityChange: function(e) {
this.setState({quantity: e.target.value});
},
priceChange: function(e) {
this.setState({price: e.target.value});
},
render: function() {
return (
<div>
<div className="name-section">
<div className="add">
<ul>
<li>
<label>Ticket Name</label>
<input id="name" type="text" value={this.state.ticket_name} onChange={this.nameChange} />
</li>
<li>
<label>Quantity Available</label>
<input id="quantity" type="number" value={this.state.quantity} onChange={this.quantityChange} />
</li>
<li>
<label>Price</label>
<input id="price" type="number" value={this.state.price} onChange={this.priceChange} />
</li>
</ul>
</div>
</div>
</div>
);
}
});
收集数据和提交ajax请求的最终组件
EventCreation = React.createClass({
getInitialState: function(){
return {}
},
submit: function (e){
var self
e.preventDefault()
self = this
var data = {
// I want to be able to collect the values into this object then send it in the ajax request. I thought this sort of thing would work below:
title: this.state.title,
}
// Submit form via jQuery/AJAX
$.ajax({
type: 'POST',
url: '/some/url',
data: data
})
.done(function(data) {
self.clearForm()
})
.fail(function(jqXhr) {
console.log('failed to register');
});
},
render: function() {
return(
<form>
<StepOne />
<StepTwo />
// submit button here
</form>
);
}
});
答案 0 :(得分:7)
在子组件中定义返回所需数据的方法,然后在渲染子项时在父组件中定义方法,定义引用,以便稍后当您想要检索所需的数据时,可以调用这些方法孩子们。
StepOne = React.createClass({
getData: function() {
return this.state;
}
});
StepTwo = React.createClass({
getData: function() {
return this.state;
}
});
EventCreation = React.createClass({
submit: function() {
var data = Object.assign(
{},
this._stepOne.getData(),
this._stepTwo.getData()
);
// ... do AJAX
},
render: function() {
return (
<StepOne ref={(ref) => this._stepOne = ref} />
<StepTwo ref={(ref) => this._stepTwo = ref} />
);
}
});
答案 1 :(得分:5)
一般来说,您需要将一个函数从父级传递给子级作为道具。当孩子的数据发生变化时,他们会将该功能称为回调。
这有一个很大的好处,就是让你的父组件跟踪你的应用程序中的所有状态,并将状态片作为道具传递给它的子节点,而不是让每个组件跟踪它自己的内部状态。 (That's the React approach to data flow。)
您的组件可能如下所示:
var StepOne = React.createClass({
handleOnChange: function(e){
this.props.handleChange(e.target.name, e.target.value);
},
render: function() {
return (
<div className="stepOne">
<ul>
<li>
<label>Title</label>
<input type="text" name="title" value={this.props.title} onChange={this.handleChange} />
</li>
...
</ul>
</div>
);
}, // render
}); // end of component
EventCreation = React.createClass({
getInitialState: function(){
return {}
},
handleChange: function(name, value){
var tmp = {};
tmp[name] = value;
this.setState(tmp);
},
submit: function (e){
var self
e.preventDefault()
self = this
var data = {
// I want to be able to collect the values into this object then send it in the ajax request. I thought this sort of thing would work below:
title: this.state.title,
}
// Submit form via jQuery/AJAX
$.ajax({
type: 'POST',
url: '/some/url',
data: data
})
.done(function(data) {
self.clearForm()
})
.fail(function(jqXhr) {
console.log('failed to register');
});
},
render: function() {
return(
<form>
<StepOne handleChange={this.handleChange.bind(this)} title={this.state.title} .../>
<StepTwo handleChange={this.handleChange.bind(this)} ... />
// submit button here
</form>
);
}
});
答案 2 :(得分:1)
首先,您需要设置一些references。它将允许您轻松地访问一些DOM元素。 例如:
<input id="name" type="text" value={this.state.ticket_name} onChange={this.nameChange} ref="stepOneName"/>
然后,在您的submit
方法中,您可以像这样取回它:
var data = {
name: this.refs.stepOneName.value
}
编辑1:
您还必须在组件中添加ref
:
render:function(){ 返回( //在这里提交按钮 ); } 然后,访问您的元素:
var data = {
name: this.refs.steOneRef.refs.stepOneName.value
}
I JSFiddled your code蚂蚁对我来说似乎没问题。
答案 3 :(得分:0)
这是一个更松散耦合的解决方案。这取决于您为每个元素设置id
。基本上你正在做的是调用将获取和设置数据的父组件onChange
函数。
var StepOne = React.createClass({
getInitialState: function() {
return {title: '', address: '', location: ''};
},
_onChange(e) {
// set your state if needed
// call the parent function
this.props.onChange(
e.target.id,
e.target.value
)
},
render: function() {
return (
<div className="stepOne">
<ul>
<li>
<label>Title</label>
<input id="title" type="text" value={this.state.title} onChange={this._onChange.bind(this)} />
</li>
<li>
<label>Address</label>
<input id="address" type="text" value={this.state.address} onChange={this._onChange.bind(this)} />
</li>
<li>
<label>Location</label>
<input id="location" type="text" value={this.state.location} onChange={this._onChange.bind(this)} />
</li>
</ul>
</div>
);
}, // render
}); // end of component
var StepTwo = React.createClass({
getInitialState: function() {
return {name: '', quantity: '', price: ''}
},
_onChange(e) {
// set your state if needed
// call the parent function
this.props.onChange(
e.target.id,
e.target.value
)
},
render: function() {
return (
<div>
<div className="name-section">
<div className="add">
<ul>
<li>
<label>Ticket Name</label>
<input id="name" type="text" value={this.state.ticket_name} onChange={this._onChange.bind(this)} />
</li>
<li>
<label>Quantity Available</label>
<input id="quantity" type="number" value={this.state.quantity} onChange={this._onChange.bind(this)} />
</li>
<li>
<label>Price</label>
<input id="price" type="number" value={this.state.price} onChange={this._onChange.bind(this)} />
</li>
</ul>
</div>
</div>
</div>
);
}
EventCreation = React.createClass({
getInitialState: function(){
return {}
},
_onChange(id, value) {
this.formData[id] = value;
},
submit: function (e){
var self
e.preventDefault()
self = this
// Submit form via jQuery/AJAX
$.ajax({
type: 'POST',
url: '/some/url',
data: this.formData
})
.done(function(data) {
self.clearForm()
})
.fail(function(jqXhr) {
console.log('failed to register');
});
},
render: function() {
return(
<form>
<StepOne onChange={this.onChange.bind(this)}/>
<StepTwo onChange={this.onChange.bind(this)}/>
// submit button here
</form>
);
}
});